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();
}
});`
我正在尝试从 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();
}
});`