p0ll0_ ha scritto:
Ilcodice per forza lo devo mettere apena prima di initComponents perché mi servono con e utente... non so se mi spiego...
Facciamo una premessa. Se si imposta il L&F prima di aprire qualunque frame/dialog, non ci sono particolari questioni. Questo avviene ad esempio quando si fa il UIManager.setLookAndFeel nel main() prima di fare la creazione della GUI.
Se invece ci sono finestre/dialog già aperte, la questione cambia. In questi scenari la scelta del L&F viene fatta tipicamente tramite menù, pulsanti, combobox o che altro. In pratica il cambio del L&F avviene a seguito di un "evento". In questo caso bisogna fare le cose in un certo modo ben preciso.
Innanzitutto il UIManager.setLookAndFeel NON va fatto direttamente in risposta all'evento es.
public void actionPerformed(ActionEvent event) {
UIManager.setLookAndFeel( ..... ); // NOOO
...
}
In risposta all'evento bisogna creare un Runnable in cui fare il setLookAndFeel, da schedulare con il "solito" invokeLater, perché l'evento attuale
deve terminare e il setLookAndFeel deve essere eseguito nel contesto di nuovo evento "pulito" sul event queue.
Inoltre, per ogni finestra che eventualmente è già stata visualizzata, va invocato SwingUtilities.updateComponentTreeUI(frame); per assicurare l'aggiornamento della UI. Dopo il updateComponentTreeUI può essere utile fare un pack() su ciascun frame affinché si adatti al nuovo L&F.
In pratica, qualcosa tipo:
public void actionPerformed(ActionEvent event) {
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(" ..... ");
SwingUtilities.updateComponentTreeUI(frameXyz);
frameXyz.pack();
} catch (Exception ex) {
// ....
}
});
}
Tutto questo è ben spiegato nel libro "The Definitive Guide to Java Swing" (su cui avevo studiato) e qualcosa a riguardo lo si trova anche sul tutorial Oracle.