使用OOP将Jpanel转换为图像

问题描述 投票:0回答:1

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

先感谢您。 :)

java swing jpanel
1个回答
1
投票

问题是复杂的问题。

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

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

如果你每次调用panel()时都要继续创建面板的新实例,那么你将不得不强制进行布局传递,可能是......

JPanel panel = new imageOutput().panel();
panel.setSize(panel.getPreferredSize());
panel.doLayout();

现在,就个人而言,我会避免使用setSize并将其传递给“魔法”数字,而是使用组件preferredSize,但这就是我

© www.soinside.com 2019 - 2024. All rights reserved.