我一直在研究stackoverflow和其他平台,以找出我的问题的解决方案。我明白这是一个重复的问题,我完全理解如何将JPanel转换为基于Java教程的图像和stackoverflow上的其他现有帖子。但是,我正在尝试在OOP中执行此操作,因为我不想在同一方法中对所有代码进行分块。我一直得到的结果是空白的,它没有在我导出的PNG文件中显示我的组件。
文件2,imageOutput.java
public class imageOutput {
public JPanel panel() {
JPanel panel = new JPanel();
JButton btn = new JButton("Click");
JLabel label = new JLabel("Exporting image example");
// -----Add to panel ---
panel.add(label);
panel.add(btn);
panel.setSize(200,200);
btn.addActionListener(new saveImageListener());
return panel;
}
public void frame() {
JFrame frame = new JFrame();
JPanel panel = panel();
// --- Add to frame ---
frame.add(panel);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
class saveImageListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
JPanel panel = new imageOutput().panel();
System.out.println("Step 1.. ");
BufferedImage image = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_RGB);
System.out.println("Step 2.. ");
Graphics2D g = image.createGraphics();
panel.printAll(g);
g.dispose();
try {
ImageIO.write(image, "jpg", new File("Paint2.jpg"));
ImageIO.write(image, "png", new File("Paint2.png"));
System.out.println("save");
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
主类,main.java
public class main{
public static void main(String[] args) {
new imageOutput().frame();
}
}
当我运行程序时,如上所述,结果为空白。我一直试图弄清楚过去一周的原因是什么,我还没有提出任何解决方案。有没有人遇到这个问题,能够解决?
但是当我这样做时,它完全没问题。但是,这对我来说并不适合。
public void frame() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton btn = new JButton("Click");
JLabel label = new JLabel("Exporting image example");
//-----Add to panel ---
panel.add(label);
panel.add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BufferedImage image = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
panel.printAll(g);
g.dispose();
try {
ImageIO.write(image, "jpg", new File("Paint2.jpg"));
ImageIO.write(image, "png", new File("Paint2.png"));
System.out.println("save");
} catch (IOException exp) {
exp.printStackTrace();
}
}
});
//--- Add to frame ---
frame.add(panel);
frame.setSize(200, 200);
frame.setVisible(true);
//btn.addActionListener(new saveImageListener());
}
先感谢您。 :)
问题是复杂的问题。
当你在panel()
的一个实例上调用imageOutput
时,它会创建JPanel
的另一个实例,这本身并不是坏事,但是你需要记住这个新实例与屏幕上的内容无关。
在您提供的示例中,这意味着没有对组件进行布局传递,因此所有组件都处于默认位置/大小(即0x0x0x0
),因此不会呈现任何内容
如果你每次调用panel()
时都要继续创建面板的新实例,那么你将不得不强制进行布局传递,可能是......
JPanel panel = new imageOutput().panel();
panel.setSize(panel.getPreferredSize());
panel.doLayout();
现在,就个人而言,我会避免使用setSize
并将其传递给“魔法”数字,而是使用组件preferredSize
,但这就是我