2009-08-16 2 views
7

Come posso impostare un pulsante di annullamento in uno Swing JDialog, vale a dire un pulsante la cui azione viene eseguita automaticamente se l'utente preme il tasto "Annulla" sulla tastiera?JDialog cancel button

La controparte viene offerta per un'azione predefinita tramite il metodo setDefaultButton del riquadro principale della finestra di dialogo.

Se questo è di aiuto, sto cercando un analogo alla proprietà WinForms Form.CancelButton.

+0

Indovina la tua chiave di fuga .. – NateS

risposta

1

Non penso che questo sia possibile con JDialog senza estenderlo.

È possibile utilizzare JOptionPane.showOptionDialog() (o possibilmente uno degli altri metodi di visualizzazione), passando i JButtons che si desidera utilizzare.

Se le opzioni passate sono componenti, saranno resi come normale, in modo da poter fare qualcosa di simile:

int optionType = JOptionPane.DEFAULT_OPTION; 
int messageType = JOptionPane.PLAIN_MESSAGE; // no standard icon 

JButton ok = new JButton("ok"); 
JButton cancel = new JButton("cancel"); 
//add any handlers to the buttons 
... 
//construct options 
Object[] selValues = { ok, cancel }; 

//show dialog as normal, selected index will be returned. 
int res = JOptionPane.showOptionDialog(null, "message", 
     "title", optionType, messageType, null, selValues, 
     selValues[0]); 
+0

Ciao ricco, grazie per l'esempio. Sfortunatamente, ho bisogno di una finestra di dialogo completamente personalizzata con molti controlli diversi, non solo una finestra di dialogo personalizzata. Per quanto posso vedere, non esiste alcun metodo/sovraccarico che possa essere passato a un pannello completamente personalizzato. –

+1

Penso che tu abbia ragione, se hai una finestra di dialogo personalizzata, dovrai implementare la gestione da solo, puoi comunque strappare l'elaborazione per farlo da JOptionPane. FWIW in SWT è possibile definire una sottoclasse arbitraria di Dialog e chiamare il metodo open() per visualizzarlo. –

2

soluzione linea singola

t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction()); 

dove t è qualsiasi componente (tranne JButton) come JTextField nella finestra di dialogo.

+1

Il secondo argomento del metodo 'put()' è una chiave nella mappa di azioni, non un 'Action'. Questo funzionerebbe solo se 'btnCancel.getAction()! = Null', e se' Action' restituito da 'btnCancel.getAction()' è stato registrato nella mappa di azione per 't' con se stesso come chiave, es. se 't.getActionMap(). put (btnCancel.getAction(), btnCancel.getAction())' era stato precedentemente chiamato. – Jesse

1

Tutto ciò che dovete fare è collegare l'action listener al pulsante e chiamare dialog.setVisible(false) al suo interno.

+0

Basta provare ... funziona davvero –

+0

Non rispondi alla domanda. Stava per chiudere una finestra di dialogo con un tasto, in generale con il tasto Esc. Almeno è così che leggo la domanda, che è un po 'ambigua nel rileggerla. – PhiLho

+0

Oops, grazie per averlo indicato. La domanda dovrebbe leggere "chiave 'Annulla", "non" pulsante ". Lo aggiusterò. –

3

Il modo migliore che riesco a vedere è aggiungere un Action alla mappa delle azioni del riquadro principale e collegare l'azione alla chiave di escape utilizzando la mappa di input del riquadro principale.

Per questo, è necessario un Action. (. Es cancelButton.getAction() != null) Se il comportamento del pulsante di annullamento è implementato come un'azione, allora questo lavoro:

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", cancelButton.getAction()); 

In caso contrario, se la logica del pulsante di annullamento è implementato tramite un ActionListener, si potrebbe avere il metodo della ActionListeneractionPerformed() chiamare un metodo private void onCancel() che implementa la logica e registrare un'azione "Annulla" che chiama lo stesso metodo.