我设法在图像上绘制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();
}
}
}
答案 0 :(得分:1)
我在图像上管理绘制GUI组件,但是,它只能通过将Jframe设置为可见来完成,
组件在涂漆之前需要有一个尺寸。默认情况下,组件的大小为(0,0),因此无需绘制任何内容。当你调用pack()或setVisible(...) - 它为你调用pack()时 - 然后确定每个组件的大小。
查看可用于创建任何组件图像的Screen Image,并在创建图像之前为您设置尺寸。