【发布时间】:2011-07-05 07:13:59
【问题描述】:
设置外观有一个非常奇怪的错误。为了设置外观,我使用以下内容:
... String scheme = "net.sourceforge.atunes.gui.substance.SubstanceATunesSunLookAndFeel";
try {
UIManager.setLookAndFeel(scheme);
UIManager.put(LafWidget.ANIMATION_KIND, LafConstants.AnimationKind.NONE);
UIManager.put(SubstanceLookAndFeel.TABBED_PANE_CONTENT_BORDER_KIND, SubstanceConstants.TabContentPaneBorderKind.SINGLE_FULL);
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
} catch (ClassNotFoundException e) {
ExceptionHandler.handleSilently(e);
} catch (InstantiationException e) {
ExceptionHandler.handleSilently(e);
} catch (IllegalAccessException e) {
ExceptionHandler.handleSilently(e);
} catch (UnsupportedLookAndFeelException e) {
ExceptionHandler.handleSilently(e);
}
它放在main函数中:
SwingUtilities.invokeAndWait(new Runnable(){
public void run(){
...
}
在设置外观之前没有 gui 元素,因此无需执行 SwingUtilities.updateComponentTreeUI(...)。所以,一切都很好,但是一些用户报告了非常奇怪的包,其中包含未处理的窗口,例如: 启动程序时,用户会看到以下屏幕(仅当他将鼠标移到该区域上时才会出现按钮;在此之前,窗口不会显示这些按钮。
那么,谁能帮我找到正确的解决方案(我不问解决方案,我只是问解决问题的正确方法)。首先,我认为这是由于内存不足错误而发生的,但是用户计算机的配置是:
机器配置: 惠普 d530 CMT(DF373A) Windows 7 旗舰版,32 位,SP1 2GB 内存 NVIDIA GeForce FX 5700(1680x1050,32Bit Col 深度) Java 1.6.0_26所以,我猜 Out Of Memory 并非如此。 任何建议,请。
UPD:因此,每个 GUI 创建语句都被移到主函数中的一个 SwingUtilities.invokeLater() 语句中!但是,该问题仍然被一些用户重现。此外,现在知道,唯一的视图是如此奇怪,但它上面的每个按钮都按预期运行! (我的意思是在按下 Ok 按钮后,下一个 MVC 会显示并且看起来不错)。此错误仅发生在设置外观后立即创建的第一个窗口中。所以,我想这不是EDT使用不正确的情况,因为按钮监听器的执行。此外,我们的日志 (log4j) 看起来很棒,因为没有发生任何奇怪的事情!
谁能提出可能的原因?
解决方案 见http://java.sun.com/products/java-media/2D/perf_graphics.html 作为添加的命令行参数:
-Dsun.java2d.noddraw=true
【问题讨论】:
-
会不会是您从非 EDT 线程更新 UI?
-
@Joey non-EDT 也是我的第一个猜测——如果它不是 Substance:通常它会引发不在 EDT 上。另外:他/她声明第一个 sn-p 被放置在 invokeAndWait 中,以让它在 EDT 上运行
-
kleopatra:啊,不知道。我只记得非 EDT UI 更新确实会导致各种各样的视觉故障,但很高兴知道至少有一个 L&F 抛出(尽管 L&F 不应该负责这样做)。
-
@Joey 你能把 UPD 读出来吗?我猜,这是别的东西((
-
不知道什么是 UPD,但不知道。我发布了我的猜测,这是错误的。如果我有其他想法,我会这么说。
标签: java swing user-interface look-and-feel