画到离屏图像

时间:2016-02-26 15:36:31

标签: java swing user-interface

我设法在图像上绘制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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

我在图像上管理绘制GUI组件,但是,它只能通过将Jframe设置为可见来完成,

组件在涂漆之前需要有一个尺寸。默认情况下,组件的大小为(0,0),因此无需绘制任何内容。当你调用pack()或setVisible(...) - 它为你调用pack()时 - 然后确定每个组件的大小。

查看可用于创建任何组件图像的Screen Image,并在创建图像之前为您设置尺寸。