В отладке странного поведения в Swing я нашел следующие инструменты: CheckThreadViolationRepaintManager отредактировал версию Alex Ruiz. (Вы должны понять, что делает этот класс, прежде чем отвечать на мой вопрос, спасибо)Нарушение качающейся нити
И я устанавливаю нарушение потока в своем коде, но я не понимаю, почему, потому что я использую 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 (правда); вызывает нарушение потока (это JComponent), а this.printedComponent.setVisible (true); dont.
Спасибо,
Это вызывает нарушение, если поток, из которого был вызван 'setVisible', не был EDT. Причина, по которой может повлиять последняя строка, так как это может быть метод, соединяющий компонент с нативным равноправным узлом и запускающий процесс перерисовки, но это все угадывает работу, и для этого требуется пример выполнения. – MadProgrammer
@MadProgrammer, пожалуйста, чтобы прочитать OPs вопрос и мои комментарии, чтобы ответить Марко Топольник – mKorbel
У вас есть класс «CheckThreadViolationRepaintManager» и как он был установлен? – MadProgrammer