2017-03-27 6 views
0

J'ai donc eu un problème concernant Look and Feel. J'ai un sous-menu qui change d'apparence mais ne fait rien, il ne fait que redimensionner la barre de la fenêtre.Java Look And Feel Redimensionner la fenêtre et ne pas fonctionner

1) Le problème que j'ai avec mon code est Look and feel ne fonctionne pas, malgré la mise à jour même l'interface utilisateur

2) Quand je change l'apparence et de la zone de texte modifie la taille pour une raison quelconque.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class NoteTaker extends JFrame 
{ 
    // Constants for set up of the note taking area 
    public static final int WIDTH = 600; 
    public static final int HEIGHT = 300; 
    public static final int LINES = 13; 
    public static final int CHAR_PER_LINE = 45; 

    // Objects in GUI 
    private JTextArea theText; // Text area to take notes 
    private JMenuBar mBar;  // Horizontal menu bar 
    private JPanel textPanel; // Scrolling text area panel 
    private JMenu notesMenu; // Vertical menu for notes 

    // THESE ITEMS ARE NOT YET USED 
    // YOU WILL BE CREATING THEM IN THIS LAB 
    private JMenu viewMenu; // Vertical menu for views 
    private JMenu lafMenu; // Vertical menu look and feel 
    private JMenu sbMenu; // Vertical menu for scroll bar 
    private JScrollPane scrolledText; // Scroll bars 

    // Default notes 
    private String note1 = "No Note 1."; 
    private String note2 = "No Note 2."; 

    /** 
     Constructor 
    */ 

    public NoteTaker() 
    { 
     // Create a closeable JFrame with a specific size 
     super("Note Taker"); 
     setSize(WIDTH, HEIGHT); 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

     // Get contentPane and set layout of the window 
     Container contentPane = getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     // Creates the vertical menus 
     createNotes(); 
     createViews(); 

     // Creates horizontal menu bar and 
     // adds vertical menus to it 
     mBar = new JMenuBar(); 
     mBar.add(notesMenu); 
     mBar.add(viewMenu); 
     // ADD THE viewMenu TO THE MENU BAR HERE 
     setJMenuBar(mBar); 

     // Creates a panel to take notes on 
     textPanel = new JPanel(); 
     textPanel.setBackground(Color.blue); 
     theText = new JTextArea(LINES, CHAR_PER_LINE); 
     theText.setBackground(Color.white); 

     // CREATE A JScrollPane OBJECT HERE CALLED 
     // scrolledText AND PASS IN theText, THEN 
     scrolledText = new JScrollPane(theText); 
     // CHANGE THE LINE BELOW BY PASSING IN scrolledText 
     textPanel.add(scrolledText); 
     contentPane.add(textPanel, BorderLayout.CENTER); 
    } 

    /** 
     Creates vertical menu associated with Notes 
     menu item on menu bar. 
    */ 

    public void createNotes() 
    { 
     notesMenu = new JMenu("Notes"); 
     JMenuItem item; 

     item = new JMenuItem("Save Note 1"); 
     item.addActionListener(new MenuListener()); 
     notesMenu.add(item); 

     item = new JMenuItem("Save Note 2"); 
     item.addActionListener(new MenuListener()); 
     notesMenu.add(item); 

     item = new JMenuItem("Open Note 1"); 
     item.addActionListener(new MenuListener()); 
     notesMenu.add(item); 

     item = new JMenuItem("Open Note 2"); 
     item.addActionListener(new MenuListener()); 
     notesMenu.add(item); 

     item = new JMenuItem("Clear"); 
     item.addActionListener(new MenuListener()); 
     notesMenu.add(item); 

     item = new JMenuItem("Exit"); 
     item.addActionListener(new MenuListener()); 
     notesMenu.add(item); 
    } 

    /** 
     Creates vertical menu associated with Views 
     menu item on the menu bar. 
    */ 

    public void createViews() 
    { 
     viewMenu = new JMenu("Views"); // Creates Menu Item called Views on horizontal Menu Bar 

     createLookAndFeel(); //Creates submenu Look And Feel 
     lafMenu.addActionListener(new MenuListener()); 

     createScrollBars(); //Creates submenu Scroll Bars 
     sbMenu.addActionListener(new MenuListener()); 
    } 

    /** 
     Creates the look and feel Sub menu. 
    */ 

    public void createLookAndFeel() 
    { 
     lafMenu = new JMenu("Look and Feel"); //Creates Menu Item called Look and Feel 
     viewMenu.add(lafMenu); 

     //Adds Menu item metal 
     JMenuItem itemMetal; 
     itemMetal = new JMenuItem("Metal"); 
     itemMetal.addActionListener(new MenuListener()); 
     lafMenu.add(itemMetal); 

     //Adds Menu item Motif 
     JMenuItem itemMotif; 
     itemMotif = new JMenuItem("Motif"); 
     itemMotif.addActionListener(new MenuListener()); 
     lafMenu.add(itemMotif); 

     //Adds Menu item Windows 
     JMenuItem itemWindows; 
     itemWindows = new JMenuItem("Windows"); 
     itemWindows.addActionListener(new MenuListener()); 
     lafMenu.add(itemWindows); 
    } 

    /** 
     Creates the scroll bars submenu. 
    */ 

    public void createScrollBars() 
    { 
     sbMenu = new JMenu("Scroll Bars"); 
     viewMenu.add(sbMenu); 

     //Adds MenuItem called Never 
     JMenuItem itemNever; 
     itemNever = new JMenuItem("Never"); 
     itemNever.addActionListener(new MenuListener()); 
     sbMenu.add(itemNever); 

     //Adds Menu item Always 
     JMenuItem itemAlways; 
     itemAlways = new JMenuItem("Always"); 
     itemAlways.addActionListener(new MenuListener()); 
     sbMenu.add(itemAlways); 

     //Adds Menu item As Needed 
     JMenuItem itemAsNeeded; 
     itemAsNeeded = new JMenuItem("As Needed"); 
     itemAsNeeded.addActionListener(new MenuListener()); 
     sbMenu.add(itemAsNeeded); 
    } 

    /** 
     Private inner class that handles the Menu object's 
     action events. 
    */ 

    private class MenuListener implements ActionListener 
    { 

     public void actionPerformed(ActionEvent e) 
     { 
     String actionCommand = e.getActionCommand(); 
     if (actionCommand.equals("Save Note 1")) 
      note1 = theText.getText(); 
     else if (actionCommand.equals("Save Note 2")) 
      note2 = theText.getText(); 
     else if (actionCommand.equals("Clear")) 
      theText.setText(""); 
     else if (actionCommand.equals("Open Note 1")) 
      theText.setText(note1); 
     else if (actionCommand.equals("Open Note 2")) 
      theText.setText(note2); 
     else if (actionCommand.equals("Exit")) 
      System.exit(0); 
     // ADD 6 BRANCHES TO THE ELSE-IF STRUCTURE 
     // TO ALLOW ACTION TO BE PERFORMED FOR EACH 
     // MENU ITEM YOU HAVE CREATED 
     else if (actionCommand.equals("Metal")) { 
      try { 
       UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
       SwingUtilities.updateComponentTreeUI(getContentPane()); 
      } catch (Exception e1) { 
       JOptionPane.showMessageDialog(null, "Error for Look and Feel"); 
       System.exit(0); 
      } 
     } else if (actionCommand.equals("Motif")) { 
      try { 
       UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 
       SwingUtilities.updateComponentTreeUI(getContentPane()); 
      } catch (Exception e1) { 
       JOptionPane.showMessageDialog(null, "Error setting the look and feel."); 
       System.exit(0); 
      } 
     } else if (actionCommand.equals("Windows")) { 
      try { 
       UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
       SwingUtilities.updateComponentTreeUI(getContentPane()); 
      } catch (Exception e1) { 
       JOptionPane.showMessageDialog(null, "Error setting the look and feel."); 
       System.exit(0); 
      } 
     } else if (actionCommand.equals("Never")) { 
      scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
      SwingUtilities.updateComponentTreeUI(getContentPane()); 
      scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
      SwingUtilities.updateComponentTreeUI(getContentPane()); 
     } else if (actionCommand.equals("Always")) { 
      scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
      SwingUtilities.updateComponentTreeUI(getContentPane()); 
      scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
      SwingUtilities.updateComponentTreeUI(getContentPane()); 
     } else if (actionCommand.equals("As Needed")) { 
      scrolledText.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
      SwingUtilities.updateComponentTreeUI(getContentPane()); 
      scrolledText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
      SwingUtilities.updateComponentTreeUI(getContentPane()); 
     } 
     else { 
      theText.setText("Error in memo interface"); 
     } 
    } 
} 

    /** 
     The main method creates an instance of the 
     NoteTaker class which causes it to display 
     its window. 
    */ 

    public static void main(String[] args) 
    { 
     NoteTaker gui = new NoteTaker(); 
     gui.setVisible(true); 
    } 
} 
+1

C'est beaucoup de code, essayez de le changer en [mcve] que nous pouvons copier-coller et voir votre problème. Ce n'est pas un extrait de code ou tout votre code, mais un petit exemple exécutable qui illustre votre problème et compile sans modifications de notre part – Frakcool

Répondre

2

Le problème est que lorsque vous mettez à jour l'interface utilisateur de l'arborescence des composants, vous ne mettez pas à jour la partie où se trouve le menu. C'est-à-dire que la barre de menus et ses sous-composants do not résident dans le volet de contenu. Cela peut être corrigé en utilisant simplement le cadre comme la racine de l'arbre à mettre à jour. Donc changer

SwingUtilities.updateComponentTreeUI(getContentPane()); 

à

SwingUtilities.updateComponentTreeUI(NoteTaker.this); 

devrait résoudre le problème.

+0

Merci beaucoup! J'ai aussi eu une question quand je change de look et de feeling ça change aussi la taille de la zone de texte. Une idée de comment le garder constant? – Peerless

+0

@Peerless Je pense qu'il est lié aux polices utilisées par les différents look & feel. Motif semble utiliser une police de taille fixe pour mieux estimer la largeur nécessaire, tandis que le métal doit tenir compte des caractères plus larges (de sorte que W s'adapte, en utilisant des caractères plus étroits, plus de 45 dans la zone de texte). – kiheru

+0

merci qui a beaucoup de sens. – Peerless