Прежде всего, использование gnome не вариант (но есть возможность установить его библиотеки).
Мне нужно знать, что необходимо для отображения настольного приложения Java Swing, используя текущий установленный внешний вид KDE. В идеале решение должно позволить мне применить внешний вид, который выглядит как базовая оконная система (то есть: Windows LNF для Windows, GTK LNF для Gnome (GTK), QT LNF для KDE (QT), по умолчанию для других платформ. ).
В KDE вы можете настроить его на использование текущей темы KDE и для приложений GTK. Так что, если решение работает с 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) Чего не хватает в среде, чтобы приложение Java GTK LNF работало под KDE?
2) Что проверяет JVM для возврата GTK в качестве системной темы по умолчанию?
Спасибо за помощь
Луис Фернандо
PS-> Я пробовал и другие решения, такие как JGoodies, обычный AWT и SWT. Тем не менее, Swing с GTK LNF был бы лучшим решением, чтобы избежать хлопот с нативными библиотеками SWT и дополнительными банками JGoodies (также JGoodies LNF выглядит не так интегрированно, как Swing GTK под Gnome). AWT выглядит отвратительно (похоже на мотив) и пропускает множество функций.