禁用JMenuItem后KeyStroke Accelerator无法正常工作

时间:2014-03-19 13:31:59

标签: java swing keystroke jmenuitem

在带有Swing GUI的小型Java独立程序中,我将JMenuItem与Accelerator一起使用 - 大多没有任何问题:

JMenuItem item = new JMenuItem("Connect", 'C');
KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
item.setAccelerator(ks);
item.addActionListener(this);

我的问题是当我用

禁用项目
item.setEnabled(false);  

稍后使用

启用它
item.setEnabled(true);

我不能再使用加速器了。 JMenuItem在菜单中正确显示为已启用,我可以用鼠标单击它(我的ActionListener正常工作)但我的加速器没有工作 - 所以我无法启动" Connect" Ctrl + C

你们中有谁知道这个问题是什么,或者我怎么能避免它?


加速器的其他菜单项(但没有暂时禁用)正在运行。致电时

item.getAccelerator();

调用 item.setEnabled(true)后,我得到之前设置的KeyStroke。

它适用于KeyStroke Ctrl + U,但不适用于Ctrl + C.在我看来,当禁用菜单项时,使用Ctrl + C再次注册默认复制操作,再次启用菜单项后,KeyStroke和菜单项之间不再连接。

在尝试构建我的程序的小副本以证明问题时我得到了它:
我一起做了两件事 - 启用JMenuItem(使用KeyStroke Ctrl + C)并请求焦点为JTextField。


这是一个程序的小代码,它对KeyStroke Ctrl + C没有反应,它连接到一个菜单项:

public class ProblemDemo extends JFrame implements ActionListener {

public ProblemDemo() {
    super("ProblemDemo");
    setSize(500,500);
    setLocation(500,300);

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    JMenuBar menubar = new JMenuBar();
    JMenuItem menuItem = new JMenuItem("JMenuItem", 'C');
    menuItem.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK));
    menuItem.addActionListener(this);
    JMenu menu = new JMenu("Actions");
    menu.add(menuItem);
    menubar.add(menu);
    setJMenuBar(menubar);

    JTextArea textarea = new JTextArea();
    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(textarea, BorderLayout.CENTER);

    setVisible(true);
}

@Override
public void actionPerformed(ActionEvent event) {
    if ("JMenuItem".equals(event.getActionCommand())) {
        System.out.println("JMenuItem clicked");
    }
}

public static void main(String[] args) {
    new ProblemDemo();
}

}

2 个答案:

答案 0 :(得分:1)

尝试启用复制/剪切菜单项(以及工具栏中的按钮)时遇到同样的问题,只有在JTable中通过调用ListSelectionListener中的setEnabled(true)选择了某些内容时才会出现。

我通过每次调用setEnable(true)时为包含项目的JMenuBar调用requestFocusInWindow来解决我的问题。

似乎在表格中选择某些内容会将Ctrl + C / Ctrl + x指向表格...

可能是它的帮助

答案 1 :(得分:0)

尝试创建以下方法:

private KeyStroke getNewKeyStroke(){

 KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
 return KeyStroke;

}   

然后您可以调用以下方法:

 item.setEnabled(true);
 item.setAccelerator(this.getNewKeyStroke());