2017-05-14 155 views
0

我有一个简单的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"); 
     } 

    } 
} 
+0

'mainPanel.createImage(300,300);'产生一个空白图像,兼容在面板上显示。它不是**是目前面板上的图片。顺便说一句 - 有另一种方法来解决这个问题。创建一个'BufferedImage'以显示在'JLabel'中。在缓冲的图像上绘制,然后'重绘()'标签以查看更改。需要时保存该图像。 –

+0

@AndrewThompson所以你想说,我不能选择一个Jpanel的图形,绘制它,然后将结果复制到BufferedImage?我只能使用BufferedImage并将结果复制到JPanel,是吗? – Nawy

+0

我不想说任何这样的事情。这只是**更容易**我描述的方式。 –

回答

1

请勿使用getGraphics()。这不是你如何做自定义绘画。

相反,您需要重写JPanel的paintComponent()方法,并在该方法中执行自定义绘制。有关更多信息和工作示例,请阅读Swing教程Custom Painting中的部分。

BufferedImage image = (BufferedImage)mainPanel.createImage(300, 300); 

所做的只是创建一个空的BufferedImage。

您需要使用其Graphics对象在BufferedImage上绘制某些内容。基本代码是这样的:

BufferedImage image = new BufferedImage(theWidth, theHheight, BufferedImage.TYPE_INT_RGB); 
Graphics2D g2d = image.createGraphics(); 
someComponent.print(g2d); 
g2d.dispose(); 

但是,上述逻辑将只能在可见的GUI上完成。这意味着您需要创建您的框架并将面板添加到框架中。然后你会创建一个“保存图像”按钮添加到框架。然后你添加一个ActionListener到按钮。在侦听器代码中,创建BufferedImage并将图像保存到文件中。

或者,如果你只是想创建一个图像,并将其保存到一个文件,那么你只需要直接画到BufferedImage的:

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(); 
+0

如果我把我的代码放到paintComponent()中,我会收到绘图的图像吗? – Nawy

相关问题