Eigener JDialog mit Rückgabe -> aufrufende Methode unterbricht nicht

Hein_nieh

Grünschnabel
Hallo,

ich versuche einen Eigen Dialog zu erstellen und das Ergebnis auszuwerten.
Der Aufruf des Dialoges soll wie folgt erfolgen.

Java:
import MyJDialog.MyInputDialog;
import MyJDialog.MyInputDialog_3;
import MyJDialog.TestMyInputDialog;
import MyJDialog.ReturnClass;


public class MainDialog
{
    public static void main (String[] arg)
    {
        ReturnClass ret  = new ReturnClass("bla bla", "blub blub", "blobb bloob");
        ret = TestMyInputDialog.showDialog("Test Input Dialog", ret);
       
        //hier sollte eigentlich gewartet werden,
        //bis im Dialog ein Button gedrueckt wurde
        //PASSIERT ABEr NICHT
       
        System.out.println(  "Ergebnis " + ret.getTest1() + " -> " + ret.getTest2() + " -> " + ret.getTest3() );
       
    }//main
}//class

Der Dialog soll das Programm solange unterbrechen, bis im Dialog der OK oder Cancel Button gedrückt wurde.
Nach dem Schliessen des Dialoges soll der Rückgabewert ausgewertet werden.
Das passiert leider nicht.
Die main-Routine arbeitet trotz geöffneten Dialoges weiter.
Hat jemand eine Idee was ich in der Dialogklasse verändern muss?

Hier die Dialogklasse:
Java:
package MyJDialog;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestMyInputDialog
{
    private static ReturnClass result = null;
    private static JDialog dialog;
    private static JTextField txtField1,txtField2,txtField3;
   
    private String strText1="null", strText2="null", strText3="null";
    private TestMyInputDialog(String title, Object obj)
    {
        if (obj != null)
        {
            if (obj instanceof ReturnClass)
            {
                result=(ReturnClass)obj;
                strText1 = result.getTest1();
                strText2 = result.getTest2();
                strText3 = result.getTest3();
            }//if instanceof
        }//if obj != null
       
        //GUI bauen
        dialog = new JDialog();
        dialog.setTitle(title);
        dialog.setSize(400, 200);
               
        //Button Panel
        JPanel pnlButton=new JPanel();
        JButton butCancel=new JButton("Cancel");
        JButton butOK=new JButton("OK");
        pnlButton.add(butCancel);
        pnlButton.add(butOK);
       
        //Text Panel
        JPanel pnlText=new JPanel();
        txtField1 = new JTextField(30);
        txtField2 = new JTextField(30);
        txtField3 = new JTextField(30);
        pnlText.add(txtField1);
        pnlText.add(txtField2);
        pnlText.add(txtField3);
       
        dialog.add(pnlButton, BorderLayout.SOUTH);
        dialog.add(pnlText, BorderLayout.CENTER);
        dialog.setVisible(true);
                       
        //Werte zuweisen
        txtField1.setText(strText1);
        txtField2.setText(strText2);
        txtField3.setText(strText3);
       
        butOK.addActionListener( new clsListenerOK() );
        butCancel.addActionListener( new clsListenerCancel() );
       
    }//Constructor MyInputDialog
   
    class clsListenerOK implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            DoButtonOK();
        }//actionPerformed
    }//class clsOkListener
   
    class clsListenerCancel implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            DoButtonCancel();
        }//actionPerformed
    }//class clsOkListener
   
    private void DoButtonOK()
    {
        if (result==null)
        {
            //falls Null übergeben wurde
            ReturnClass result=new ReturnClass();
        }//if
           
        result.setTest1( txtField1.getText() );
        result.setTest2( txtField2.getText() );
        result.setTest3( txtField3.getText() );
        dialog.setVisible(false);
        dialog.dispose();
    }
   
    private void DoButtonCancel()
    {
        dialog.setVisible(false);
        dialog.dispose();
    }
   
    public static ReturnClass showDialog(String title, Object obj)
    {
        TestMyInputDialog dlgMy = new TestMyInputDialog(title, obj);
       
        return result;
    }//showDialog

}//class MyInputDialog

Java:
package MyJDialog;

public class ReturnClass
{
    private String strTest1;
    private String strTest2;
    private String strTest3;
   
    public ReturnClass()
    {
        this.strTest1="";
        this.strTest2="";
        this.strTest3="";
    }
   
    public ReturnClass(String strTest1,String strTest2 ,String strTest3)
    {
        this.strTest1=strTest1;
        this.strTest2=strTest2;
        this.strTest3=strTest3;
    }
   
    public String getTest1()
    {
        return strTest1;
    }
    public void setTest1(String test1)
    {
        strTest1 = test1;
    }
    public String getTest2()
    {
        return strTest2;
    }
    public void setTest2(String test2)
    {
        strTest2 = test2;
    }
    public String getTest3()
    {
        return strTest3;
    }
    public void setTest3(String test3)
    {
        strTest3 = test3;
    }
}//class

Weiss Jemand wie ich die Dialog-Klasse ändern muss?
Für einen Hinweis wäre ich sehr dankbar.

Hinweis: Bei einem Bibliotheksbesuch habe ich in einem Javahanbuch von Dirk Louis mal ein Beispiel gefunden.
Da ging es um einen Dialog mit drei Slidern, ich glaube das Beispiel hieß Audioregler.
Leider ist die Bibliothek derzeit geschlossen.

Gruss Hein_nieH
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Das passiert leider nicht.
Wieso erwartest du, dass es passiert? :)

ret = TestMyInputDialog.showDialog("Test Input Dialog", ret);
Du rufst .showDialog auf.

Code:
public static ReturnClass showDialog(String title, Object obj) {
  TestMyInputDialog dlgMy = new TestMyInputDialog(title, obj);
  return result;
}//showDialog
Und das ist deine showDialog Funktion. Da blockiert "offensichtlich" nichts. (Konstruktoren sollten normalerweise nicht blockierend sein -- zumindest habe ich noch keinen sinnvollen Anwendungsfall dafür gesehen.)

Leider ist die Bibliothek derzeit geschlossen.
Dafür gibt es doch das Internet! ;)

Du konstruierst im TestMyInputDialog-Konstruktor eine JDialog-Instanz. Diese Dialoginstanz musst du irgendwie modal (aka "blockierend") zur Anzeige bekommen. "jdialog show modal" liefert einiges auf google.
 

Hein_nieh

Grünschnabel
Hallo,

danke für die Antwort.
Habe soebend die Lösung gefunden, eigentlich ganz einfach.

In der Dialogklasse ist nachstehende Änderung vorzunehmen:

Java:
public static ReturnClass showDialog(String title, Object obj)
{
    TestMyInputDialog dlgMy = new TestMyInputDialog(title, obj);

    dialog.setvisible(true) // Muss hier gesetzt werden und nicht im Konstruktor

    return result;
}//showDialog

Jetzt funktioniert mein eigener Dialog wie er soll.
Bin durch das analysieren von Google-Beispielen drauf gekommen.

Gruss Hein_nieH