wake-up-neo.com

Wie kann ich einen Wert aus einem JDialogfeld an den übergeordneten JFrame zurückgeben?

Ich habe ein modales JDialogfeld mit einer benutzerdefinierten Zeichnung und einem JButton erstellt. Wenn ich auf den JButton klicke, sollte das JDialog-Feld geschlossen und ein Wert zurückgegeben werden.

Ich habe im übergeordneten JFrame eine Funktion namens setModalPiece erstellt, die einen Wert empfängt und ihn auf eine lokale JFrame-Variable setzt.

Das Problem ist, dass diese Funktion im JDialogfeld nicht sichtbar ist (obwohl das JDialogfeld einen Verweis auf den übergeordneten JFrame enthält).

Zwei Fragen: 1) Gibt es eine bessere Möglichkeit, einen Wert aus einem JDialog-Feld an den übergeordneten JFrame zurückzugeben?

2) Warum kann der an JDialog übergebene Verweis auf den JFrame nicht für den Zugriff auf meine JFrame-Funktion setModalPiece verwendet werden?

42
Rolan

Sie sollten das Gegenteil tun, indem Sie eine benutzerdefinierte Methode getValue() zu Ihrer benutzerdefinierten JDialog hinzufügen.

Auf diese Weise können Sie den Wert des Dialogfelds vom JFrame abfragen, anstatt ihn durch Aufrufen von etwas auf dem JFrame selbst festzulegen.

Wenn Sie sich das Oracle-Tutorial über Dialoge ansehen hier heißt es

Wenn Sie ein benutzerdefiniertes Dialogfeld entwerfen, müssen Sie die API Ihres Dialogfelds so gestalten, dass Sie das Dialogfeld abfragen können, was der Benutzer ausgewählt hat. Beispielsweise verfügt CustomDialog über eine getValidatedText-Methode, die den vom Benutzer eingegebenen Text zurückgibt.

(Sie können die Quelle von CustomDialog finden, um zu sehen, wie sie davon ausgehen, dass Sie Ihr benutzerdefiniertes Dialogfeld entwerfen werden.)

23
Jack

Im Allgemeinen mache ich das so:

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

Die Dialog.showDialog() -Funktion sieht folgendermaßen aus:

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

Da das Setzen der Sichtbarkeit auf "true" in einem JDialog eine modale Operation ist, kann die Schaltfläche "OK" eine Instanzvariable (result) auf das ausgewählte Ergebnis des Dialogs setzen (oder null, falls abgebrochen). Führen Sie nach der Verarbeitung mit der Schaltfläche OK/Abbrechen die folgenden Schritte aus:

setVisible(false);
dispose();

um die Steuerung auf die Funktion showDialog() zurückzusetzen.

108
Jonathan

Ich weiß nicht, ob ich meine Methode auf eine coole Art und Weise erklären kann ... Nehmen wir an, ich benötige productPrice und Menge von einem JDialog, der diese Informationen vom Benutzer erhält, ich muss das vom JFrame aufrufen.

deklarieren Sie productPrice und ammount als öffentliche, nicht statische globale Variablen im JDialog.

public float productPrice;
public int amount;

* Dies gehört zum globalen Geltungsbereich der Klasse des Dialogfelds.

fügen Sie diese Zeilen zum JDialog-Konstruktor hinzu, um die Modalität sicherzustellen

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

* Dies gehört zum Klassenkonstruktor des Dialogs

nehmen wir an, der Klassenname Ihres JDialogs ist 'MyJDialog', wenn Sie etwas wie dieses aufrufen

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.

* Dies funktioniert in jeder Funktion in Ihrem JFrame und ruft JDialog auf, um Informationen zu erhalten.

4
Felype

Fügen Sie Ihrem Konstruktor eine Schnittstelle hinzu?

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

Hier ist, wie ich es normalerweise mache. Ich war mir nicht sicher, deswegen habe ich diesen Beitrag erstellt:

Rückgabewert von JDialog; dispose (), setVisible (false) - Beispiel

0
guitar_freak

Wenn Sie einen Wert an JFrame an JDialog übergeben, erstellen Sie bei jedem Aufruf einen parametrisierten Konstruktor für jdialog und in jframe. z.B. Der parametrisierte Konstruktor wie:

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

Wenn Sie Werte von JDialog an JFrame übergeben möchten, erstellen Sie eine Bean-Klasse mit der Methode set and get, und verwenden Sie den Vektor, um die Werte in jframe abzurufen. Mehr Infos

0
Rajshri