Eigener Dialog mit Rückgabe -> Warten auf Button

Diskutiere Eigener Dialog mit Rückgabe -> Warten auf Button im AWT, Swing, JavaFX & SWT Bereich.
H

Hein_nieH

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.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);
        dialog.setModal(true);
      
        //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
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:
H

Hein_nieH

Problem gelöst:

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
Gruss Hein_nieH
 
Blender3D

Blender3D

Hier die Dialogklasse:
Das lässt sich einfacher lösen. ;)

Java:
import javax.swing.JOptionPane;
public class start {
    public static void main(String[] args) {
        String[] label = { "Text A", "Text B", "Text C", "Text D" };
        MultiInputDialog dialog = new MultiInputDialog(label, "Test multi input");
        if (dialog.showDialog(null, JOptionPane.OK_OPTION, JOptionPane.DEFAULT_OPTION)) {
            String[] result = dialog.getText();
            for (int i = 0; i < label.length; i++)
                System.out.print(label[i] + "\t-> " + result[i] + "\n");
        }
    }
}
Java:
import java.awt.Component;
import java.util.Arrays;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class MultiInputDialog {
    private JTextField[] text;
    private String[] label;
    private String headline;

    public MultiInputDialog(String[] label, String headline) {
        this.label = Arrays.copyOf(label, label.length);
        text = new JTextField[label.length];
        for (int i = 0; i < label.length; i++)
            text[i] = new JTextField();
        this.headline = headline;
    }

    private Object[] getObjects(String[] labels) {
        Object[] fields = new Object[labels.length * 2];
        int cnt = 0;
        for (int i = 0; i < fields.length - 1; i += 2) {
            fields[i] = labels[cnt];
            fields[i + 1] = text[cnt];
            cnt++;
        }
        return fields;
    }

    public String[] getLabel() {
        return Arrays.copyOf(label, label.length);
    }

    public String[] getText() {
        String[] result = new String[text.length];
        for (int i = 0; i < text.length; i++)
            result[i] = text[i].getText();
        return result;
    }

    public void reset() {
        for (JTextField t : text)
            t.setText("");
    }

    public boolean showDialog(Component parent, int optionType, int messageType) {
        return JOptionPane.showConfirmDialog(parent, getObjects(label), headline, optionType,
                messageType) == JOptionPane.OK_OPTION;
    }
}
 
H

Hein_nieH

Hallo Blender3D,

vielen Dank für die Mühe. Ich werde mir den Code genauer anschauen.
Zunächst bin ich aber froh für das Problem überhaupt eine Lösung gefunden zu haben.

Mit freundlichen Gruessen
Hein_neH
 
Thema: 

Eigener Dialog mit Rückgabe -> Warten auf Button

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben