调整 JPanel 的大小以准备打印,而无需将其从原始位置移开

2024-01-08

在我的程序中,我经常需要打印各种 JComponent(通常是 JPanel),并且我喜欢它们是整页的。我现在的方法是使用以下代码:

g2d.scale(pf.getImageableWidth()/componentToPrint.getWidth(), pf.getImageableHeight()/componentToPrint.getHeight());

但这经常会拉伸或以其他方式使我想要打印的任何内容变形,而且我更愿意做一些智能调整大小的事情,也许是以下功能版本:

componentToPrint.setSize(pf.ImageableWidth(), pf.ImageableHeight);

或者说将组件添加到新的 JFrame 中,然后设置框架大小(问题是组件不能同时存在于两个位置)。我不在乎调整大小是否会使 GUI 的其余部分看起来很糟糕,只要它可以轻松重置即可。

有什么办法可以做到这一点吗?


我认为您正在寻找的解决方案是构建一个包含所需内容的新 JPanel 并打印副本。如果您使用 CellRendererPane 执行此操作,您可以获得听起来像您正在寻找的精确大小调整行为。

如果您的 JComponent 编写得相当好,那么新建一个新的 JComponent 并将其模型设置为与原始模型相同应该不是问题。

CellRendererPane cellRendererPane = new CellRendererPane();
// It's important to add the cell renderer pane to something
// you can use the same one for all of your exporting if you like and just
// add it to your main frame's content pane - it won't show up anywhere.
add(cellRendererPane);

JPanel printPanel = createCopy(panel);
cellRendererPane.paintComponent(g, printPanel, null, 0, 0, exportDim.width, exportDim.height, true);

这是一个完整的工作示例。 createPanel() 方法应该创建您想要呈现的任何组件。真实的示例应该确保使用相同的模型,而不是为一次性组件重新创建新模型。

public class SCCE {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        final JFrame f = new JFrame("SCCE");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(SCCE.createPanel());

        final CellRendererPane backgroundRenderer = new CellRendererPane();

        // Add the renderer somewhere where it won't be seen
        f.getContentPane().add(backgroundRenderer, BorderLayout.NORTH);
        f.getContentPane().add(createSaveButton(backgroundRenderer), BorderLayout.SOUTH);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    // Create your custom component from whatever model here..
    private static final Component createPanel() {
        DefaultListModel model = new DefaultListModel();
        for (int i = 0; i < 10; i++) {
            model.addElement("Item number " + i);
        }
        return new JList(model);
    }

    private static JButton createSaveButton(final CellRendererPane backgroundRenderer) {
        return new JButton(new AbstractAction("Save image to file") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Dimension d = new Dimension(400, 300);

                BufferedImage img = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = img.createGraphics();
                backgroundRenderer.paintComponent(g, createPanel(), null, 0, 0, d.width, d.height, true);
                g.dispose();

                try {
                    File output = new File("test.png");
                    System.err.println("Saved to " + output.getAbsolutePath());
                    ImageIO.write(img, "png", output);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整 JPanel 的大小以准备打印,而无需将其从原始位置移开 的相关文章

  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • c#:与文件扩展名关联的图标

    在我的应用程序中 我创建扩展名为 mprj 的文件 如何为这种类型的文件分配图标 是否存在合适的 Net 方法 您需要修改注册表项 可以在此处找到如何使用 C 的代码片段 http mel green com 2009 04 c set f
  • 如何管理 std::list 元素作为引用?

    我有以下代码 struct Foo int var1 int var2 friend std ostream operator lt lt std ostream os const Foo s return os lt lt Foo lt
  • 防止 Spring MVC 控制器中的 XSS

    您好 在我的项目 Veracode 中报告了 XSS 问题 CWE ID 80 在我的请求处理程序方法中 RequestMapping value Update mvc public ResponseBody String execute
  • 为什么比较运算符从 C++ 20 的标准库容器中删除?

    我正在浏览参考参数 https en cppreference com w cpp container vector operator cmp看到了vector的比较操作已在 C 20 中删除 并且太空船运算符 lt gt 已被引入 对于许
  • mariadb 服务器:我无法使用“mysql.server stop”停止服务器

    操作系统 10 13 6 几年前我用 homebrew 安装了 mariadb 服务器 但我很少使用它 今天 我尝试使用以下命令启动 mariadb mysql server start 我遇到了很多错误 所以我做了 brew update
  • 初始化参考

    虽然我以为我明白了rvalue and lvalue对于 C 中的语义 我似乎一次又一次地陷入奇怪的例子中 这些例子向我证明我不知道蹲下 然而 有两个非常简单和基本的 我不明白它们是如何工作的 在我编译它们之前 我认为没有一个是可以的 在我
  • 在 shell 脚本中将带引号的参数传递给 C 程序

    我有一个 C 程序 main 它获取以下参数 abc d e f g 由于引用 总共有 4 个参数 我有一个文本文件 每行都有这 4 个参数 我制作了一个 shell 脚本来为每个参数运行 C 程序 bin bash while read
  • Bootstrap 网格拉/推行

    我有一个响应式引导网格 我希望根据设备宽度以不同的顺序显示它 sm 或更低 1 2 3 4 5 6 7 MD 或更高 2 4 6 1 3 5 7
  • Excel宏重复IF和Else

    我目前正在编写一个 Excel VBA 宏脚本 其中将对活动单元格进行简单的 TRUE 或 False 测试 我的问题是 直到列表末尾我才能使其正常工作 它只运行一次并结束程序 我需要这个 VB 脚本来执行 IF ELSE 测试 直到列表底
  • ASM-创建过程[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 设置了阵列A和阵列B 该过程将获取值
  • 如何在 Yocto bitbake 编译步骤中剥离和 objcopy 构建的 .so 文件?

    这个问题源于 我是否需要编辑在 Yocto 中构建 mdns 878 200 35 所需的 patch 文件 https stackoverflow com questions 66400231 do i need to edit the
  • 谷歌怎么能这么快?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 哪些技术和编程决策使 Google 能够如此快速地提供查询服务 每次我搜索某些内容 每天搜索几
  • 使用 Volley 进行令牌认证

    如果我有一个服务器 我可以使用用户名 密码进行身份验证并为后续请求获取身份验证令牌 那么解决此问题的最佳方法是什么 流程应该是这样的 开始请求 如果我们没有身份验证令牌 使用用户名和密码获取它 使用身份验证令牌发出请求 如果请求因令牌过期而
  • 如何杀死一个进程?

    我有两个活动 第一个活动由启动器启动 第二个活动由第一个活动启动 当我杀死process从第一个活动开始 该进程就被终止 但是 当我从第二个活动中杀死它时 系统将立即启动一个新进程和第一个活动 进程的PID改变了 我怎样才能干净利落地完成呢
  • Yii2 URL 映射后缀

    我在 Yii2 中有一些模拟的 URL 映射 urlManager gt enablePrettyUrl gt true showScriptName gt false rules gt pattern gt pages route gt
  • 以 Observables 作为默认值的 Angular 2 Formbuilder

    我对 Angular 2 Form formbuilder 的默认值有疑问 我的默认值是可观察的 我从服务器检索 所以我不能像这样实现它们 export class UserComponent implements OnInit userF
  • Visual Studio 2010 中 Javascript 中的区域/代码崩溃

    是否可以在 Visual Studio 2010 中的 JS 文件中创建代码区域 这个方法 https stackoverflow com questions 1921628 how to implement regions code co
  • 创建流以从Python中的字符串进行迭代

    我想在 Python 中从字符串创建一个流 这样就相当于读取字符串 就像从文本文件中读取字符串一样 就像是 for line in open myfile txt print line 除了 myfile txt 的内容存储在字符串中s 这
  • 在 Rails ActiveRecord 中,连接不适用于命名空间模型中的 has_and_belongs_to_many

    我在命名空间中有两个模型 一个服务和一个讲师 两者之间具有多对多关系 通过 has and belongs to many 定义 class Scheduling Service lt ActiveRecord Base has and b
  • 调整 JPanel 的大小以准备打印,而无需将其从原始位置移开

    在我的程序中 我经常需要打印各种 JComponent 通常是 JPanel 并且我喜欢它们是整页的 我现在的方法是使用以下代码 g2d scale pf getImageableWidth componentToPrint getWidt