В рамките на малка самостоятелна програма на Java със Swing GUI използвам 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 работи правилно), но ускорителят ми не работи - така че не мога да стартирам "Свързване" с Ctrl+C em> повече.
Някой от вас знае ли какъв е този проблем или как мога да го избегна?
Други елементи от менюто, чиито ускорители (но без да бъдат временно деактивирани) работят. При обаждане
item.getAccelerator();
след извикване на item.setEnabled(true) получавам предишния зададен KeyStroke.
Работи с натискане на клавиш Ctrl+U, но не и с Ctrl+C. Струва ми се, че при деактивиране на елемента от менюто операцията за копиране по подразбиране се регистрира отново с Ctrl+C и след повторно активиране на елемента от менюто вече няма връзка между натискането на клавиша и елемента от менюто.
Докато се опитвах да създам малко копие на моята програма, за да демонстрирам проблема, го получих:
Направих две неща заедно - активирах JMenuItem (с натискане на клавиш 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();
}
}