我一直在大量研究stackoverflow和其他平台上找到解决问题的方法。我确实理解这是一个重复的问题,我完全理解如何基于Java教程和其他现有文章将JPanel转换为图像在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());
}
先谢谢您。 :)
答案 0 :(得分:1)
问题是一个复杂的问题。
在line
的实例上调用panel()
时,它会创建imageOutput
的另一个实例,这本身并不是一件坏事,但是您需要记住该新实例与屏幕上的内容无关。
在您提供的示例中,这意味着没有在组件上进行布局传递,因此所有组件都位于默认位置/大小(即JPanel
),因此不会呈现任何内容< / p>
如果您每次调用0x0x0x0
时都将继续创建面板的新实例,那么您将不得不强制进行布局遍历,例如...
panel()
现在,就我个人而言,我会避免使用JPanel panel = new imageOutput().panel();
panel.setSize(panel.getPreferredSize());
panel.doLayout();
并将其传递为“不可思议”的数字,而是使用分量setSize
,但这就是我