Java 为什么我的图像不保存

Java 为什么我的图像不保存,java,swing,graphics,jframe,jpanel,Java,Swing,Graphics,Jframe,Jpanel,我有一个简单的程序,上面有JFrame和Jpanel,我想在Jpanel上画一条线,并将绘制的结果保存到图像中。但它完全不起作用 我哪里错了 import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.log

我有一个简单的程序,上面有JFrame和Jpanel,我想在Jpanel上画一条线,并将绘制的结果保存到图像中。但它完全不起作用

我哪里错了

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

public class source {
    public static void main(String[] args) {
        JFrame window = new JFrame("TEST");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel mainPanel = new JPanel();
        mainPanel.setVisible(true);
        mainPanel.setSize(800, 600);
        mainPanel.setPreferredSize(new Dimension(300,300));
        window.setContentPane(mainPanel);
        window.setSize(800, 600);
        window.pack();
        window.setVisible(true);
        Graphics g = mainPanel.getGraphics();
        g.setColor(Color.BLACK);
        g.drawLine(0, 0, 50, 50);

        BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);
        try {
            System.out.println("Saved");
            ImageIO.write(image, "PNG", new File("filename1.png"));
        } catch (IOException ex) {
            Logger.getLogger(source.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Not saved");
        }

    }
}

不要使用getGraphics。这不是你做定制绘画的方式

相反,您需要重写JPanel的paintComponent方法,并使用该方法进行自定义绘制。有关更多信息和工作示例,请阅读上Swing教程的部分

BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300);
所做的只是创建一个空的BuffereImage

您需要使用BuffereImage的图形对象在其上绘制一些内容。基本代码类似于:

BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
someComponent.print( g2d );
g2d.dispose();
但是,上述逻辑只有在可见GUI上完成时才起作用。这意味着您需要创建框架并将面板添加到框架中。然后,您将创建一个“保存图像”按钮以添加到帧中。然后将ActionListener添加到按钮。在侦听器代码中,创建BuffereImage并将该映像保存到文件中

或者,如果您只想创建图像并将其保存到文件,则只需直接绘制到BuffereImage:

BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
g2d.setColor( Color.WHITE );
g2d.fillRect(0, 0, theWidth, theHeight);
g2d.setColor( Color.Black );
g2d.drawLine(...);
g2d.dispose();

mainPanel.createImage300300;生成一个空白图像,可在面板上显示。它不是当前面板上的图像。顺便说一句,还有另一种方法。创建要在JLabel中显示的BuffereImage。绘制缓冲图像,然后重新绘制标签以查看更改。需要时保存该图像。@AndrewThompson所以你想说我不能选取Jpanel的图形,绘制它,然后将结果复制到BuffereImage?我只能画一个BuffereImage,然后将结果复制到JPanel,是吗?我不想说这样的话。如果我把代码放到paintComponent中,我会收到一个绘图的图像吗?