Bạn nên sử dụng với bất kỳ KeyBindingsJTextComponent
trong câu hỏi. KeyListeners
là mức quá thấp so với quan điểm của Swing
. Bạn đang sử dụng các khái niệm mà có liên quan đến AWT
, Swing
sử dụng KeyBindings
để làm cùng một công việc có hiệu quả hơn và cung cấp kết quả mong muốn :-)
Một chương trình nhỏ giúp đỡ của bạn:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyBindingExample {
private static final String key = "ENTER";
private KeyStroke keyStroke;
private JButton button;
private JTextArea textArea;
private Action wrapper = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
button.doClick();
}
};
private void displayGUI() {
JFrame frame = new JFrame("Key Binding Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel(new BorderLayout(5, 5));
textArea = new JTextArea(10, 10);
keyStroke = KeyStroke.getKeyStroke(key);
Object actionKey = textArea.getInputMap(
JComponent.WHEN_FOCUSED).get(keyStroke);
textArea.getActionMap().put(actionKey, wrapper);
button = new JButton("Click Me!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
System.out.format("Button Clicked :-)%n");
}
});
contentPane.add(textArea, BorderLayout.CENTER);
contentPane.add(button, BorderLayout.PAGE_END);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
new KeyBindingExample().displayGUI();
}
};
EventQueue.invokeLater(r);
}
}
Nguồn
2013-08-28 14:31:00
không sử dụng keyListeners ở tất cả (tự hỏi làm thế nào mã của bạn có thể có thể làm việc: bạn có _focusable_ nhãn? Làm thế nào lạ và người dùng khó hiểu ...) - sử dụng keyBindings – kleopatra