В небольшой автономной программе Java с графическим интерфейсом Swing я использую JMenuItem с ускорителем - в основном без проблем:
JMenuItem item = new JMenuItem("Connect", 'C');
KeyStroke ks = KeyStroke.getKeyStroke('C', Event.CTRL_MASK);
item.setAccelerator(ks);
item.addActionListener(this);
Моя проблема в том, что когда я отключаю item с помощью
item.setEnabled(false);
и включить его позже с помощью
item.setEnabled(true);
Я больше не могу использовать ускоритель. JMenuItem правильно отображается как включенный в меню, и я могу щелкнуть его мышью (и мой ActionListener работает правильно), но мой ускоритель не работает, поэтому я не могу запустить «Подключение» с помощью Ctrl+C эм> больше.
Кто-нибудь из вас знает, что это за проблема или как ее избежать?
Другие пункты меню, ускорители которых (но без временного отключения) работают. При звонке
item.getAccelerator();
после вызова item.setEnabled(true) я получаю ранее установленный KeyStroke.
Он работает с клавишей Ctrl+U, но не с Ctrl+C. Мне кажется, что при отключении пункта меню операция копирования по умолчанию снова регистрируется с помощью Ctrl + C, и после повторного включения пункта меню связи между KeyStroke и пунктом меню больше нет.
При попытке построить уменьшенную копию моей программы, чтобы продемонстрировать проблему, я обнаружил ее:
я сделал две вещи одновременно: включил JMenuItem (с помощью KeyStroke Ctrl+C) И запросил фокус для JTextField. >
Вот небольшой код программы, которая не реагирует на нажатие клавиши 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();
}
}