Java 在菜单中动态添加菜单项而不关闭菜单

Java 在菜单中动态添加菜单项而不关闭菜单,java,swing,jmenu,jmenuitem,Java,Swing,Jmenu,Jmenuitem,我想添加JMenuItem而不关闭JMenu。菜单包含一个JTextField,当我在文本字段中按enter键时,它添加了一个菜单项。我的问题是添加的菜单项太小 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JMenuItem; import javax.swing.JTextField; public class NewJFrame extends jav

我想添加
JMenuItem
而不关闭
JMenu
。菜单包含一个
JTextField
,当我在文本字段中按enter键时,它添加了一个菜单项。我的问题是添加的菜单项太小

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import javax.swing.JTextField;

public class NewJFrame extends javax.swing.JFrame {

public NewJFrame() {
    initComponents();
    this.jMenu1.addSeparator();
    final JTextField jTextField = new JTextField("Menu 1",20);
    this.jMenu1.add(jTextField);   

    jTextField.addActionListener(new ActionListener( ){
        @Override
        public void actionPerformed(ActionEvent e) { 
           final JMenuItem jMenuItem = new JMenuItem(jTextField.getText());
            jMenu1.add(jMenuItem);
             jMenuItem.repaint();
             jMenuItem.revalidate();

        }    
    });

}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jMenu1.setText("File");
    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 279, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>//GEN-END:initComponents

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}


// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
// End of variables declaration//GEN-END:variables
}
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JMenuItem;
导入javax.swing.JTextField;
公共类NewJFrame扩展了javax.swing.JFrame{
公共NewJFrame(){
初始化组件();
this.jMenu1.addSeparator();
最终JTextField JTextField=新的JTextField(“菜单1”,20);
this.jMenu1.add(jTextField);
jTextField.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
final JMenuItem JMenuItem=新的JMenuItem(jTextField.getText());
jMenu1.添加(jMenuItem);
jMenuItem.repaint();
jMenuItem.revalidate();
}    
});
}
@抑制警告(“未选中”)
////GEN-BEGIN:初始化组件
私有组件(){
jMenuBar1=newjavax.swing.JMenuBar();
jMenu1=newjavax.swing.JMenu();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setText(“文件”);
jMenuBar1.add(jMenu1);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,400,短。最大值)
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,279,短。最大值)
);
包装();
}////GEN-END:initComponents
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
新建NewJFrame().setVisible(true);
}
});
}
//变量声明-不修改//GEN-BEGIN:变量
私有javax.swing.JMenu jMenu1;
私有javax.swing.JMenuBar jMenuBar1;
//变量结束声明//GEN-End:变量
}
当我按enter键时,菜单会添加一个菜单项,但其宽度太小


如何修复它?

关闭菜单并重新打开,而不是重新绘制它。刚试过,效果很好,就像现场重新粉刷一样快

jMenu1.add(jMenuItem);
//jMenuItem.repaint();
//jMenuItem.revalidate();
MenuElement[] selectionPath = MenuSelectionManager.defaultManager().getSelectedPath();
MenuSelectionManager.defaultManager().clearSelectedPath();
MenuSelectionManager.defaultManager().setSelectedPath(selectionPath);

您必须更新jMenu1的弹出菜单,调用:

jMenu1.getPopupMenu().pack();
而不是

jMenuItem.repaint();
jMenuItem.revalidate();

为什么“没有关闭菜单”?快速关闭和打开是肉眼看不见的,可以解决问题。