2011-01-16 16 views

Odpowiedz

10

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.

+0

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? –

+0

@ LucasMorgan: do działania potrzebny jest JRootPane, i to ma sens. Inaczej może zajść potrzeba użycia kluczy. –

2

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.

+0

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). –

+0

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

+0

"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. :) –