W moim programie swing mam JTextField i JButton. Chciałbym, aby po naciśnięciu przez użytkownika klawisza "enter" uruchomiono actionListener z JButton. Jak to zrobić? Z góry dzięki.Jak skojarzyć naciskanie "enter" z przyciskiem?
Odpowiedz
JRootPane ma metodę setDefaultButton (przycisk JButton), która zrobi, co chcesz. Jeśli twoja aplikacja jest JFrame, implementuje interfejs RootPaneContainer i możesz uzyskać panel główny, wywołując funkcję getRootPane() w JFrame, a następnie wywołując setDefaultButton na zwróconym panelu głównym. Ta sama technika działa dla JApplet, JDialog lub dowolnej innej klasy implementującej RootPaneContainer.
Czy działa to tylko po zainicjowaniu komponentu, w którym ma być włączona funkcja .getRootPane()? Jeśli tak, oznaczałoby to, że nie mogłem tego zbudować bezpośrednio w konstruktorze tego komponentu, tak? –
@ LucasMorgan: do działania potrzebny jest JRootPane, i to ma sens. Inaczej może zajść potrzeba użycia kluczy. –
jest przykładem tutaj
http://www.java2s.com/Code/Java/Swing-JFC/SwingDefaultButton.htm
to jest to, czego potrzebujesz: rootPane.setDefaultButton (button2);
Pozbądź się ActionListeners. To stary styl robienia słuchaczy. Ukończył klasę Akcji. Sztuką jest zrozumieć działanie InputMaps i ActionMaps. Jest to unikalna cecha Swing, który jest naprawdę bardzo ładny:
http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
Oto jak to zrobić:
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());
Używanie WHEN_ANCESTOR_OF_FOCUSED_COMPONENT umożliwia panel do odbierania zdarzeń klawiaturowych z dowolnego swojego dziecka (tj. przodkowie). Więc bez względu na to, który komponent się skupi, dopóki znajduje się w panelu, naciśnięcie klawisza wywoła dowolną akcję zarejestrowaną pod "przesłaniem" w ActionMap.
Umożliwia to ponowne użycie akcji w menu, przyciskach lub naciśnięciach klawiszy, udostępniając je.
Key Binding jest przydatny w wielu sytuacjach, ale nie stanowi zbyt dużego przesytu dla aktualnego problemu, gdy można użyć innych, prostszych rozwiązań (prawdopodobnie używających wiązania klawiszy w tle). –
W zależności od autora nie określono, czy był on w oknie dialogowym samodzielnie, czy w głównym interfejsie użytkownika. Użycie setDefaultButton() zakłada, że jest to jedyna rzecz w oknie dialogowym. Nie wspominając już o zrozumieniu akcji i ich związku z resztą zestawu narzędzi Swing, przenosi użytkownika do innych tematów, takich jak powiązania menu, globalne naciśnięcia klawiszy i dostosowuje odwzorowania klawiszy dla domyślnych składników. Dodatkowo każdy, kto używa ActionListeners, musi być świadomy, że Akcje są lepsze we wszystkich przypadkach. – chubbsondubs
"każdy, kto używa ActionListeners, musi być świadomy, że Akcje są lepsze we wszystkich przypadkach." - Hm, i mnie uczono, że wszystkie uogólnienia są złe. :) –
getRootPane(). SetDefaultButton (JButton defaultButton); – ashubuntu