Преобразование Jpanel в изображение с помощью ООП - PullRequest
0 голосов
/ 11 апреля 2019

Я проводил тщательные исследования стека и других платформ, чтобы найти решение моей проблемы. Я понимаю, что это дублирующий вопрос, и я полностью понимаю, как преобразовать JPanel в изображение на основе учебника по Java и других существующих публикаций.на стеке потокаТем не менее, я пытаюсь сделать это в ООП, так как я не хочу разбивать все мои коды в одном методе.Результат, который я продолжаю получать, пуст, и он не показывает мой компонент в экспортированном файле 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 Ответ

1 голос
/ 11 апреля 2019

Проблема сложная.

Когда вы вызываете panel() для экземпляра imageOutput, это создает другой экземпляр JPanel, само по себе это не плохо, но вы должны помнить, что этот новый экземпляр не имеет ничего делать с тем, что на экране.

В приведенном вами примере это означает, что в компоненте не было выполнено ни одного этапа макета, поэтому все компоненты находятся там по умолчанию (размер 0x0x0x0), поэтому ничего не отображается

Если вы собираетесь продолжать создавать новый экземпляр панели каждый раз, когда вы вызываете panel(), то вам придется форсировать проход макета, возможно, что-то вроде ...

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

Теперь лично я бы избегал setSize и передавал бы ему "магические" числа и вместо этого использовал бы компоненты preferredSize, но это я

...