如何在SWT项目中显示BufferedImages?

时间:2013-09-18 06:02:52

标签: java swing swt awt bufferedimage

我正在开发一个SWT项目,但我将与Awt.Robot.createScreenCapture()进行广泛合作以生成BufferedImages。我将以这种方式生成数十万张图像。

问题是,SWT似乎无法显示BufferedImages,并且有自己的Image类。我知道可以将BufferedImages转换为SWT的Image,但是SWT的图像似乎需要手动处理,并且没有像Swing的BufferedImage那样的自动垃圾收集。

另外,我想计算机需要花费时间/精力不断地从BufferedImage转换为Image,这可能会减慢我的程序速度,这是一个时间关键的应用程序。

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

1 个答案:

答案 0 :(得分:1)

我按照您的问题评论中的建议尝试了SWT / AWT Bridge,它按预期工作:

    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();
}

干杯