Не удается получить JFrame для обновления изображения - PullRequest
2 голосов
/ 03 января 2011

Эй, я работаю над программой, и в целях отладки я пытаюсь заставить программу сделать снимок экрана с части экрана.Я хочу обновить дисплей, но не могу заставить его работать.Я уверен, что это простая проблема, но мой опыт работы с апплетами Java очень мал.

Вот часть, с которой у меня возникают проблемы:

...
Thread.sleep(5000);
    try {gb = new GameBoard(frame.getBounds());}
    catch(Exception e){System.out.println("Error.");} // Make "gameboard" Object

    while (true)
    {
        Thread.sleep(1000);
        gb.grabImage(); // use java.awt.Robot's createScreenCapture()

        ImageIcon icon = new ImageIcon(gb.image()); // wrap the image 
        JLabel label = new JLabel(icon, JLabel.CENTER);
        frame.getContentPane().add(label,BorderLayout.EAST); //display the image (works)
        //JOptionPane.showMessageDialog(null, label, "icon", -1);
        label.repaint(); //update the display??
        frame.repaint();
        frame.getContentPane().repaint();
    }

Как я уже сказал,изображение появляется и будет создавать новые, если я изменю размер апплета, но мне нужно постоянно меняющееся изображение.

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 03 января 2011

Вы создаете и добавляете новый JLabel каждый раз через цикл.Поскольку вы меняете структуру дерева компонентов, вам нужно вызвать revalidate на панели содержимого фрейма.

Лучшим решением было бы просто изменить изображение на одном JLabel.Создайте одну метку, добавьте ее, затем в цикле используйте JLabel.setIcon и repaint.

2 голосов
/ 03 января 2011

Как отмечает @RD, createScreenCapture() выдаст SecurityException, если апплет не подписан.Сон в потоке отправки событий может блокировать обновления.Этот пример захватывает изображение экрана при перетаскивании мыши;BufferedImage «запоминает» последнее захваченное изображение.

0 голосов
/ 03 января 2011

Из того, что я помню, repaint() в Java действительно должно было называться invalidate() - оно фактически не перекрашивает окно;это только делает его недействительным, поэтому ОС может перекрасить его при следующей возможности.Я не внимательно посмотрел на твой код, но думаю, что это может быть проблемой.Я не уверен, как вызвать перерисовку, но идея состоит в том, чтобы вернуться из функции, затем сделать так, чтобы таймер прервал вас и нарисовал ее - тогда у ОС будет шанс нарисовать окно.

...