首先,使用 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 看起来很丑陋(类似主题)并且缺少很多功能。