从/向JMenuBar删除/添加JMenu

时间:2017-07-17 22:56:09

标签: java swing jmenu jmenubar

我正在尝试从JMenuBar中删除/添加JMenu但它不起作用。 似乎所使用的事件不会从JMenuBar中删除JMenu。

这是我正在使用的代码:

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

public class Try1 {
    private JFrame mainframe;

    public Try1(){
        prepareGUI();
    }
    public static void main(String[] args){
        Try1 try1 = new Try1();
        try1.showMenuDemo();

    }
    private void prepareGUI(){
        mainframe = new JFrame("Java SWING Examples");
        mainframe.setSize(800, 400);
        mainframe.setLayout(new GridLayout(16,1));

        mainframe.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent windowEvent){
                System.exit(0);
            }
        });

    }

    private void showMenuDemo(){
        //create a menu bar
        final JMenuBar menuBar = new JMenuBar();

        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");
        JMenu CutMenu = new JMenu("Cut");
        JMenu aboutMenu = new JMenu("About");

        JMenuItem newMenuItem = new JMenuItem("New");


        final JCheckBoxMenuItem showWindowMenu = new JCheckBoxMenuItem("Show Cut",true);
        showWindowMenu.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e){
                if(showWindowMenu.getState()){
                    System.out.println(showWindowMenu.getState());
                    menuBar.add(CutMenu);
                } else{
                    System.out.println(showWindowMenu.getState());
                    menuBar.remove(CutMenu);
                }
            }
        });
        fileMenu.add(newMenuItem);
        fileMenu.add(showWindowMenu);

        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(aboutMenu);
        menuBar.add(CutMenu);


        mainframe.setJMenuBar(menuBar);
        mainframe.setVisible(true);
    }
}

任何想法为什么只有当menuBar.add(aboutMenu)的swich位置与menuBar(CutMenu)一起工作?

2 个答案:

答案 0 :(得分:1)

您需要在对其进行更改后重新验证并重新绘制菜单栏,就像添加或删除其组件的任何其他容器一样:

showWindowMenu.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent e) {
        if (showWindowMenu.getState()) {
            System.out.println(showWindowMenu.getState());
            menuBar.add(CutMenu);
        } else {
            System.out.println(showWindowMenu.getState());
            menuBar.remove(CutMenu);
        }

        // ************** add this ****************
        menuBar.revalidate();
        menuBar.repaint();
    }
});

在这种情况下你不一定需要重新验证,因为剪切菜单在最后,但最好有它,因为如果你删除或更改不在前端的菜单组件,将会如果你不打电话revalidate(),那就差一点了。您可以通过删除about菜单进行测试,以查看是否需要revalidate()

答案 1 :(得分:0)

添加/删除剪切菜单后,只需添加一行代码即可。您需要再次重新绘制菜单栏以查看更改。

  ` public void itemStateChanged(ItemEvent e) {
     if (showWindowMenu.getState()) {
      System.out.println(showWindowMenu.getState());
      menuBar.add(CutMenu);
    } else {
      System.out.println(showWindowMenu.getState());
      menuBar.remove(CutMenu);
    }
    //This is the line to add
    menuBar.repaint();
    }
   });`