Я работаю над проектом SWT, но я буду активно работать с Awt.Robot.createScreenCapture() для создания изображений BufferedImages. У меня будут сотни - тысячи изображений, сгенерированных таким образом.

Проблема в том, что SWT не может отображать BufferedImages и имеет свой собственный класс Image. Я знаю, что можно преобразовать BufferedImages в изображение SWT, но изображения SWT, похоже, нужно удалять вручную и не имеют автоматической сборки мусора, как это было бы в BufferedImage Swing.

Кроме того, я полагаю, что компьютеру потребуется время / усилия для постоянного преобразования из BufferedImage в изображение, что, вероятно, может замедлить мою программу, что неприемлемо, поскольку это критичное по времени приложение.

Итак, есть ли способ показать BufferedImages в SWT Shell? (У меня, вероятно, будет Jpanel, показывающий изображение для каждого из изображений, поэтому мне просто нужен способ показать JPanel на Shell.)

2
user2790209 18 Сен 2013 в 10:02

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

Ура

1
serg.nechaev 18 Сен 2013 в 11:20
Спасибо! Один вопрос: если бы я хотел показать несколько таких изображений (например, 4-5), как бы я это сделал? Что мне нужно сделать, чтобы создать многоразовый BufferedImageContainer или такой класс, который я могу просто многократно добавлять в свои shell (и вызывать setImage(myBufferedImage) для установки изображения?)
 – 
user2790209
18 Сен 2013 в 11:27
«несколько изображений» как плитки на одной панели?
 – 
serg.nechaev
18 Сен 2013 в 11:51
Я думаю, что каждое изображение должно быть в собственном Java-фрейме / композите, чтобы я мог разместить их там, где мне нужно.
 – 
user2790209
18 Сен 2013 в 11:58