2011-01-16 15 views

risposta

10

JRootPane ha un metodo setDefaultButton (pulsante JButton) che farà ciò che si desidera. Se la tua app è un JFrame, implementa l'interfaccia RootPaneContainer e puoi ottenere il riquadro principale chiamando getRootPane() su JFrame, quindi chiama setDefaultButton nel pannello radice che è stato restituito. La stessa tecnica funziona con JApplet, JDialog o qualsiasi altra classe che implementa RootPaneContainer.

+0

Funziona solo dopo aver inizializzato il componente con il quale si pianifica .getRootPane()? In tal caso, ciò significherebbe che non potrei costruirlo direttamente nel costruttore di quel componente, sì? –

+0

@LucasMorgan: è necessario un JRootPane perché funzioni, e questo ha senso. Altrimenti potrebbe essere necessario utilizzare le associazioni di tasti. –

2

Sbarazzarsi di ActionListeners. Questo è il vecchio stile per fare ascoltatori. Graduate alla classe Action. Il trucco è capire come funzionano InputMaps e ActionMaps. Questa è una caratteristica unica di swing che è veramente molto bello:

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

Ecco come si fa:

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()); 

Utilizzando la WHEN_ANCESTOR_OF_FOCUSED_COMPONENT consente al pannello di ricevere gli eventi di tastiera da qualsiasi del suo bambino (cioè antenati). Quindi, indipendentemente dal componente attivo, purché all'interno del pannello, il tasto invocherà qualsiasi azione registrata in "Invia" in ActionMap.

Ciò consente di riutilizzare Azioni in menu, pulsanti o sequenze di tasti condividendole.

+0

Key Binding è utile in molte situazioni ma non è un po 'eccessivo per il problema corrente quando è possibile utilizzare le altre soluzioni più semplici offerte (che probabilmente usano il binding delle chiavi in ​​background). –

+0

Dipende l'autore non ha specificato se questo era in una finestra di dialogo da solo, o l'interfaccia utente principale. L'utilizzo di setDefaultButton() presuppone che sia l'unica cosa in una finestra di dialogo. Per non parlare della comprensione delle Azioni e del modo in cui si relazionano con il resto del toolkit Swing ti porta oltre ad altri argomenti come i collegamenti ai menu, le sequenze di tasti globali e personalizza le mappature dei tasti per i componenti predefiniti. Inoltre, chiunque usi ActionListeners deve essere consapevole che le azioni sono superiori in tutti i casi. – chubbsondubs

+0

"chiunque usi ActionListeners deve essere consapevole che le azioni sono superiori in tutti i casi." - Hm, e mi è stato insegnato che tutte le generalizzazioni sono sbagliate. :) –

Problemi correlati