如何在KDE上强制使用Java中的GTKLookAndFeel?

如何在KDE上强制使用Java中的GTKLookAndFeel?,java,swing,gtk,look-and-feel,kde,Java,Swing,Gtk,Look And Feel,Kde,首先,使用gnome不是一个选项(但是可以安装它的库) 我需要知道使用当前安装的KDE外观和KDE的感觉来显示JavaSwing桌面应用程序需要什么。理想情况下,该解决方案应该允许我应用一个看起来像底层窗口系统的外观(即:Windows LNF for Windows,GTK LNF for Gnome(GTK),QT LNF for KDE(QT),其他平台的默认外观) 在KDE下,您也可以将其配置为使用GTK应用程序的当前KDE主题。因此,如果该解决方案与GTK配合使用,就可以了 当我在Gn

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

我需要知道使用当前安装的KDE外观和KDE的感觉来显示JavaSwing桌面应用程序需要什么。理想情况下,该解决方案应该允许我应用一个看起来像底层窗口系统的外观(即:Windows LNF for Windows,GTK LNF for Gnome(GTK),QT LNF for 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 }
但是,如果我使用KDE在Debian(Lenny)下运行相同的东西,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());
    }                                     
(…)
/**创建新表单SwingFrame*/
公共SwingFrame(){
初始化组件();
//将所有可用的LAF保存在组合框中
cbLafs.removeAllItems();
UIManager.LookAndFeelInfo[]lafs=UIManager.getInstalledLookAndFeels();
对于(int i=0,t=lafs.length;我也尝试过其他解决方案,如JGoodies、普通AWT和SWT。但是,使用GTK LNF的Swing将是避免SWT本机库和JGoodies额外jar的麻烦的最佳解决方案(此外,JGoodies LNF看起来不像Gnome下的Swing GTK那样集成)。AWT看起来很可怕(类似motif)而且错过了很多功能。

也许这是可行的:

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();
}

引用文件:

  • 如果系统属性swing.defaultlaf
  • 为非空,则使用其 值作为默认的外观类名

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

  • 有关更多详细信息,请参阅所用实现的发行说明

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

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


    如果不想在所有
    JComponents
    上调用
    updateUI
    ,请确保在每隔一次swing代码之前调用
    UIManager.setLookAndFeel

    可以从命令行设置外观:

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


    此外,还提供了一个可以更改的所有不同内容的示例演示。源和其他信息可以在此处找到:

    GTK Laf是,IMHO,中断周期。它不支持一些随机设置。我相信它不应该支持大多数组件上的任何挫折()、设置前景()或设置字体()


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

    您好,我已经尝试了第一个选项。不知怎的,所有小部件都变得一团糟(错误的大小、缺少的项目、错误的点击位置,有些甚至没有显示)…在Java之外,所有GTK应用程序都运行良好,并且使用当前的KDE主题。我可以让这些代码只在Ubuntu(Gnome)上运行。谢谢,对我有用——但是Swing中的GTK比默认Swing更丑陋。很难相信;-/。连SwingSet2都不工作!滑块和组合框都坏了…但它们在gnome下工作。这是一个bug还是缺少什么(某些GTK库)?我敢打赌,如果SwingSet2不起作用,那么它可能是一个bug或缺少什么。好的。我在基础框架上使用updateUI,希望它能更新整个树。但是,控件仍然混乱。