我需要知道如何在当前安装的KDE外观下显示Java Swing桌面应用程序所需的内容。理想情况下,解决方案应该允许我应用与底层窗口系统相似的外观(例如:Windows LNF适用于Windows,GTK LNF适用于Gnome(GTK),QT LNF适用于KDE(QT),其他平台的默认LNF)。
在KDE下,您可以配置它使用当前KDE主题来为GTK应用程序提供服务。因此,如果该解决方案适用于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,然后尝试设置它。Metal和Motif工作正常。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作为默认的系统主题?
感谢您的帮助。 Luis Fernando
注:我已经尝试了其他解决方案,比如JGoodies、纯AWT和SWT。然而,Swing与GTK LNF是最好的解决方案,因为它避免了SWT本地库和JGoodies额外的jar文件的麻烦(此外,在Gnome下,JGoodies LNF看起来没有Swing GTK那么集成)。AWT看起来很难看(像motif),并且缺少很多功能。