设置外观有一个非常奇怪的错误。为了设置外观,我使用以下内容:
... 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(...)。所以,一切都很好,但一些用户报告非常奇怪的包包括未处理的窗口,如: 启动程序时,用户会看到以下屏幕(仅当用鼠标移动到此区域时,按钮才会出现;在此之前,窗口不会显示这些按钮。
那么,任何人都可以帮我找到正确的解决方案(我不问解决方案,我只是问正确的方法来解决它)。首先,我认为这是因为内存不足错误,但用户计算机的配置是:
Machine configuration: HP d530 CMT(DF373A) Windows 7 Ultimate, 32Bit,SP1 2GB Ram NVIDIA GeForce FX 5700 (1680x1050, 32Bit Col depth) Java 1.6.0_26
所以,我觉得Out Of Memory并非如此。 任何建议,请。
UPD:所以,每个GUI创建语句都被移动到main函数中的一个SwingUtilities.invokeLater()语句中!但是,一些用户仍然会重现这个问题。此外,现在已知,只有视图是如此奇怪,但它上面的每个按钮都按预期运行! (我的意思是在按下Ok按钮后,显示下一个MVC并且看起来很好)。只有在设置外观后立即创建的第一个窗口才会出现此错误。所以,我想这不是错误的EDT usig的情况,因为井按钮监听器的执行。此外,我们的日志(log4j)看起来很棒,因为没有什么奇怪的事情发生! 任何人都可以提出可能的原因吗?
解 见http://java.sun.com/products/java-media/2D/perf_graphics.html 作为添加的命令行参数:
-Dsun.java2d.noddraw=true
答案 0 :(得分:1)
同意@Joey
如果你有来自Kirill的Java.net的原始代码源,那么有很多例子可以告诉你
1)在
之前安装UIUIManager.installLookAndFeel("Substance " + sInfo.getDisplayName(), sInfo.getClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
someMainclass.setVisible(true);
}
});
2)您在try-catch
中打包所需的SwingUtilities.updateComponentTreeUI(someWindow)
问题
for (Window w : Window.getWindows()) {
SwingUtilities.updateComponentTreeUI(w);
}
3)或最安全的方式,确保提取点2dn的顶级容器
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(new SubstanceOfficeSilver2007LookAndFeel());
SwingUtilities.updateComponentTreeUI(frame);
} catch (UnsupportedLookAndFeelException e) {
throw new RuntimeException(e);
}
}
});
SwingUtilities.invokeLater(new Runnable() {
4)你可以切换主题,L& f,混合主题,但必须包含在InvokeLater()
5)
编辑:
@rauch正如我所提到的,Substance对EDT非常敏感,真的忘了在没有最深入了解EDT及其单线程规则的情况下从BackGround任务中替换Model,
嗯,我直接尝试使用替换模型,以避免一些arrayIndexException加上来自Substance的一些异常(我忘了那是一个月前),
你永远不会用javax.swing.Timer或SwingWorker欺骗它,有时候(我认为HightLighter ???或来自Trident.jar的东西拒绝正常工作???和overRun EDT队列)从来没有解决过这个细节,
我将所有内容(从Backgroung任务输出到GUI)包装到AbstractAction
编辑2.当我阅读@kleopatra
的评论时(错误地我忽略了她的建议)
would be my first guess as well - were it not Substance: usually it throws
on not being on the EDT. Plus: s/he states that the first snippet is placed
inside the invokeAndWait to let it run on the EDT
按照她的建议,Sustance
对L&f
拥有SwingX
,而对我SwingX == kleopatra
,我无法为你工作,因为我真的讨厌{{} 1}}我避免使用这种方法