Comment retourner une valeur d'une boîte JDialog au JFrame parent?

j'ai créé une boîte modale JDialog avec un dessin personnalisé sur elle et un JButton. Lorsque je clique sur le bouton JButton, la boîte JDialog doit se fermer et une valeur doit être retournée.

j'ai créé une fonction dans la JFrame mère appelée setModalPiece, qui reçoit une valeur et la place dans 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 parent JFrame).

deux questions: 1) y a-t-il une meilleure façon de retourner une valeur d'une boîte JDialog à son JFrame parent?

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

40
demandé sur MaxAxeHax 2010-11-03 19:35:46

6 réponses

vous devez faire le contraire en ajoutant une méthode personnalisée getValue() à votre coutume JDialog .

de cette façon, vous pouvez demander la valeur de la boîte de dialogue du JFrame à la place que le réglage en invoquant quelque chose sur le JFrame lui-même.

si vous jetez un oeil à Oracle tutoriel sur dialogs ici il déclare

si vous concevez un dialogue personnalisé, vous devez concevez l'API de votre dialogue de sorte que vous puissiez interroger le dialogue sur ce que l'Utilisateur a choisi. Par exemple, CustomDialog a une méthode getValidatedText qui renvoie le texte saisi par l'utilisateur.

(vous pouvez trouver la source de CustomDialog pour voir comment ils pensent que vous allez concevoir votre dialogue personnalisé)

21
répondu Jack 2010-11-03 16:41:13

en général, je fais comme ça:

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

la fonction Dialog.showDialog() ressemble à ceci:

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

étant donné que le réglage de la visibilité à true sur un JDialog est une opération modale, le bouton OK peut régler une variable d'instance ( result ) sur le résultat choisi de la boîte de dialogue (ou null en cas d'annulation). Après le traitement dans la méthode OK/Cancel button, faites ceci:

setVisible(false);
dispose();

pour retourner la commande showDialog() de la fonction.

98
répondu Jonathan 2010-11-03 16:42:35

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

déclarer productPrice et de la quantité que du public non-statique des variables globales à l'intérieur de la JDialog.

public float productPrice;
public int ammount;

* ceci va à l'intérieur de la classe de dialog global scope.

ajouter ces lignes dans le constructeur JDialog pour assurer modalité

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

* ceci va dans la classe du constructeur du dialogue

disons que le nom de classe de votre JDialog est 'MyJDialog', quand 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.

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

4
répondu Felype 2016-11-23 16:17:47

quand vous passez n'importe quelle valeur à JFrame à JDialog alors créez 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.
}

quand vous voulez passer des valeurs de JDialog à JFrame, créez une classe bean avec set et obtenez la méthode the values using vector et obtenez ces valeurs dans jframe. plus d'information

0
répondu Rajshri 2012-05-22 05:55:16

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

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

0
répondu guitar_freak 2017-05-23 11:47:09

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
répondu Wil_Ryan 2016-04-13 05:44:32