从JPanel(没有JFrame)创建BufferedImage时,我还可以使用布局管理器吗?

我试图从JPanel创建一个BufferedImage,而不使用JFrame。 昨天,我终于能够在这个社区的帮助下看到图像(见下文),但现在我遇到了一些布局问题。 BufferedImage上的所有组件都以0,0开始绘制,而不是遵循布局管理器。 有谁知道这个问题的解决方案?

昨天的问题: 我可以从JPanel创建BufferedImage而无需在JFrame中渲染吗?

在下面的代码中,两个标签将在图像的左上角相互覆盖。

import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; public class RenderTest { RenderTest() { JPanel panel = new JPanel(); panel.setBackground(Color.RED); panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); Dimension dim = new Dimension(150,50); panel.setSize(dim); panel.setMinimumSize(dim); panel.setMaximumSize(dim); panel.setPreferredSize(dim); JLabel label = new JLabel("hello"); JLabel label2 = new JLabel(" world"); label.setSize(label.getPreferredSize()); label2.setSize(label2.getPreferredSize()); panel.add(label); panel.add(label2); BufferedImage bi = getScreenShot(panel); JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi))); } private BufferedImage getScreenShot(JPanel panel){ BufferedImage bi = new BufferedImage( panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB); panel.paint(bi.getGraphics()); return bi; } public static void main(String[] args) { new RenderTest(); } } 

来自女王的更多提示 。 ‘调用addNotify() ‘。

 import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; import javax.swing.border.EmptyBorder; public class RenderTest { RenderTest() { JPanel panel = new JPanel(new GridLayout(0,1,10,10)); panel.setBackground(Color.RED); panel.setBorder(new EmptyBorder(5,25,5,25)); JLabel label = new JLabel("hello"); panel.add(label); JLabel label2 = new JLabel("goodbye"); panel.add(label2); panel.addNotify(); panel.setSize(panel.getPreferredSize()); panel.validate(); BufferedImage bi = getScreenShot(panel); JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi))); } private BufferedImage getScreenShot(JPanel panel){ BufferedImage bi = new BufferedImage( panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB); panel.paint(bi.getGraphics()); return bi; } public static void main(String[] args) { new RenderTest(); } } 

顺便说一句 – 我不建议将尺寸设置为任意尺寸,然后尝试将其与布局相结合。 只是想到我会提到,因为我得到的印象就是你想要的。 在这种情况下,我们可能完全定位所有内容,这是一种方法,但选择一种方法或另一种方法。

 JLabel label = new JLabel("hello"); panel.add(label); JLabel label2 = new JLabel("goodbye"); panel.add(label2); 

这可能是一个系统需要的过程吗?

我不确定,但树看起来可能。