Remove/Add JMenu from/to JMenuBar

Remove/Add JMenu from/to JMenuBar

我正在尝试从 JMenuBar remove/add 一个 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) 与 menuBar(CutMenu) 的切换位置时才有效吗?

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

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(),就会有间隙。您可以通过删除关于菜单来测试它,而不是查看是否需要 revalidate()

你只需要在你add/remove剪切菜单后添加一行代码。您需要再次重新绘制菜单栏才能看到更改。

  ` 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();
    }
   });`