UIManager.setLookAndFeel si applica solo a certi coponenti

di il
2 risposte

UIManager.setLookAndFeel si applica solo a certi coponenti

         try {
            UIManager.setLookAndFeel(new ESTRAI_DAL_DATABASE(con, utente).setLookAndFeel());
    
        } catch (Exception e) {
            System.out.println("nel main " + e);
        }
Ilcodice per forza lo devo mettere apena prima di initComponents perché mi servono con e utente... non so se mi spiego...
https://i.ibb.co/VpFPTWP/1.pn
La finestra a sinistra è la Home dove metto il codice che ho scritto qui sopra, quella a destra è una finestra che apro dalla Home
Se ci fate caso per esempio in alto è bianco mentre nella finestra a dx in alto è scuro come dovrebbe essere.
Non fate caso per ora alla tabella in basso a sinistra non capisco perché è bianco lo sfonto e in basso a destra non capisco perché non solo lo sfondo è chiaro ma non si vede la scritta admin... Grazie.

2 Risposte

  • Re: UIManager.setLookAndFeel si applica solo a certi coponenti

    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.
  • Re: UIManager.setLookAndFeel si applica solo a certi coponenti

    Grazie mille gentilissimo.Ho risolto mettendo il codie che avevo messo nella finestra accedi (che precede quella della home) ma quello che hai scritto mi potrebbe sicuramente tornare cmnq utile. Grazie ?
Devi accedere o registrarti per scrivere nel forum
2 risposte