Нарушение качающейся нити

При отладке странного поведения в 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 во внешний поток.

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

Другие вопросы по тегам