Java Look and Feel Resizing Window&不工作

时间:2017-03-27 17:08:55

标签: java swing user-interface look-and-feel contentpane

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

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 个答案:

答案 0 :(得分:2)

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

SwingUtilities.updateComponentTreeUI(getContentPane());

SwingUtilities.updateComponentTreeUI(NoteTaker.this);

应解决问题。