【问题标题】:Gui problem with java substance Look And Feeljava实体外观的gui问题
【发布时间】: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


【解决方案1】:

同意@Joey

如果您有来自 Kirill 的 Java.net 的原始代码源,那么有很多示例可以向您展示

1) 之前安装 UI

UIManager.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 任务中替换模型,

嗯,我直接尝试使用替换模型来避免一些 a​​rrayIndexException 以及来自 Substance 的一些异常(我忘了那是几个月前的事了),

你永远不会用 javax.swing.Timer 或 SwingWorker 来欺骗它,有时(我认为 HightLighter ??? 或来自 Trident.jar 的东西拒绝正常工作??? 并溢出 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,我无法为您提供解决方法,因为我真的很讨厌 invokeAndWait,并且我避免使用这种方法

【讨论】:

  • @kleopatra :-) 为什么如果 L&F 教程谈论另一个选择?然后我会添加它们:-),这个线程显示可能的 EDT 问题不是 L&f 的问题,并且 Substance 最适合测试可能的 EDT 故障...
猜你喜欢
  • 2012-05-02
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多