我正在开发一个 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 中。
我未能在 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/