使用OOP

时间:2019-04-11 07:36:52

标签: java swing jpanel

我一直在大量研究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());
    }

先谢谢您。 :)

1 个答案:

答案 0 :(得分:1)

问题是一个复杂的问题。

line的实例上调用panel()时,它会创建imageOutput的另一个实例,这本身并不是一件坏事,但是您需要记住该新实例与屏幕上的内容无关。

在您提供的示例中,这意味着没有在组件上进行布局传递,因此所有组件都位于默认位置/大小(即JPanel),因此不会呈现任何内容< / p>

如果您每次调用0x0x0x0时都将继续创建面板的新实例,那么您将不得不强制进行布局遍历,例如...

panel()

现在,就我个人而言,我会避免使用JPanel panel = new imageOutput().panel(); panel.setSize(panel.getPreferredSize()); panel.doLayout(); 并将其传递为“不可思议”的数字,而是使用分量setSize,但这就是我