我正在尝试从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)一起工作?
答案 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();
}
});`