2017-05-14 112 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

相關問題