如果 JMenu 未打开,JMenuItem 上的加速器将不起作用(但只有少数)



我的问题是关于JMenuItem上的加速器,如果JMenu未打开,则加速器不起作用,但仅适用于其中一些。一个是工作(CTRL + G),但另一个是不工作(CTRL + H)。我不知道为什么它不工作。(它的工作,如果JMenu是打开我提醒它)

可能是在这个组合上已经设置了另一个快捷方式?

remplacer.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.CTRL_DOWN_MASK));
remplacer.setText("Remplacer");
remplacer.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
remplacerActionPerformed(evt);
}
});
edition_menu.add(remplacer);
atteindre.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.event.InputEvent.CTRL_DOWN_MASK));
atteindre.setText("Atteindre");
atteindre.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
atteindreActionPerformed(evt);
}
});
edition_menu.add(atteindre);

这里有两个JMenuItem包含在一个JMenu,一个是工作的,但另一个是工作的,只有当我打开JMenu之前。谢谢你的帮助。

似乎对我来说很好,考虑提供一个最小的可重复的例子来演示您的问题

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JMenuItem replaceMI = new JMenuItem("Replace");
replaceMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK));
replaceMI.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Do replace");
}
});
JMenuItem findMI = new JMenuItem("Find");
findMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, KeyEvent.CTRL_DOWN_MASK));
findMI.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Do find");
}
});
JMenu editMenu = new JMenu("Edit");
editMenu.add(replaceMI);
editMenu.add(findMI);
JMenuBar menuBar = new JMenuBar();
menuBar.add(editMenu);
JFrame frame = new JFrame();
frame.setJMenuBar(menuBar);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}

最新更新