【问题标题】:Swing: save the current graphicsSwing:保存当前图形
【发布时间】:2019-11-17 14:33:26
【问题描述】:

我有创建一些图形的 SWing 代码。我有一个按钮"Run Again" 可以重新创建图形。

SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                final GraphicsDemo_noborders_ML demo = new GraphicsDemo_noborders_ML();

                final JFrame jFrame = new JFrame();

                jFrame.setTitle("Latest Programic Art");
                jFrame.setSize(canvasW, canvasH);

                JButton save = new JButton("Save");
                JButton run = new JButton("Run Again");

                save.setBounds(50, 100, 100, 50);
                run.setBounds(50, 500, 100, 50);

                final JPanel panel = new JPanel();

                panel.add(save);
                panel.add(run);

                final JComponent canvas = new JComponent() {

                    @Override
                    protected void paintComponent(Graphics g) {
                        demo.paint(g);
                    }
                };

                jFrame.getContentPane().add(canvas, BorderLayout.CENTER);
                jFrame.getContentPane().add(panel, BorderLayout.PAGE_START);


                run.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                        Graphics g = canvas.getGraphics();
                        demo.paint(g);
                    }
                });

                save.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                        JFileChooser chooser = new JFileChooser();
                        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                        chooser.showSaveDialog(null);

                        String location = chooser.getSelectedFile().toString();
                        demo.saveImageToLocalDisk(jFrame, location);
                    }
                });

                jFrame.setVisible(true);
                jFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            }
        });

保存按钮用于将当前图形保存为图像。但是,当我保存它时,它不会保存当前图形,而只会保存初始图形。

下面提供保存的方法,

private void saveImageToLocalDisk(JFrame jFrame, String location) {

        BufferedImage image = null;

        try {

            Rectangle rectangle = jFrame.getBounds();
            image = new Robot().createScreenCapture(rectangle);

        } catch (AWTException e1) {
            e1.printStackTrace();
        }

        Graphics2D graphics2D = image.createGraphics();
        jFrame.paint(graphics2D);

        try {
            ImageIO.write(image, "jpeg", new File(location + "/Graphics.jpeg"));
        } catch (Exception e) {
            System.out.println("error");
        }
    }

我该如何纠正这个问题?

【问题讨论】:

  • 如果需要看paint方法,请在下方评论。
  • 您发布的代码没有给我们任何提示,您的问题在哪里。请提供minimal reproducible example,以便我们也可以重现和调试它以找到适合您情况的解决方案。请不要在此处发布您的整个代码,而是创建一个小的可运行类来演示您的问题。
  • (1-) 你为什么一直发布这个旧代码???你被告知你的代码结构是完全错误的。由于结构不佳,您又遇到了另一个问题。如果您按照给出的工作示例进行操作,就没有问题。不仅您发布的代码没用。您没有发布显示如何重新创建图像的代码,您没有显示“saveImageToLocalDisk。即使您被告知它们什么都不做,您的代码仍然有“setBounds()”语句。我们为什么要继续尝试提供帮助当你不听已经给出的建议时???
  • 您错过了第一条评论。我们希望看到minimal reproducible example。我们对您的申请不感兴趣。 “MRE”的重点是简化代码,以确保您理解您提出的问题并使用最少的代码来演示问题。请注意,在下面 Sergiy 提供的“MRE”中,您可以复制/粘贴/编译/测试单个 Java 源文件。我们不关心您在方便时完成应用程序。我们担心这个问题对我们来说很容易理解。您花时间让我们轻松地为您提供帮助。
  • 我不会帮助你,因为你没有努力重组你的代码。当您尝试添加新功能时,结构不佳的代码只会不断导致问题。第 3 次或第 4 次,Swing 教程中的演示代码是开始构建更好结构的地方。

标签: java image swing graphics save


【解决方案1】:

我的错误是我传递了 JFrame 而不是拥有图形的 JComponent。我更正了代码,

private void saveImageToLocalDisk(JComponent component, String location) {

        try {

            BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(),
                    BufferedImage.TYPE_INT_RGB);

            Graphics graphics = image.getGraphics();
            paint(graphics);

            ImageIO.write(image, "jpeg", new File(location + "/Graphics.jpeg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

【讨论】:

    【解决方案2】:

    这是一个小例子,我将如何实现您的应用(重新创建 + 保存图像)。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
    
    /**
     * <code>PaintDemo</code>.
     */
    public class PaintDemo {
    
        private int recreateIndex = 1;
    
        private BufferedImage image;
    
        private final JLabel imageLabel = new JLabel();
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new PaintDemo()::startUp);
        }
    
        private void startUp() {
            recreateImage();
            JFrame frm = new JFrame("Paint app");
            frm.add(imageLabel);
            JPanel buttonBar = new JPanel();
            JButton recreate = new JButton("Recreate");
            recreate.addActionListener(e -> recreateImage());
            buttonBar.add(recreate);
            JButton save = new JButton("Save");
            save.addActionListener(e -> save());
            buttonBar.add(save);
            frm.add(buttonBar, BorderLayout.NORTH);
            frm.pack();
            frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            frm.setLocationRelativeTo(null);
            frm.setVisible(true);
        }
    
        private void recreateImage() {
            image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = image.createGraphics();
            g.setColor(Color.BLUE);
            g.fillRect(20, 30, 100, 50);
            g.setColor(Color.ORANGE);
            g.drawOval(200, 150, 50, 50);
            g.setColor(Color.GREEN);
            g.drawString("Recreated image: " + recreateIndex++, 200, 250);
            imageLabel.setIcon(new ImageIcon(image));
        }
    
        private void save() {
            JFileChooser chooser = new JFileChooser();
            int result = chooser.showSaveDialog(imageLabel);
            if (result == JFileChooser.APPROVE_OPTION) {
                File f = chooser.getSelectedFile();
                try {
                    ImageIO.write(image, "jpeg", f);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2016-02-15
      • 2014-07-19
      • 2013-04-20
      • 2013-07-06
      相关资源
      最近更新 更多