2

我正在尝试设置通过 Web 浏览器使用的 Java 小程序的外观 (LAF)。我希望设置系统默认 LAF,但在浏览器中加载时,小程序返回到 Metal LAF。当我将它作为独立小程序运行时,LAF 已正确应用。我向用户展示的唯一项目是 JFileChooser。我尝试了多种方法来克服这个问题,包括:

1) 覆盖小程序的 start() 方法:

@Override
public void start() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.updateComponentTreeUI(this);
        System.out.println("LOOK AND FEEL SET!");
    }
    catch (Exception ex) {
        System.out.println(ex);
    }
}

2)在小程序类的静态初始化器中设置:

static {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        System.out.println("LOOK AND FEEL SET!");
    }
    catch (Exception ex) {
        System.out.println(ex);
    }
}

3)在小程序的构造函数中设置:

public MyApplet() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.updateComponentTreeUI(this);
        System.out.println("LOOK AND FEEL SET!");
    }
    catch (Exception ex) {
        System.out.println(ex);
    }
}

我正在使用 Java 6,但在 Windows 上针对 Java 5。在任何情况下,外观和感觉设置!被打印到控制台,所以我知道它设置它没有抛出异常。这与浏览器无关(使用 Firefox 3.6 和 IE7)。 为什么要这样做,我怎样才能让它尊重我指定的 LAF?

4

3 回答 3

0

我在最近开发的一个小程序中使用了这段代码:

public void init() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception ex) {
        // Just accept the default L&F
    }
    SwingUtilities.updateComponentTreeUI(this);
    super.init();

    // Now add components...
}

另请参阅后续显示上的小程序窗口更改的外观(我没有解决这个问题,因为我的小程序不需要打开弹出窗口。)

于 2010-02-20T16:24:23.280 回答
0

所以我尝试了 finnw 的答案并将其标记为接受,但没有意识到我还对我的代码进行了一些其他修改。当我清理代码时,我删除了我的 mod 并留下了 finnw 的,但后来它又坏了。

这些是有效的改变:

JFileChooser chooser = new JFileChooser();

try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    SwingUtilities.updateComponentTreeUI(chooser);
}
catch (Exception ex) {
    System.out.println(ex);
}

所以我最终在这里做的是彻底设置文件选择器的外观,而不是试图为整个小程序强制 LAF。这是一种 hack,但文件选择器是用户甚至可以看到的 UI 的唯一部分。

于 2010-02-20T21:02:27.730 回答
0

似乎每个小程序都犯过一个不为人知的错误。Swing(也是 AWT 组件)在 AWT 事件调度线程 (EDT) 之外使用。小程序线程模型有点古怪。

这是invokeAndWait应该与这个极端样板一起使用的一次:

@Override public void init() {
     try {
         java.awt.EventQueue.invokeAndWait(new Runnable() { public void run() {
             initEDT();
         }});
    } catch (java.lang.InterruptedException exc) {
         Thread.currentThread().interrupt();
    } catch (java.lang.reflect.InvocationTargetException exc) {
         throw new Error(exc.getCause());
    }
}
于 2010-02-22T05:35:37.140 回答