2016-02-26 65 views
1

我設法在圖像上繪製GUI組件。但是,只能通過將JFrame設置爲可見來完成。 JPanel.setVisible()validate()沒有任何影響。如果JFrame被註釋掉,它會繪製一個空的圖像。繪製到離屏圖像

當我想要某些功能執行離屏GUI繪畫時,彈出一個JFrame或運行此類代碼的服務器沒有屏幕或圖形卡時,它並不整齊。

請幫幫忙,非常感謝。

import java.awt.BorderLayout; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Snippet { 

    public static void main(String[] args) { 
     JButton test = new JButton("Test Button center"); 
     JButton test2 = new JButton("Test Button2 south"); 
     JButton test3 = new JButton("Test Button3 at east"); 
     BorderLayout bl = new BorderLayout(); 
     JPanel jp = new JPanel(bl, false); 
     jp.add(test2,BorderLayout.SOUTH); 
     jp.add(test, BorderLayout.CENTER); 

     jp.add(test3, BorderLayout.EAST); 

//  jp.validate(); 
//  jp.setVisible(true); 
//  jp.show(); 
     JFrame jf = new JFrame(); 
     jf.getContentPane().add(jp, BorderLayout.CENTER); 
     jf.pack(); 
     jf.setVisible(true); 
     //jp.setBounds(10, 10, 400, 400); 
     BufferedImage b = new BufferedImage(jf.getWidth(), jf.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     jp.paintAll(b.createGraphics()); 


     File output = new File("f:/screenie.png"); 

     try 
     { 
      ImageIO.write(b, "png", output); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+2

對不起,你的問題不清楚。您的問題是如何在沒有屏幕或圖形卡的系統上將組件呈現給圖像? – ControlAltDel

+0

似乎是這樣。或者只是將屏幕打印到圖像上,然後發送給客戶端。 – Shark

+0

它是第一個:在沒有屏幕或圖形卡的系統上將圖像渲染到圖像 – Johnny

回答

1

我管理上描繪的GUI組件,但是,它只能被具有一個JFrame組可見做,

組件需要有大小,他們可以畫前。默認情況下,組件的大小是(0,0),所以沒有東西可以繪製。當您調用pack()或setVisible(...) - 它爲您調用pack()時,將確定每個組件的大小。

檢出Screen Image可用於創建任何組件的圖像,並將在創建圖像之前爲您設置大小。

+0

那麼爲什麼「JPanel.setVisible(true);」不會這樣做? – Johnny

+0

除頂層組件(JFrame,JDialog)之外的所有Swing組件都已經可見,因此在面板上調用setVisible()不會執行任何操作。那個陳述後你有沒有顯示面板的大小?您在調用該語句之前是否顯示面板的可見性? – camickr