eine 'showDialog'-Methode erstellen

Dieses Thema eine 'showDialog'-Methode erstellen im Forum "Java Basics - Anfänger-Themen" wurde erstellt von Evolver, 27. Okt. 2007.

Status des Themas:
Es sind keine weiteren Antworten möglich.

Thema: eine 'showDialog'-Methode erstellen Ich würde gerne für einen modalen Dialog (eine Klasse die von JDialog erbt) eine Methode zum Öffnen mit einem...

  1. Ich würde gerne für einen modalen Dialog (eine Klasse die von JDialog erbt) eine Methode zum Öffnen mit einem Rückgabewert erstellen, der Rückgabewert sei abhängig von den Aktionen, die der Benutzer im Dialog macht. Man könnte das mit der showDialog-Methode von z.B. JFileChooser vergleichen. Nur wie muss ich da vorgehen? In der Methode sicherlich setVisible aufrufen, aber dann? Der Rückgabewert steht ja zu diesem Zeitpunkt noch nicht fest.
     
  2. Schau mal hier --> (hier klicken!)
    Dort wirst du fündig!
  3. bin mir nicht sicher ob dir das hilft aber da gibts schon fertige dialoge (JOtpionPane einfach mal googlen)

    wenn du es mit jdialog machen willst musst du anfags setVisible aufrufen und sollange warten bis zum beispiel ein actionEvent geworfen wird der user also einen button gedrückt hat, dann kanst du je nachdem welcher button gedrückt wurde das entsprechende zurückgeben. die methode showDialog darf also nicht sofort beendet werden, sondern sie muss solange blockieren bis der user eben einen button drückt.
     
  4. Ja, soweit war ich auch schon. Und wie blockiere ich sie richtig? Ich habe versucht einfach wait() zu verwenden und dann beim beenden notify(), bin mir aber erstens nicht sicher, ob das der richtige Ansatz ist und zweitens hat es nicht geklappt (wenn ich in showDialog nach setVisible die Methode wait aufrufe, wird der ganze "Dialog-Vorgang" blockiert).
     
  5. also wenn das jetzt die actionPerformed Methode deines dialoges wäre, dann würde der dialog doch solange angezeigt, bis jemand einen Button drückt oder?


    Code (Text):
                public void actionPerformed(ActionEvent e) {
                    String label;

                    label = e.getActionCommand();

                    if (label.equals("Abbruch")) {
                        textEingabe = "null";
                        setVisible(false);
                        return;
                    }

                    if (label.equals("OK")) {
                        textEingabe = eingabefeld.getText();
                        setVisible(false);
                        return;
                    }
                } // Ende von 'ActionPerformed'

                public String getString() {
                    return textEingabe;
                }
    und das da unten könnte doch die showDialog methode sein. Dann würde der dialog doch solange sichtbar sein bis jemand einen Button drückt und dann würde getString doch das ergebnis zurückgeben

    Code (Text):
           
    public String showDialog(){

    CFrageDialog frage = new CFrageDialog(this, "Ihr Text");
            frage.setVisible(true);
            return frage.getString();
    }
     
    nicht getestet bin grad verwiert ???:L
     
  6. ok hab es getestet hier mal ein vollständig compilierbares beispiel
    Code (Text):

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;




    public class Test {
       


    public static void main(String[] args){
    Test t = new Test();
     CFrageDialog dialog= new CFrageDialog(null, "Ihr Text");
    System.out.println(dialog.showDialog());
    System.out.println("falsch wenn es vor showDialog kommt");
    }

            class CFrageDialog extends JDialog implements ActionListener {

                private JTextField eingabefeld;

                private JButton oK, abbruch;

                private String textEingabe;

                // der Konstruktor
                CFrageDialog(JFrame f, String titel) {
                    super(f, titel, true); // Konstruktor der Basisklasse aufrufen
                    setResizable(false);

                    setLayout(new BorderLayout());

                    // es werden 2 Panels angelegt. Das eine enthält das TextField,
                    // das andere die Buttons
                    JPanel panel1 = new JPanel();
                    JPanel panel0 = new JPanel();
                    panel0.setLayout(new BorderLayout());
                    JLabel label = new JLabel(" Ihr Text:");
                    panel0.add("West", label);
                    eingabefeld = new JTextField(50);
                    add("North", panel0);

                    panel1.add(eingabefeld);
                    add("Center", panel1);

                    JPanel panel2 = new JPanel();
                    oK = new JButton("OK");
                    abbruch = new JButton("Abbruch");
                    panel2.add(oK);
                    panel2.add(abbruch);
                    add("South", panel2);

                    pack(); // Anordnung der Oberflächenelemente auf bevorzugte
                    // Größe initialisieren

                    // das Maus-Handling für die Buttons macht die Klasse
                    // selbst, also bei sich selber registrieren
                    oK.addActionListener(this);
                    abbruch.addActionListener(this);

                    // Fenster schließen = Fenster verbergen
                    setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
                }

                public void actionPerformed(ActionEvent e) {
                    String label;

                    label = e.getActionCommand();

                    if (label.equals("Abbruch")) {
                        textEingabe = null;
                        setVisible(false);
                        return;
                    }

                    if (label.equals("OK")) {
                        textEingabe = eingabefeld.getText();
                        setVisible(false);
                        return;
                    }
                } // Ende von 'ActionPerformed'

                public String getString() {
                    return textEingabe;
                }

    public String showDialog(){
         
           
            this.setVisible(true);
            return this.getString();
           
       

    }  
            }


        }
     
    so müsste es funktionieren

    //edit: so ist es doch eine membervariable von CFrageDialog oder ?
     
  7. Tut mir leid, dass ich deine Mühen so abtue, aber so bekomme ich das auch hin. die showDialog-Methode soll ja einer Member-Methode des Dialogs sein, und nicht irgendwo anderes definiert. Darum habe ich ja geschrieben, es sollte z.B. so wie bei JFileChooser sein.

    Wo könnte man sich denn den OrginalCode von JFileChooser ansehen? Habe danach gegooglt, aber das passende Ergebnis nicht gefunden.
     
  8. Von Sun runterladen, wo auch sonst.
    Je nach OS ist der auch direkt dem JDK beigelegt (src.zip).
    Der relevante Teil ist Dialog#show() und das ist auch die Lösung deines Problems.
    Ruft man show auf einem modalen Dialog auf, blockiert der Aufrufer solange bis der Dialog verschwindet.
     
  9. sun schreibt dazu aber
    somit sollte man doch setVisible benutzen also war meins doch gar nicht so falsch oder :?:


    //edit: der Code von JFileChooser#openDialog();

    Code (Text):
        public int showDialog(Component parent, String approveButtonText)
            throws HeadlessException {
        if(approveButtonText != null) {
            setApproveButtonText(approveButtonText);
            setDialogType(CUSTOM_DIALOG);
        }
        dialog = createDialog(parent);
        dialog.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
            returnValue = CANCEL_OPTION;
            }
        });
        returnValue = ERROR_OPTION;
        rescanCurrentDirectory();

        dialog.show();
        dialog.dispose();
        dialog = null;
        return returnValue;
        }
    ist bis auf show und setVisible doch ziemlich ähnlich
     
  10. Richtig. Unter der Haube macht es keinen Unterschied, setVisible ruft einfach show auf.
    Der Dialog muss lediglich modal sein. Dann macht man sich eine Methode im abgeleiteten Dialog:
    MyReturnValue showFooBarDialog()
    die setVisible aufruft und fertig.
     
  11. Manchmal frage ich mciht, warum ich es mir so schwer mache.
    Ganz am Anfang hatte ich einfach:
    Code (Text):
        public int openDialog()
        {
            this.setVisible(true);
            return 123;   // Testwert
        }
    ...und habe mir dort, wo der Dialog aufgerufen wird, den Rückgabewert ausgeben lassen. Das passierte natürlich - so wie es sein sollte - nachdem der Dialog geschlossen wurde. Ich bin einfach davon ausgegegangen, dass die Methode zuende bearbeitet wird und danach blockiert (sozusagen an der stelle des Aufrufens). Dass das Blockieren direkt in der Methode stattfindet wollte mir nicht in den Sinn kommen :(.

    Also wieder ein Problem, wo eigentlich keines war. Danke.
     
  12. Kostenlose Java-Grundlagen DVD im Wert von 29,95 € heute kostenlos sichern (Klick)
Die Seite wird geladen...

eine 'showDialog'-Methode erstellen - Ähnliche Themen

Forum Datum
Lösung einer Aufgabe im "Workshop Java EE7" Allgemeines EE Heute um 19:30 Uhr
Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT Heute um 14:33 Uhr
Warum habe ich keine Spaltenüberschriften? Allgemeine Java-Themen Gestern um 10:12 Uhr
"Elegantes" Füllen eines Models? Java Basics - Anfänger-Themen Samstag um 17:57 Uhr
Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen Samstag um 13:19 Uhr
Status des Themas:
Es sind keine weiteren Antworten möglich.
Interessante Stellenangebote


Weitere Stellenanzeigen

Stellenanzeige Mediadaten