Hi,
ich biete meinen Usern an im laufenden Betrieb meiner Anwendung das Look and Feel zu ändern. Dabei biete ich ihnen einige Standard-, JGoodies und Substance-LaFs an. Die Auswahl wird dann als Property gespeichert und ggf. beim nächsten Start wiederhergestellt.
Ich habe keine Probleme mit den Standard- und dem JGoodies-LaF. Allerdings verursacht Substance in unregelmäßigen Abständen nicht nachvollziehbar und an unterschiedlichen Stellen einen Fehler. Der Fehler wird entweder ohne Zutun meiner Klasse im LaF direkt geworfen, oder beim Ändern des LaFs durch die Methode SwingUtilities#updateComponentTreeUI. Dabei habe ich schon alle möglichen Exceptions bekommen - von StringIndexOutOfBounds über ArrayIndexOutOfBounds und NullPointer bis hin zu OutOfMemory. Teilweise (auch hier wieder unregelmäßig und nicht nachvollziehbar) werden mit Substance auch nicht alle Daten in z. B. einer JList angezeigt. Erst bei der Änderung des LaFs wird dann alles angezeigt.
Mache ich beim setzen des LaFs etwas falsch? Kann mir kaum Vorstellen, dass Substance (was ja doch relativ häufig eingesetzt wird) so verbugt ist.
Ich habe die Methode "setLaf". Diese setzt je nach übergebenen String das LaF, verändert die Properties-Datei und sagt meinem Hauptfenster, dass es die Componenten updaten soll:
Diese Methode wird jedesmal aufgerufen, wenn der User über ein JRadioButtonMenuItem ein anderes LaF auswählt. Außerdem wird diese Methode auch beim Start des Programms aufgerufen - dann aber mit einem SwingUtilities.invokeAndWait außenrum
Für JGoodies- und den Standard-Lafs könnte ich mir das invokeAndWait sparen, Substance benötigt es aber, da sonst (wie könnte es auch anders sein) in unregelmäßigen Abständen eine Exception geworfen wird. Auch diese Exception variiert.
In der Methode updateUI meins Hauptframes geschieht dann eigentlich nur noch folgendes:
Wenn mir jetzt jemand meinen Fehler zeigen könnte, wäre ich euch sehr verbunden :-D . Hoffe mal, dass ich keine relevanten Informationen verschwiegen habe.
Danke!
ich biete meinen Usern an im laufenden Betrieb meiner Anwendung das Look and Feel zu ändern. Dabei biete ich ihnen einige Standard-, JGoodies und Substance-LaFs an. Die Auswahl wird dann als Property gespeichert und ggf. beim nächsten Start wiederhergestellt.
Ich habe keine Probleme mit den Standard- und dem JGoodies-LaF. Allerdings verursacht Substance in unregelmäßigen Abständen nicht nachvollziehbar und an unterschiedlichen Stellen einen Fehler. Der Fehler wird entweder ohne Zutun meiner Klasse im LaF direkt geworfen, oder beim Ändern des LaFs durch die Methode SwingUtilities#updateComponentTreeUI. Dabei habe ich schon alle möglichen Exceptions bekommen - von StringIndexOutOfBounds über ArrayIndexOutOfBounds und NullPointer bis hin zu OutOfMemory. Teilweise (auch hier wieder unregelmäßig und nicht nachvollziehbar) werden mit Substance auch nicht alle Daten in z. B. einer JList angezeigt. Erst bei der Änderung des LaFs wird dann alles angezeigt.
Mache ich beim setzen des LaFs etwas falsch? Kann mir kaum Vorstellen, dass Substance (was ja doch relativ häufig eingesetzt wird) so verbugt ist.
Ich habe die Methode "setLaf". Diese setzt je nach übergebenen String das LaF, verändert die Properties-Datei und sagt meinem Hauptfenster, dass es die Componenten updaten soll:
Code:
public void setLaF(String laf) {
// ...
else if (laf.equals("creme")) {
UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceCremeLookAndFeel");
}
// ...
frame.updateUI(laf);
Data.setProperty(PropertyHolder.LAF, laf);
}
Diese Methode wird jedesmal aufgerufen, wenn der User über ein JRadioButtonMenuItem ein anderes LaF auswählt. Außerdem wird diese Methode auch beim Start des Programms aufgerufen - dann aber mit einem SwingUtilities.invokeAndWait außenrum
Code:
public class Control implements Communi {
public Control() {
frame = new MainFrame();
System.setErr(new ErrorPrintStream());
Data.init(new File(ToolBox.getMainDir(getClass()) + "/props/props.inf"));
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
setLaF(Data.getValue(Data.LAF));
}
});
}
catch (InterruptedException e1) {
e1.printStackTrace();
}
catch (InvocationTargetException e1) {
e1.printStackTrace();
}
// ...
}
// ..
}
Für JGoodies- und den Standard-Lafs könnte ich mir das invokeAndWait sparen, Substance benötigt es aber, da sonst (wie könnte es auch anders sein) in unregelmäßigen Abständen eine Exception geworfen wird. Auch diese Exception variiert.
In der Methode updateUI meins Hauptframes geschieht dann eigentlich nur noch folgendes:
Code:
public void updateUI(String laf) {
// je nach übergebenen String ein JRadioButtonMenuItem selektieren
// ..
else if (sel.equals("mistaqua")) {
mistaqua.setSelected(true);
}
// ..
// Alle Panels, Menus, ... updaten
SwingUtilities.updateComponentTreeUI(this);
SwingUtilities.updateComponentTreeUI(dbInpExp);
SwingUtilities.updateComponentTreeUI(ipanel);
SwingUtilities.updateComponentTreeUI(spanel);
SwingUtilities.updateComponentTreeUI(rpanel);
SwingUtilities.updateComponentTreeUI(adialog);
rpanel.updateChooserUI();
ipanel.updateExtUI();
}
Wenn mir jetzt jemand meinen Fehler zeigen könnte, wäre ich euch sehr verbunden :-D . Hoffe mal, dass ich keine relevanten Informationen verschwiegen habe.
Danke!