2017-06-12 3 views
1

Je veux mettre à jour mon apparence par JRadioButtonMenuItem. Et je recherche dans Stackoverflow mais ce que je trouve était un gros tas de code dans une classe. Pour moi, en tant que débutant, il est plus facile de séparer la fonction dans une classe spéciale. C'est ma classe d'images.Comment mettre à jour look and feel clean séparer dans une classe?

public class CalenderFrame extends JFrame { 

public CalenderFrame() throws HeadlessException { 
    createFrame(); 
} 
public void createFrame() { 
    setJMenuBar(CalenderMenuBar.getInstance().createMenu()); 

    setTitle("Calender"); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setPreferredSize(new Dimension(400, 300)); 
    pack(); 
    setLocationRelativeTo(null); 
    setVisible(true); 
} 
} 

Et c'est ma classe MenueBar. Je donne juste un court code qui est spécifique à cette question. Cette classe est un singleton.

public JMenuBar createMenu() { 
JMenu lookAndFeelMenu = new JMenu("Look & Feel"); 
     JRadioButtonMenuItem lAndFWindowsItem = new JRadioButtonMenuItem("Windows",true); 
     lAndFWindowsItem.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() == lAndFWindowsItem) { 
        lAndFAction(1); 
       } 
      } 
     }); 
     JRadioButtonMenuItem lAndFMetalItem = new JRadioButtonMenuItem("Metal",false); 
     lAndFMetalItem.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() == lAndFMetalItem) { 
        lAndFAction(2); 
       } 
      } 
     }); 
     JRadioButtonMenuItem lAndFMotifItem = new JRadioButtonMenuItem("Motif", false); 
     lAndFMotifItem.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (e.getSource() == lAndFMotifItem) { 
        lAndFAction(3); 
       } 
      } 
     }); 
     ButtonGroup group = new ButtonGroup(); 
     group.add(lAndFWindowsItem); 
     group.add(lAndFMetalItem); 
     group.add(lAndFMotifItem); 

     lookAndFeelMenu.add(lAndFWindowsItem); 
     lookAndFeelMenu.add(lAndFMetalItem); 
     lookAndFeelMenu.add(lAndFMotifItem); 
    } 

public void lAndFAction(int counter) { 
     try { 
     String plaf = ""; 
     if (counter == 1) { 
      plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; 
     } else if (counter == 2) { 
      plaf = "javax.swing.plaf.metal.MetalLookAndFeel"; 
     } else if (counter == 3) { 
      plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; 
     } 

     UIManager.setLookAndFeel(plaf); 
     //SwingUtilities.updateComponentTreeUI(this); 


    } catch (UnsupportedLookAndFeelException ue) { 
     System.err.println(ue.toString()); 
    } catch (ClassNotFoundException ce) { 
     System.err.println(ce.toString()); 
    } catch (InstantiationException ie) { 
     System.err.println(ie.toString()); 
    } catch (IllegalAccessException iae) { 
     System.err.println(iae.toString()); 
    } 
    } 
} 

J'espère que vous pouvez m'aider.

Répondre

2

Je ne sais pas exactement quel est votre problème. Mais, vous devez mettre à jour vos composants après avoir changé le LaF. Selon le Look and Feel Documentation:

Changer l'apparence après le démarrage

Vous pouvez modifier l'interface graphique L & F avec setLookAndFeel même après du programme est visible. Pour que les composants existants reflètent la nouvelle L & F, appelez la méthode updateComponentTreeUI de SwingUtilities une fois par conteneur de niveau supérieur . Vous pouvez ensuite redimensionner chaque conteneur de niveau supérieur pour refléter les nouvelles tailles de ses composants contenus. Pour exemple:

UIManager.setLookAndFeel(lnfName); 
SwingUtilities.updateComponentTreeUI(frame); 
frame.pack(); 

Par conséquent, vous auriez besoin d'une référence au cadre de support des composants de votre interface utilisateur. Une idée serait en train de faire quelque chose comme:

public class CalendarMenuBar { 
    // Add this field to tour factory 
    private static JFrame frameThatWillBeUpdated; 

    // ... (Your code goes here) 

    // update this method to receive the reference of the frame which will 
    // need to be refreshed (update the GUI) 
    public JMenuBar createMenu(JFrame frame) { 
     // sets the reference for the frame 
     frameThatWillBeUpdated = frame; 

     // ... (the rest of your code for this method) 
    } 

    // ... 

    // Update this method to refresh the frame 
    public void lAndFAction(int counter) { 
     try{ 
      // ... (your code) 

      // Set the LaF 
      UIManager.setLookAndFeel(plaf); 
      // Update the component tree (frame and its children) 
      SwingUtilities.updateComponentTreeUI(frameThatWillBeUpdated); 
      // repack to resize 
      frame.pack(); 

     } catch(Exception ex){ 
      // Your catches 
     } 
    } 
} 

Et voici comment vous l'utilisez lors de la création de votre cadre (intérieur de votre CalenderFrame classe):

public void createFrame() { 
    // use this frame as reference 
    setJMenuBar(CalenderMenuBar.getInstance().createMenu(this)); 

    // ... (your code goes here) 
} 
+0

Ty tant il fonctionne –

+0

@JeredBlockDev si cette réponse résolu votre problème, envisagez [Accepting it] (https://stackoverflow.com/help/someone-answers) –