JFrame отображается пустым, когда компоненты загружают изображения вне paintComponent (); метод

1

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

В настоящее время я создаю пользовательские компоненты для своих приложений. Эти компоненты (размер JComponent) перезаписывают метод paintComponent();. По какой-то причине кадр был пустым, когда какой-либо из этих компонентов был использован, как только я реализовал изображения в компонентах, я сделал некоторую debuggin, и я узнал следующее: Как только код внутри этого перезаписываемого метода рисует изображение, которое было сохранено в переменной вне самого метода, как и нестатическая переменная класса, кадр будет отображаться пустым, пока отображается, пока он не будет изменен. Все работает отлично при использовании изображений, хранящихся в переменной, в самом методе paintComponent();. Что здесь происходит и как я могу решить эту проблему? Мне действительно нужно использовать изображения, хранящиеся в переменной класса, для кэширования этих изображений, иначе было бы очень быстро загружать каждое изображение снова и снова.

Код, аналогичный приведенному ниже примеру, отлично работает;

public class MyComponent extends JComponent {

    @Override
    public void paintComponenet(Graphics g) {
        Image img = ImageIO.read(getClass().getResource("/res/myImg.png"));
        g.drawImage(img, 0, 0, null);
    }
}

Кадр отображается пустым, когда используется что-то подобное;

public class MyComponent extends JComponent {

    private Image img = ImageIO.read(getClass().getResource("/res/myImg.png"));

    @Override
    public void paintComponenet(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }
}

Загрузка изображения (в приведенном выше примере) внутри конструктора или любого другого метода не будет иметь эффекта.

ПРИМЕЧАНИЕ. Рамка, в которой используются компоненты, не упакована до (или после) ее отображения. Это не должно иметь никакого смысла, потому что оно отлично работает при использовании переменных внутри самого метода paintComponent();.

  • 0
    Извините, но я не совсем понимаю ваш ответ. Вы говорите, что проблема может быть в том, что переменная изображения не является final ? Я попробую прямо сейчас, хотя это все равно будет странно! ПРИМЕЧАНИЕ: рамка не показывает ничего, ни собственные компоненты свинга, как только эти изображения используются!
  • 0
    Создание этой переменной окончательно, к сожалению, не решает проблему. Та же проблема все еще возникает, если я удаляю вызов draw для графического объекта. Так что это что-то с кодом, который загружает изображения.
Показать ещё 5 комментариев
Теги:
swing
jcomponent

1 ответ

2
Лучший ответ

Ответа на этот вопрос @trashgod


Убедитесь, что объекты Swing GUI создаются и обрабатываются только в потоке отправки событий.

Например, используйте следующий код для инициализации фрейма, который показывает пробел, это должно решить вашу проблему;

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        new MyFrame();
    }
});
  • 1
    +1 за ценный отзыв; см. также этот ответ .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню