Java добавить изображение из события - PullRequest
1 голос
/ 08 февраля 2012

Так что я делаю эту программу с графическим интерфейсом, и я не слишком много работал с Swing / SWT, но немного, чтобы знать, что происходит.

В любом случае, я добавляю actionlistener для кнопки, чтобы он добавлял изображение в contentPane, когда я нажимаю на кнопку, но он не работает, если у меня нет его в качестве JComponent (как показано ниже), и добавляю другой вещи (кнопка, JLabel и т. д.) к нему потом ... И установить этот JComponent в представление содержимого (что не имеет смысла) .... Я также попытался заставить его расширить JPanel и просто очистить исходное содержимое и повторно добавив их в новый JPanel. Дело в том, что когда я делаю это, он странным образом воссоздает текст для моей JLabel, и я просто знаю, что должен быть более простой, более эффективный способ.

class ShowImage extends JComponent{

    public ShowImage(){
        super();
        monkey = Toolkit.getDefaultToolkit().getImage(("D:/monkey.png"));

    }
public void paintComponent(Graphics g){
    g.drawImage(monkey, 20, 100, null);
    repaint();
}
}

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012
  1. Не вызывать repaint внутри paintComponent
  2. Вызвать super.paintComponent и затем нарисовать изображение

Кроме того, в зависимости от менеджера компоновки этот компонентбудет иметь предпочтительный размер (0, 0) и, следовательно, не будет виден.

Для получения дополнительной информации см. 2D-графика .

Правка - Обратите внимание, что динамическое добавление компонента приведет к повторной проверке контейнера и выполнению запроса на перерисовку, чтобы менеджер компоновки снова разметил свои компоненты и удалил все визуальные артефакты.Кроме того, для получения дополнительной информации об изображениях см. Работа с изображениями .

В любом случае, простейшим подходом, вероятно, было бы установить изображение в виде значка экземпляра JLabel и добавить его вконтейнер.Здесь действительно нет необходимости изобретать велосипед.

2 голосов
/ 08 февраля 2012
g.drawImage(monkey, 20, 100, this);

.. скорее всего исправило бы проблему в исходном коде. Это была общая проблема:

  • Загрузка изображения в асинхронном режиме. (Toolkit.getImage() в отличие от ImageIO.read().)
  • Покрасить его в тупик ImageObserver. JComponent реализует ImageObserver. Как только изображение будет полностью загружено (а также несколько точек до этого), наблюдатель будет проинформирован, вызывая repaint().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...