eine 'showDialog'-Methode erstellen

  1. #1
    Evolver


    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 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. #2
    anfänger15


    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.

  3. #3
    Evolver


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

  4. #4
    anfänger15


    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:
    			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:
    	    
    public String showDialog(){
    
    CFrageDialog frage = new CFrageDialog(this, "Ihr Text");
    		frage.setVisible(true);
    		return frage.getString();
    }
    nicht getestet bin grad verwiert

  5. #5
    anfänger15


    ok hab es getestet hier mal ein vollständig compilierbares beispiel
    Code:
    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 ?

  6. #6
    Evolver


    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.

  7. #7
    Wildcard


    Zitat Zitat von Evolver
    Wo könnte man sich denn den OrginalCode von JFileChooser ansehen? Habe danach gegooglt, aber das passende Ergebnis nicht gefunden.
    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.

  8. #8
    anfänger15


    sun schreibt dazu aber
    Deprecated. As of JDK version 1.1, replaced by setVisible(boolean).
    somit sollte man doch setVisible benutzen also war meins doch gar nicht so falsch oder :?:


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

    Code:
        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

  9. #9
    Wildcard


    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.

  10. #10
    Evolver


    Manchmal frage ich mciht, warum ich es mir so schwer mache.
    Ganz am Anfang hatte ich einfach:
    Code:
    	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.


Keine Antwort auf Deine Suche gefunden? Registriere Dich kostenlos und stelle Deine eigene Frage zu Java!

Jetzt kostenlos registrieren