gpt4 book ai didi

java - Swing 线程违规

转载 作者:行者123 更新时间:2023-12-01 11:51:45 26 4
gpt4 key购买 nike

在调试 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(true); 会导致线程冲突(这是一个 JComponent),而 this.printedComponent.setVisible(true); 不会。

谢谢

最佳答案

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

所有这些细节不可能从您发布的代码量中得出。

关于java - Swing 线程违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com