2017-03-27 23 views
0

所以我一直有一个关于外观和感觉的问题。我有一个改变外观和感觉的子菜单,但它没有做任何事情,它只调整窗口栏的大小。Java外观和感觉调整窗口和不工作

1)我有我的代码的问题是看和感觉不工作,甚至不顾更新UI

2)当我改变外观和感觉的文本区域改变大小的某些原因。

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

这是很多代码,请尝试将其更改为[mcve],以便我们可以复制粘贴并查看您的问题。这不是代码片段或您的整个代码,而是一个小的可运行示例,它演示了您的问题并编译了我们的部分不带修改 – Frakcool

回答

2

问题是,当您更新组件树UI时,您不更新菜单所在的部分。也就是说,菜单栏及其子组件do not驻留在内容窗格中。这可以通过简单地使用框架作为要更新的树的根来解决。因此,改变

SwingUtilities.updateComponentTreeUI(getContentPane()); 

SwingUtilities.updateComponentTreeUI(NoteTaker.this); 

应该解决这个问题。

+0

非常感谢!当我改变外观和感觉时,我也有一个问题,它也改变了文本区域大小。任何想法如何保持它不变? – Peerless

+0

@Perlessless我认为它与不同外观和感觉使用的字体有关。 Motif似乎使用固定大小的字体,因此它可以更好地估计所需的宽度,而金属需要考虑更宽的字符(以便W适合,使用更窄的字符可以适合超过45的文本区域)。 – kiheru

+0

谢谢,这很有道理。 – Peerless