我可以从JPanel创建BufferedImage而无需在JFrame中呈现吗?

Bro*_*oke 11 java swing bufferedimage jpanel jframe

是否可以从JPanel创建BufferedImage而无需先在JFrame中呈现它?我搜遍了我能想到的任何地方,找不到答案.有人可以帮忙吗?

这是一些示例代码.如果我不取消注释JFrame代码,我的BufferedImage是空白的.

    test(){
//      JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        Dimension dim = new Dimension(50,50);
        panel.setMinimumSize(dim);
        panel.setMaximumSize(dim);
        panel.setPreferredSize(dim);
        JLabel label = new JLabel("hello");
        panel.add(label);
//      frame.add(panel);
//      frame.pack();
        BufferedImage bi = getScreenShot(panel);

        //...code that saves bi to a jpg
    }

    private BufferedImage getScreenShot(JPanel panel){
        BufferedImage bi = new BufferedImage(panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB);
        panel.paint(bi.getGraphics());
        return bi;
    }
Run Code Online (Sandbox Code Playgroud)

And*_*son 8

看看这个答案,以摇摆:获取JFrame的图像,以及为什么JTable的头图像中不出现?有关绘制尚未渲染的组件的提示.我希望您的问题的修复程序显示在标签中LabelRenderTest.java.

JLabel textLabel = new JLabel(title);
textLabel.setSize(textLabel.getPreferredSize());
Run Code Online (Sandbox Code Playgroud)

更新

Dimension dim = new Dimension(50,50);
panel.setSize(dim);  // very important!
panel.setMinimumSize(dim);
panel.setMaximumSize(dim);
panel.setPreferredSize(dim);
// ...
Run Code Online (Sandbox Code Playgroud)

或者这是完整的来源.还需要设置标签的大小.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class RenderTest {

    RenderTest() {
        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        Dimension dim = new Dimension(50,50);
        panel.setSize(dim);
        panel.setMinimumSize(dim);
        panel.setMaximumSize(dim);
        panel.setPreferredSize(dim);
        JLabel label = new JLabel("hello");
        label.setSize(label.getPreferredSize());
        panel.add(label);

        BufferedImage bi = getScreenShot(panel);
        JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi)));
    }

    private BufferedImage getScreenShot(JPanel panel){
        BufferedImage bi = new BufferedImage(
            panel.getWidth(), panel.getHeight(), BufferedImage.TYPE_INT_ARGB);
        panel.paint(bi.getGraphics());
        return bi;
    }

    public static void main(String[] args) {
        new RenderTest();
    }
}
Run Code Online (Sandbox Code Playgroud)