Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SWT项目中显示BuffereImage?_Java_Swing_Swt_Awt_Bufferedimage - Fatal编程技术网

Java 如何在SWT项目中显示BuffereImage?

Java 如何在SWT项目中显示BuffereImage?,java,swing,swt,awt,bufferedimage,Java,Swing,Swt,Awt,Bufferedimage,我正在从事一个SWT项目,但我将广泛使用Awt.Robot.createScreenCapture()来生成BuffereImage。我将有成百上千的图像以这种方式生成 问题是,SWT似乎不能显示BuffereImage,它有自己的Image类。我知道可以将BuffereImage转换为SWT的映像,但SWT的映像似乎需要手动处理,并且不像Swing的BuffereImage那样具有自动垃圾收集功能 另外,我认为计算机要不断地从BuffereImage转换为Image需要时间/精力,这可能会减慢

我正在从事一个SWT项目,但我将广泛使用
Awt.Robot.createScreenCapture()
来生成BuffereImage。我将有成百上千的图像以这种方式生成

问题是,SWT似乎不能显示BuffereImage,它有自己的
Image
类。我知道可以将BuffereImage转换为SWT的映像,但SWT的映像似乎需要手动处理,并且不像Swing的BuffereImage那样具有自动垃圾收集功能

另外,我认为计算机要不断地从BuffereImage转换为Image需要时间/精力,这可能会减慢我的程序,这是不可接受的,因为它是一个时间关键型应用程序


那么,有没有办法在SWT
Shell
上显示BuffereImage?(我可能会有一个
Jpanel
显示每个图像的图像,所以我只需要一种方法将Jpanel显示在
Shell
上)

我尝试了SWT/AWT桥,正如在对您的问题的评论中所建议的,它可以正常工作:

    static BufferedImage bim;

static Frame frame;

public static void main(String[] args) {

    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {

                try {
                    final java.awt.Rectangle screenRect = new java.awt.Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
                    bim = new Robot().createScreenCapture(screenRect);
                    frame.repaint();
                    Thread.sleep(100);

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
    }).start();

    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    shell.setSize(200, 200);

    Composite composite = new Composite(shell, SWT.EMBEDDED | SWT.NO_BACKGROUND);
    frame = SWT_AWT.new_Frame(composite);
    frame.setLayout(new BorderLayout());
    frame.add(new JPanel() {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(bim, 0, 0, this);
        }

    }, BorderLayout.CENTER);
    frame.setVisible(true);

    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

干杯

使用或在弹出框中显示图像。谢谢!有一个问题,如果我想展示多张这样的图片(例如4-5),我会怎么做?要制作一个可重用的
BufferedImageContainer
或这样的类,我需要做些什么才能重复地将其添加到我的
shell
s中(并调用
setImage(mybufferedImages)
来设置图像?“多个图像”作为同一面板上的瓷砖?我认为每个图像都应该在自己的Java框架/组合中,这样我就可以将它们放在需要的任何地方