java - JScrollPane 和 printAll()

标签 java swing paint

我正在开发一个 JPanel 扩展,该扩展仅用于将其内容渲染到 BufferedImage,然后将其用作在 OpenGL 中渲染的纹理。为此,我使用布局管理器等创建了特殊的 JPanel 扩展,就像构建普通的 Swing GUI 一样。

为了将其渲染为图像,我确保首先调用 doLayout,然后使用 printAll(java.awt.Graphics) 方法来打印它以及添加的组件:

    Graphics2D g = image.createGraphics();
    printAll(g);

Swing 本身(EDT、RepaintManager 等)从不涉及,我只是创建组件(在任何窗口或框架之外)并直接使用 printAll。

这对于大多数“原子”组件(例如按钮、标签、列表)来说工作得非常好,但是我遇到了 JScrollPane 的问题。无论我尝试什么,JScrollPane 永远不会将其视口(viewport)(主视口(viewport)和滚动条)绘制到给定的 Graphics,而只会绘制其边框,甚至在视口(viewport)上手动调用 printAll 也不会产生任何结果。 p>

我附上了两个屏幕截图,显示了由 JList 和 JButton 组成的简单 GUI 的“之前和之后”。在第一个图像中,我使用原始 JList,在第二个图像中,我使用 new JScrollPane(list) 将其包装到 JScrollPane 中。

Using a JList directly Using a JList wrapped in a JScrollPane

我未能在 JScrollPane 代码中找到与绘制视口(viewport)相关的任何魔法。也许 Swing 需要初始化一些东西,但我忘了。有什么方法可以让这些视口(viewport)显示出来吗?

最佳答案

参见Why does the JTable header not appear in the image?有关将组件渲染到图像的一些一般提示。尝试调用该线程代码中提到的 validate()addNotify()doLayout() 的组合。

关于java - JScrollPane 和 printAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553513/

相关文章:

java - 带删除线的文本不保存

java - 获取网络上可用计算机的 IP 地址? -java

Java - 如何使用匹配器编写可选的正则表达式模式

java - JTextPane .getText() 不保留 HTML 的空白?

java - 如何从netbeans中的另一个类方法调用java swing jpanel?

javascript - 动态区域绘画

java - java中文本区域的大小

java - 在 java jsoup 的 html 页面中搜索和查找变量值

java - 在两个 GUI 类之间传输 String 时出现 NullPointerException

image - PyQT4 - 在图像上绘画以进行区域选择