2011-01-16 8 views
11

In meinem Swing-Programm habe ich ein JTextField und ein JButton. Ich möchte, dass, sobald der Benutzer die "Enter" -Taste drückt, der actionListener der JButton ausgeführt wird. Wie würde ich das tun? Vielen Dank im Voraus.Wie verbinde ich mit einem Klick auf "Enter"?

+0

getRootPane(). SetDefaultButton (JButton defaultButton); – ashubuntu

Antwort

10

JRootPane hat eine Methode setDefaultButton (JButton-Taste), die tun wird, was Sie wollen. Wenn Ihre App ein JFrame ist, wird die RootPaneContainer-Schnittstelle implementiert. Sie können den Stammbereich abrufen, indem Sie getRootPane() auf dem JFrame aufrufen, und dann setDefaultButton im zurückgegebenen Stammbereich aufrufen. Dieselbe Technik funktioniert für JApplet, JDialog oder jede andere Klasse, die RootPaneContainer implementiert.

+0

Funktioniert das nur, nachdem Sie die Komponente initialisiert haben, mit der Sie .getRootPane() planen? Wenn ja, würde ich das nicht direkt in den Konstruktor dieser Komponente einbauen können, ja? –

+0

@LucasMorgan: Sie brauchen ein JRootPane, damit das funktioniert, und das macht Sinn. Andernfalls müssen Sie möglicherweise Tastenbelegungen verwenden. –

2

Befreien Sie sich von ActionListeners. Das ist der alte Stil für Zuhörer. Absolvent der Action-Klasse. Der Trick besteht darin, die Arbeit von InputMaps und ActionMaps zu verstehen. Dies ist ein einzigartiges Merkmal der Schaukel, die wirklich sehr schön ist:

http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

Hier ist, wie Sie es tun:

JPanel panel = new JPanel(); 
panel.setLayout(new TableLayout(...)); 
Action someAction = new AbstractAction("GO") { 
    public void actionPerformed() { 
    } 
}; 

InputMap input = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

input.put(KeyStroke.getKeyStroke("enter", "submit"); 
panel.getActionMap().put("submit", someAction); 

panel.add(button = new JButton(someAction)); 
panel.add(textField = new JTextField()); 

die WHEN_ANCESTOR_OF_FOCUSED_COMPONENT verwenden, können das Panel Tastaturereignisse von irgendetwas davon empfangen ist Kind (dh Vorfahren). Unabhängig davon, welche Komponente den Fokus hat, solange sie sich innerhalb des Panels befindet, ruft der Tastendruck alle Aktionen auf, die unter "Senden" in der ActionMap registriert sind.

Dadurch können Sie Aktionen in Menüs, Schaltflächen oder Tastenanschlägen wiederverwenden, indem Sie sie freigeben.

+0

Key Binding ist in vielen Situationen nützlich, aber ist nicht ein bisschen Overkill für das aktuelle Problem, wenn Sie die anderen einfacheren Lösungen verwenden könnten (die wahrscheinlich Key-Bindung im Hintergrund verwenden). –

+0

Hängt davon ab, dass der Autor nicht angegeben hat, ob dies in einem eigenen Dialog oder in der Hauptbenutzeroberfläche der Fall war. Die Verwendung von setDefaultButton() setzt voraus, dass es sich um die einzige Sache in einem Dialog handelt. Ganz zu schweigen von verständnisvollen Aktionen und ihrer Beziehung zum Rest des Swing-Toolkits führt Sie zu weiteren Themen wie Menübindungen, globalen Tastatureingaben und Anpassen von Tastaturbelegungen für Standardkomponenten. Außerdem muss jeder, der ActionListener verwendet, sich bewusst sein, dass Aktionen in allen Fällen überlegen sind. – chubbsondubs

+0

"Jeder, der ActionListeners verwendet, muss sich bewusst sein, dass Aktionen in allen Fällen überlegen sind." - Hm, und mir wurde beigebracht, dass alle Verallgemeinerungen falsch sind. :) –

Verwandte Themen