2010-11-03 19 views
40

He creado un cuadro JDialog modal con un dibujo personalizado y un JButton. Cuando hago clic en JButton, el cuadro de JDialog debe cerrarse y se debe devolver un valor.¿Cómo puedo devolver un valor de un cuadro de JDialog al JFrame padre?

He creado una función en el JF padre llamada setModalPiece, que recibe un valor y lo establece en una variable JFrame local.

El problema es que esta función no es visible desde el cuadro JDialog (aunque el cuadro JDialog tiene una referencia al JFrame padre).

Dos preguntas: 1) ¿Hay una forma mejor de devolver un valor de un cuadro de JDialog a su JFrame padre?

2) ¿Por qué no se puede utilizar la referencia al JFrame pasado al JDialog para acceder a mi función JFrame setModalPiece?

Respuesta

21

Debe hacer lo contrario agregando un método personalizado getValue() a su JDialog personalizado.

De esta forma, puede solicitar el valor del cuadro de diálogo del JFrame, configurándolo invocando algo en el propio JFrame.

Si se echa un vistazo a Oracle tutorial sobre diálogos here afirma

Si usted está diseñando un diálogo personalizado, es necesario diseñar la API de su diálogo de forma que se puede consultar el cuadro de diálogo acerca de lo que el usuario eligió Por ejemplo, CustomDialog tiene un método getValidatedText que devuelve el texto ingresado por el usuario.

(se puede encontrar fuente de CustomDialog para ver cómo se supone que va a diseñar su diálogo personalizado)

95

generalmente lo hago de esta manera:

Dialog dlg = new Dialog(this, ...); 
Value result = dlg.showDialog(); 

La función Dialog.showDialog() tiene este aspecto :

ReturnValue showDialog() { 
    setVisible(true); 
    return result; 
} 

Dado que establecer la visibilidad en verdadero en un JDialog es una operación modal, el botón OK puede establecer una variable de instancia (result) en el resultado elegido del diálogo (o null si se cancela). Después del procesamiento en el método del botón Aceptar/Cancelar, haga lo siguiente:

setVisible(false); 
dispose(); 

para devolver el control a la función showDialog().

+0

Gracias por esto! He estado buscando la última hora sobre cómo lograr esto, y esto funcionó exactamente como yo quería. – BMB

+8

Pequeño comentario: si usa JDialog, debe declararlo como modal, mediante el parámetro correcto en el constructor o mediante SetModal (verdadero); –

0

Cuando pasa cualquier valor a JFrame a JDialog, crea el constructor parametrizado de jdialog y en jframe siempre que quiera llamar. p. El constructor parametrizado como:

public EditProduct(java.awt.Frame parent, boolean modal, int no) { 
     //int no is number of product want to edit. 
     //Now we can use this pid in JDialog and perform whatever you want. 
} 

Cuando se quiere pasar valores de JDialog a JFrame crear una clase de bean con el sistema y método de obtener los valores usando los vectores y obtener estos valores en JFrame. More info

4

No sé si puedo explicar mi método de una manera genial ... Digamos que necesito el precio del producto y un monto de un JDialog que va a obtener esa información del usuario, necesito llamarlo desde el JFrame.

declare productPrice y ammount como variables globales públicas no estáticas dentro de JDialog.

public float productPrice; 
public int ammount; 

* esto va dentro del alcance global de la clase de diálogo.

añadir estas líneas en el constructor JDialog para asegurar modalidad

super((java.awt.Frame) null, true); 
setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL); 

* esto va en el constructor de clase del diálogo

digamos el nombre de la clase de JDialog es 'MyJDialog', cuando se llama a hacer algo como esto

MyJDialog question = new MyJDialog(); 
MyJDialog.setVisible(true); 
// Application thread will stop here until MyJDialog calls dispose(); 
// this is an effect of modality 
// 
// When question calls for dispose(), it will leave the screen, 
// but its global values will still be accessible. 
float myTotalCostVar = question.productPrice * question.ammount; 
// this is acceptable. 
// You can also create public getter function inside the JDialog class, 
// its safer and its a good practice. 

* esto va en cualquier función dentro de su JFrame y llamará a JDialog para obtener información.

0

agregar una interfaz a su constructor?

public class UploadConfimation extends JDialog { 

private final JPanel contentPanel = new JPanel(); 


public interface GetDialogResponse{ 
    void GetResponse(boolean response); 
} 



/** 
* Create the dialog. 
*/ 
public UploadConfimation(String title, String message, GetDialogResponse result) { 
    setBounds(100, 100, 450, 300); 
    setTitle(title); 
    getContentPane().setLayout(new BorderLayout()); 
    contentPanel.setLayout(new FlowLayout()); 
    contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    getContentPane().add(contentPanel, BorderLayout.CENTER); 
    { 
     JLabel lblMessage = new JLabel(message); 
     contentPanel.add(lblMessage); 
    } 
    { 
     JPanel buttonPane = new JPanel(); 
     buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     getContentPane().add(buttonPane, BorderLayout.SOUTH); 
     { 
      JButton okButton = new JButton("YES"); 
      okButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        result.GetResponse(true); 
        dispose(); 
       } 
      }); 
      buttonPane.add(okButton); 
      getRootPane().setDefaultButton(okButton); 
     } 
     { 
      JButton cancelButton = new JButton("NO"); 
      cancelButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        result.GetResponse(false); 
        dispose(); 
       } 
      }); 
      buttonPane.add(cancelButton); 
     } 
    } 
} 

}

Cuestiones relacionadas