2016-02-26 61 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