首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用KeyStroke后,JMenuItem加速器无法工作

禁用KeyStroke后,JMenuItem加速器无法工作
EN

Stack Overflow用户
提问于 2014-03-19 13:31:58
回答 2查看 757关注 0票数 0

在一个带有Swing GUI的小型Java独立程序中,我将JMenuItem与加速器结合使用--基本上没有任何问题:

代码语言:javascript
复制
JMenuItem item = new JMenuItem("Connect", 'C');
KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
item.setAccelerator(ks);
item.addActionListener(this);

我的问题是当我禁用该项目时

代码语言:javascript
复制
item.setEnabled(false);  

并在以后使用

代码语言:javascript
复制
item.setEnabled(true);

我不能再用油门了。JMenuItem在菜单中正确显示为已启用,我可以用鼠标单击它(我的ActionListener也正常工作),但是我的加速器没有工作-所以我不能再用Ctrl+C启动“连接”了。

你们中有人知道这个问题是什么吗?或者我怎样才能避免这个问题?

其他加速器(但没有暂时禁用)的菜单项正在工作。打电话时

代码语言:javascript
复制
item.getAccelerator();

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

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

试图构建我的程序的一个小副本来演示我遇到的问题:

I一起做了两件事--启用了JMenuItem (与KeyStroke Ctrl+C一起),并请求为JTextField.提供焦点。

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

代码语言:javascript
复制
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();
}

}

EN

回答 2

Stack Overflow用户

发布于 2014-07-28 18:47:22

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

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

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

也许能帮上忙

票数 1
EN

Stack Overflow用户

发布于 2014-03-19 13:43:54

尝试创建以下方法:

代码语言:javascript
复制
private KeyStroke getNewKeyStroke(){

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

}   

然后,您可以像这样调用以下方法:

代码语言:javascript
复制
 item.setEnabled(true);
 item.setAccelerator(this.getNewKeyStroke());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22507505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档