web-dev-qa-db-fra.com

Comment puis-je renvoyer une valeur d'une boîte JDialog au JFrame parent?

J'ai créé une boîte JDialog modale avec un dessin personnalisé dessus et un JButton. Lorsque je clique sur le JButton, la boîte de dialogue JDialog doit se fermer et une valeur doit être renvoyée.

J'ai créé une fonction dans le JFrame parent appelée setModalPiece, qui reçoit une valeur et la définit sur une variable JFrame locale.

Le problème est que cette fonction n'est pas visible à partir de la boîte JDialog (même si la boîte JDialog a une référence au JFrame parent).

Deux questions: 1) Existe-t-il un meilleur moyen de renvoyer une valeur d'une boîte de dialogue JDrame à son parent JFrame?

2) Pourquoi la référence au JFrame transmise au JDialog ne peut-elle pas être utilisée pour accéder à ma fonction JFrame setModalPiece?

42
Rolan

Vous devriez faire le contraire en ajoutant une méthode personnalisée getValue() à votre JDialog personnalisée.

De cette façon, vous pouvez demander la valeur de la boîte de dialogue à partir du JFrame au lieu de la définir en invoquant quelque chose sur le JFrame lui-même.

Si vous regardez le tutoriel Oracle sur les dialogues ici il indique

Si vous concevez une boîte de dialogue personnalisée, vous devez concevoir l'API de votre boîte de dialogue afin de pouvoir interroger la boîte de dialogue sur ce que l'utilisateur a choisi. Par exemple, CustomDialog a une méthode getValidatedText qui renvoie le texte entré par l'utilisateur.

(vous pouvez trouver la source de CustomDialog pour voir comment ils supposent que vous allez concevoir votre boîte de dialogue personnalisée)

23
Jack

Je le fais généralement comme ceci:

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

La fonction Dialog.showDialog() ressemble à ceci:

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

Dans la mesure où définir la visibilité sur true sur un JDialog est une opération modale, le bouton OK peut définir une variable d'instance (result) sur le résultat choisi de la boîte de dialogue (ou null en cas d'annulation). Après avoir traité avec la méthode du bouton OK/Annuler, procédez comme suit:

setVisible(false);
dispose();

pour retourner le contrôle à la fonction showDialog().

108
Jonathan

Je ne sais pas si je peux expliquer ma méthode de manière cool ... Disons que j'ai besoin de productPrice et du montant d'un JDialog qui va obtenir ces informations de l'utilisateur, je dois l'appeler à partir du JFrame.

déclarer productPrice et ammount en tant que variables globales publiques non statiques à l'intérieur du JDialog.

public float productPrice;
public int amount;

* cela va à l'intérieur de la portée globale de la classe du dialogue.

ajouter ces lignes dans le constructeur JDialog pour assurer la modalité

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

* cela va dans le constructeur de classe du dialogue

disons que le nom de classe de votre JDialog est "MyJDialog" lorsque vous appelez, faites quelque chose comme ça

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.

* cela va dans n'importe quelle fonction de votre JFrame et appellera JDialog pour obtenir des infos.

4
Felype

Ajouter une interface à votre constructeur?

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

}

0
Wil_Ryan

Voici comment je le fais habituellement. Je n'étais pas sûr, c'est pourquoi j'ai créé ce post:

Retour de la valeur de JDialog; dispose (), setVisible (false) - exemple

0
guitar_freak

Lorsque vous transmettez une valeur à JFrame à JDialog, créez un constructeur paramétré de jdialog et dans jframe chaque fois que vous voulez appeler. par exemple. Le constructeur paramétré comme:

 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.
}

Lorsque vous voulez passer des valeurs de JDialog à JFrame, créez une classe de bean avec set et get method les valeurs en utilisant vector et obtenez ces valeurs dans jframe. Plus d'informations

0
Rajshri