Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    metodo cambio look&feel

    nel mio programma ho una frame con tante altre componenti grafiche.
    In esso ho aggiunto l'opzione che possa essere cambiato l'aspetto del software,cambiando il look&feel ma ho usato per far ciò una procedura,a mio avviso,un pò forzata:
    la classe principale rappresenta una frame
    codice:
    //Costruttore
    public Pippo(String landf){
    UIManager.setLookAndFeel(landf);
    ........
    ......
    }
    //ora siamo nell'actionPerformed()
    //quando viene premuto un apposito item fai ciò per cambiare il look&feel:
    //es:
                    try{
    		 	this.setVisible(false);
    		 	new Pippo("javax.swing.plaf.metal.MetalLookAndFeel").setVisible(true);
    		}
    		catch(Exception ex){
    			ex.printStackTrace();
    		}
    		System.gc();              //"forza" il garbage collector
    esiste un metodo magari più efficace?(probabilmente si!)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: metodo cambio look&feel

    Originariamente inviato da zipangulu
    esiste un metodo magari più efficace?(probabilmente si!)
    Innanzitutto i L&F li puoi "enumerare" usando getInstalledLookAndFeels() di UIManager. E puoi quindi avere nome (tipicamente da mostrare all'utente) e nome classe del L&F.

    Poi comunque c'è una piccola questione su quando settare il L&F se è a seguito di un evento. Va fatto dopo che un evento è terminato (es. dopo che un actionPerformed() è terminato). E questo vuol dire che devi usare il solito invokeLater() per far sì che il set del nuovo L&F venga fatto dopo che l'evento corrente è terminato.
    Non mi ricordo ora dove l'ho letto ma ne sono sicuro (e adesso mi cercherò di nuovo la fonte).

    E se c'è qualcosa (frame, ecc...) di già aperto e vuoi applicare le modifiche, devi usare updateComponentTreeUI() di SwingUtilities.

    Comunque è tutto spiegato qui:
    How to Set the Look and Feel
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    ho capito tutto tranne:
    Innanzitutto i L&F li puoi "enumerare" usando getInstalledLookAndFeels() di UIManager. E puoi quindi avere nome (tipicamente da mostrare all'utente) e nome classe del L&F.
    a cosa mi servirebbe questa cosa?

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    conosco il metodo invokeLater() ma se io volessi settare il look&feel al termine dell'evento come dovrei invocare tale metodo?
    un esempio di codice?

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    andbin ti ha risposto a tutte e due le tue domande.
    Quel codice enumera i L&F disponibili sul PC di chi esegue la tua applicazione, impedendo che possa scegliere un L&F che magari lui non ha e tu sì, e hai messo in fase di sviluppo nel codice.

    E invokeLater() esegue dopo la terminazione dell'evento.
    al volante son nervoso

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zipangulu
    a cosa mi servirebbe questa cosa?
    Per avere un elenco dei L&F da mostrare es. come voci di un menù o di un combo box o una lista .... insomma permettere all'utente di scegliere lui un L&F in qualche modo.

    Originariamente inviato da zipangulu
    un esempio di codice?
    Ecco il mio solito esempio completo.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class LAFTestFrame extends JFrame implements ActionListener {
        public LAFTestFrame() {
            super("Look and feels test");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            Container contentPane = getContentPane();
            contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
    
            UIManager.LookAndFeelInfo[] lafiArray = UIManager.getInstalledLookAndFeels();
    
            for (int i = 0; i < lafiArray.length; i++) {
                LAFSelectButton lafButton = new LAFSelectButton(lafiArray[i]);
                contentPane.add(lafButton);
                lafButton.addActionListener(this);
            }
    
            pack();
        }
    
        public void actionPerformed(ActionEvent e) {
            LAFSelectButton lafButton = (LAFSelectButton) e.getSource();
    
            final String className = lafButton.getLAFClassName();
    
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    try {
                        UIManager.setLookAndFeel(className);
                        SwingUtilities.updateComponentTreeUI(LAFTestFrame.this);
                        pack();
                    } catch (Exception e) {
                        JOptionPane.showMessageDialog(LAFTestFrame.this,
                            "Error setting Look&Feel", "ERROR",
                            JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new LAFTestFrame().setVisible(true);
                }
            });
        }
    }
    
    
    class LAFSelectButton extends JButton {
        private UIManager.LookAndFeelInfo lafi;
    
        public LAFSelectButton(UIManager.LookAndFeelInfo lafi) {
            super(lafi.getName());
            this.lafi = lafi;
        }
    
        public String getLAFClassName() {
            return lafi.getClassName();
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.