sollten Sie KeyBindings mit jedem JTextComponent
in Frage verwenden. KeyListeners
sind viel zu niedrig von Swing
Perspektive. Sie verwenden das Konzept, das auf AWT
verwandt war, Swing
KeyBindings
verwendet die gleiche Aufgabe mit mehr Effizienz zu tun, und die gewünschten Ergebnisse :-)
Ein kleines Programm für Ihre Hilfe bietet:
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);
}
}
nicht verwenden KeyListeners überhaupt (fragen sich, wie Ihr Code möglicherweise funktionieren kann: Sie haben _focusable_ Etiketten? Wie seltsam und benutzer-verwirrend ...) - Verwenden Sie keyBindings – kleopatra