Теперь это может показаться очень странным, что также является причиной того, что я думаю, что это ошибка в самой 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();
.
Ответа на этот вопрос @trashgod
Убедитесь, что объекты Swing GUI создаются и обрабатываются только в потоке отправки событий.
Например, используйте следующий код для инициализации фрейма, который показывает пробел, это должно решить вашу проблему;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MyFrame();
}
});
final
? Я попробую прямо сейчас, хотя это все равно будет странно! ПРИМЕЧАНИЕ: рамка не показывает ничего, ни собственные компоненты свинга, как только эти изображения используются!