Нарушение качающейся нити
При отладке странного поведения в Swing я нашел следующие инструменты:CheckThreadViolationRepaintManager отредактированная версия Алекса Руиза. (Вы должны понять, что делает этот класс, прежде чем ответить на мой вопрос, спасибо)
И я нахожу нарушение потока в моем коде, но я не понимаю почему, потому что я использую SwingUtilities.invokeAndWait() везде.
Вот код, который вызывает ThreadViolation. Только последняя строка вызывает ошибку:
protected void display() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
asyncDisplay();
}
});
}
private void asyncDisplay(){
System.out.println("is in edt: " + SwingUtilities.isEventDispatchThread());
this.printedComponent.setVisible(true);
this.printedComponent.setOpaque(false);
this.setVisible(true);
}
И результат:
is in edt: true
exception: java.lang.Exception
java.lang.Exception
at fr.numvision.common.CheckThreadViolationRepaintManager.checkThreadViolations(CheckThreadViolationRepaintManager.java:31)
at fr.numvision.common.CheckThreadViolationRepaintManager.addDirtyRegion(CheckThreadViolationRepaintManager.java:25)
at javax.swing.JComponent.repaint(JComponent.java:4795)
at java.awt.Component.imageUpdate(Component.java:3516)
at javax.swing.JLabel.imageUpdate(JLabel.java:900)
at sun.awt.image.ImageWatched$WeakLink.newInfo(ImageWatched.java:132)
at sun.awt.image.ImageWatched.newInfo(ImageWatched.java:170)
at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:533)
at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:126)
at sun.awt.image.GifImageDecoder.sendPixels(GifImageDecoder.java:447)
at sun.awt.image.GifImageDecoder.parseImage(Native Method)
at sun.awt.image.GifImageDecoder.readImage(GifImageDecoder.java:596)
at sun.awt.image.GifImageDecoder.produceImage(GifImageDecoder.java:212)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:269)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:205)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:169)
Я действительно не понимаю, почему this.setVisible(true); вызвать нарушение потока (это JComponent), в то время как this.printedComponent.setVisible(true); не делают.
Спасибо,
1 ответ
Код, вызвавший исключение, не синхронизирован с вашим this.setVisible(true);
линия. Эта строка просто помечает компонент как требующий перерисовки, и фактическое событие перерисовки наступает позже setVisible()
вернулся. Похоже, происходит то, что какой-то другой код, каким-то образом причинно связанный с перерисовкой вашего компонента, передает некоторый код GUI во внешний поток.
Детали всего этого невозможно получить из количества кода, который вы разместили.