5

首先,使用 gnome 不是一个选项(但可以安装它的库)。

我需要知道使用当前安装的 KDE 外观显示 Java Swing 桌面应用程序需要什么。理想情况下,该解决方案应该允许我应用类似于底层窗口系统的外观(即:Windows LNF 用于 Windows,GTK LNF 用于 Gnome(GTK),QT LNF 用于 KDE(QT),其他平台的默认设置)。

在 KDE 下,您也可以将其配置为使用 GTK 应用程序的当前 KDE 主题。因此,如果该解决方案适用于 GTK,那就没问题了。

当我在 Gnome (Ubuntu 8.04) 下运行以下代码时,Java 应用程序看起来很漂亮。它与其他应用程序集成得非常好:

try {
  // Set System L&F
  UIManager.setLookAndFeel(
  UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) { //Handle it }

但是,如果我在 Debian (Lenny) 下使用 KDE 运行相同的东西,则 UIManager.getSystemLookAndFeelClassName() 调用将返回 Java 默认值。如果我继续强制它使用 GTK LNF,应用程序将无法运行。有些字段是不可见的,有些是不合适的,一切都无法使用:

try {
  //Force the GTK LNF on top of KDE, but **it doesn't work**
  UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
} catch (Exception e) { /*Handle it*/ }

我也试过把下面的代码。它让用户选择任何一个可用的 LNF,然后尝试设置它。金属和主题工作正常。GTK 没有。滑块真的很乱。列表框看起来很难看并且消失了,但似乎可以工作。按钮和菜单看起来不错。相关代码如下所示:

(...)
    /** Creates new form SwingFrame */
    public SwingFrame() {

    initComponents();

    //Save all available lafs in a combobox
    cbLafs.removeAllItems();
    UIManager.LookAndFeelInfo[] lafs=UIManager.getInstalledLookAndFeels();

    for (int i=0,t=lafs.length;i<t;i++)
    {
        cbLafs.addItem(lafs[i]);
        System.out.println(lafs[i].getName());
    }

    }

public void changeLookAndFeel(String laf)
{
    //If not specified, get the default one
    if (laf==null) {
    laf=UIManager.getSystemLookAndFeelClassName();
    }

        try {
        // Set System L&F
        UIManager.setLookAndFeel(laf);
    }
    catch (Exception e) {
       // handle exception
        e.printStackTrace();
    }
    SwingUtilities.updateComponentTreeUI(this);

}

   private void cbLafsActionPerformed(java.awt.event.ActionEvent evt) {                                       
        // TODO add your handling code here:
        UIManager.LookAndFeelInfo laf=(UIManager.LookAndFeelInfo)cbLafs.getSelectedItem();
        if (laf==null)
            changeLookAndFeel(null);
        else
            changeLookAndFeel(laf.getClassName());
    }                                     

该系统的所有 GTK 应用程序(例如:Firefox)都按预期工作。所以:

1) 在 KDE 下运行 Java GTK LNF 应用程序的环境缺少什么?

2) JVM 检查什么以返回 GTK 作为默认系统主题?

谢谢你帮助路易斯费尔南多

PS->我也尝试过其他解决方案,例如 JGoodies、plain AWT 和 SWT。然而,使用 GTK LNF 的 Swing 将是避免 SWT 本机库和 JGoodies 额外 jar 的麻烦的最佳解决方案(此外,JGoodies LNF 看起来不像 Gnome 下的 Swing GTK 那样集成)。AWT 看起来很丑陋(类似主题)并且缺少很多功能。

4

4 回答 4

2

您可以从命令行设置外观:

java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp

此外,SwingSet2.jnlp提供了所有可以更改的不同内容的示例演示。来源和其他信息可以在这里找到:链接文本

于 2008-10-18T13:04:04.323 回答
1

引用文档:

  1. 如果系统属性swing.defaultlaf不为空,则使用其值作为默认外观类名称。

  2. 如果 Properties 文件swing.properties存在并包含 key swing.defaultlaf,则使用其值作为默认外观类名称。检查的位置swing.properties可能因 Java 平台的实现而异。在 Sun 的实现中,位置是${java.home}/lib/swing.properties

有关更多详细信息,请参阅正在使用的实现的发行说明。

但我 99% 确定您的问题是这个问题(再次引用文档):

一旦改变了外观和感觉,就必须调用updateUIall JComponents。该方法SwingUtilities.updateComponentTreeUI(java.awt.Component)可以轻松地将 updateUI 应用于包含层次结构。有关详细信息,请参阅它。未指定在更改外观后不调用 updateUI 的确切行为。很可能会收到意外的异常、绘画问题或更糟的情况。

如果您不想updateUI在 all上调用JComponents,请确保在所有其他摆动代码UIManager.setLookAndFeel 之前调用。

于 2008-10-17T19:30:25.137 回答
0

也许这有效:

try {
// sure look and feel
UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
// not-so-sure look and feel
System.setProperty("os.name", "Windows");
System.setProperty("os.version", "5.1");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} 
catch (Exception ex) {
ex.printStackTrace();
}
于 2008-10-17T03:29:29.900 回答
-1

GTK Laf 是,恕我直言,破碎的时期。它不支持某些随机设置。我相信它不应该尊重大多数组件上的任何setBackground()、setForeground() 或 setFont()。

如果您使用的是 java >1.4.2,我建议使用 MetalLookAndFeel [应该是 UIManager.getCrossPlatformLookAndFeelClassName()]。如果您使用 >1.6.0_u10,您可以尝试 NautilusLookAndFeel。我个人觉得金属更好看。

于 2009-05-09T01:23:07.153 回答