2009-08-16 40 views
7

¿Cómo puedo establecer un botón de cancelar en un Swing JDialog, es decir, un botón cuya acción se realiza automáticamente si el usuario presiona la tecla "Cancelar" en el teclado?JDialog cancelar botón

La contraparte se ofrece para una acción predeterminada a través del método setDefaultButton del panel raíz del diálogo.

Si eso ayuda, estoy buscando un análogo a la propiedad WinForms Form.CancelButton.

+0

Supongo que significa escape key .. – NateS

Respuesta

1

No creo que esto sea posible con JDialog sin extenderlo.

Puede usar JOptionPane.showOptionDialog() (o posiblemente uno de los otros métodos de presentación), pasando los JButtons que desea utilizar.

Si las opciones pasadas son componentes, que van a ser prestados de forma normal, por lo que se puede hacer algo como esto:

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

Hola Rich, gracias por el ejemplo. Desafortunadamente, necesito un diálogo completamente personalizado con muchos controles diferentes, no simplemente un diálogo de opción individualizada. Por lo que puedo ver, no hay método/sobrecarga que pueda pasar un panel completamente personalizado. –

+1

Creo que tiene razón, si tiene un cuadro de diálogo personalizado, tendrá que implementar el manejo usted mismo, sin embargo, puede arrancar el procesamiento para hacerlo desde JOptionPane. FWIW en SWT puede definir una subclase arbitraria de Diálogo y llamar a su método open() para mostrarla –

2

solución de una sola línea

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

donde t es cualquier componente (excepto JButton) como JTextField en el cuadro de diálogo.

+1

El segundo argumento para el método 'put()' es una clave en el mapa de acción, no una 'Acción'. Esto solo funcionaría si 'btnCancel.getAction()! = Null', y si la' Action' devuelta por 'btnCancel.getAction()' se registró en el mapa de acción para 't' consigo misma como clave, es decir. si 't.getActionMap(). put (btnCancel.getAction(), btnCancel.getAction())' había sido llamado previamente. – Jesse

1

Todo lo que tiene que hacer es conectar el oyente de acción al botón y llamar al dialog.setVisible(false) dentro de él.

+0

Solo intenta ... realmente funciona –

+0

No respondes la pregunta. Estaba a punto de descartar un diálogo con una pulsación de tecla, en general con la tecla Escape. Al menos así es como leo la pregunta, que es un poco ambigua al volver a leerla. – PhiLho

+0

Vaya, gracias por señalar eso. La pregunta debe leer "cancelar" clave, "no" botón ". Lo arreglaré. –

3

La mejor manera que puedo ver es agregar un Action al mapa de acción del panel raíz y vincular esa acción con la clave de escape usando el mapa de entrada del panel raíz.

Para esto, necesita un Action. (. Es decir cancelButton.getAction() != null) Si el comportamiento de su botón de cancelación se implementa como una acción, entonces esto va a trabajar:

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

De lo contrario, si la lógica del botón de cancelación se implementa a través de un ActionListener, usted podría tener el método de la ActionListeneractionPerformed() llama a un método private void onCancel() que implementa la lógica y registra una acción "cancelar" que llama al mismo método.

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     onCancel(); 
    } 
}); 
Cuestiones relacionadas