0

在 Swing 中调试一个奇怪的行为时,我发现了这个工具: Alex Ruiz 编辑的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); this.printedComponent.setVisible(true);时导致线程冲突(这是一个 JComponent );不。

谢谢,

4

1 回答 1

1

导致异常的代码与您的this.setVisible(true);行不同步。该行只是将组件标记为需要重新绘制,并且实际的重新绘制事件稍后会出现,afersetVisible()已经返回。似乎正在发生的事情是一些其他代码,不知何故与组件的重新绘制有因果关系,将一些 GUI 代码提交给外部线程。

这一切的细节是不可能从你发布的代码量中得出的。

于 2015-02-27T09:56:51.920 回答