java - atras - ¿Cómo puedo devolver un valor de un cuadro de JDialog al JFrame padre?
boton atras java netbeans (6)
Creé un cuadro de 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.
Creé una función en el JFrame 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) ¿Existe una forma mejor de devolver un valor de un cuadro de JDialog a su JFrame padre?
2) ¿Por qué no se puede usar la referencia al JFrame pasado al JDialog para acceder a mi función JFrame setModalPiece?
Agrega una interfaz a tu 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);
}
}
}
}
Así es como generalmente lo hago. No estaba seguro, es por eso que creé esa publicación:
Devolver el valor de JDialog; dispose (), setVisible (false) - example
Cuando pase cualquier valor a JFrame a JDialog, cree un constructor parametrizado de jdialog y en jframe cuando quiera llamar. por ejemplo, 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 desee pasar valores de JDialog a JFrame, cree una clase de bean con set y get method los valores usando vector y obtenga estos valores en jframe. Más información
Generalmente lo hago así:
Dialog dlg = new Dialog(this, ...);
Value result = dlg.showDialog();
La función Dialog.showDialog()
ve así:
ReturnValue showDialog() {
setVisible(true);
return result;
}
Como establecer la visibilidad en verdadero en un JDialog es una operación modal, el botón OK puede establecer una variable de instancia ( result
) para el resultado elegido del diálogo (o null
si se cancela). Después de procesar en el método de botón Aceptar / Cancelar, haga esto:
setVisible(false);
dispose();
para devolver el control a la función showDialog()
.
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 del diálogo.
agregue estas líneas en el constructor de JDialog para asegurar la modalidad
super((java.awt.Frame) null, true);
setModalityType(java.awt.Dialog.ModalityType.APPLICATION_MODAL);
* esto va dentro del constructor de clase del diálogo
digamos que el nombre de clase de su JDialog es ''MyJDialog'', cuando llame haga 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 infos.
Debería hacer lo contrario al agregar un método personalizado getValue()
a su JDialog
personalizado.
De esta forma, puede pedir el valor del diálogo del JFrame
lugar de establecerlo invocando algo en el JFrame
.
Si echas un vistazo al tutorial de Oracle sobre los diálogos here , indica
Si está diseñando un diálogo personalizado, debe diseñar la API de su diálogo para que pueda consultar el diálogo sobre lo que el usuario eligió. Por ejemplo, CustomDialog tiene un método getValidatedText que devuelve el texto ingresado por el usuario.
(Puede encontrar la fuente de CustomDialog
para ver cómo suponen que va a diseñar su diálogo personalizado)