7.10 Modale Dialogfenster
Das Hauptfenster (= Elternfenster) öffnet ein Dialogfenster (= Kindfenster) und übernimmt Eingabedaten des Dialogs.
- Zu den Klassen:
- DialogModalKonstante
- DialogModalElternfensterV
- DialogModalKindfensterV
- DialogModalElternfensterV
7.10.1 Ressource- und Properties-Dateien
Basis-Ressource-Dateiat.beringer.oopBuch.resources.dialogModal.properties |
---|
FENSTERTITEL_E = Swing-Dialog modal - Elternfenster (I18N) LABEL1TEXT = Öffnet Dialogfenster:\u0020 BUTTON = Dialog LABEL2TEXT = Eingabe im Dialogfenster war:\u0020 # FENSTERTITEL_K = Swing-Dialog modal - Kindfenster (I18N) LABELTEXT = Bitte neue Farbe für Auto eingeben:\u0020 DLG_BUTTON1 = \u0020\u0020\u0020\u0020OK\u0020\u0020\u0020\u0020 DLG_BUTTON2 = Abbruch MELDETEXT = gedrückt |
Properties-Dateiat/beringer/oopBuch/properties/dialogModal.properties |
---|
LOCATIONx = 500 LOCATIONy = 50 FENSTERBREITE = 500 FENSTERHOEHE = 150 |
7.10.2 Statische Klasse für Ressource- und Properties-Konstante
Klasse DialogModalKonstante |
---|
/* * DialogModalKonstante.java */ package at.beringer.oopBuch.guiSwingI18N; import java.util.Locale; import java.util.ResourceBundle; import java.util.Properties; import java.io.FileInputStream; import java.io.IOException; /** Statische Klasse für Ressource- und Properties-Konstante. <p> Texte und Beschriftungen werden aus einer (lokalisierten) Ressource-Datei (d.h. einer lokalisierten Properties-Datei) gelesen. <br /> Die Dateinamenserweiterung von Ressource-Dateien muss 'properties' sein. </p> <p> Bem.: Klassen-Dateien und Bild-Dateien sind ebenfalls Ressourcen. </p> <p> Ressource-Dateien müssen INNERHALB des Klassenpfads liegen. </p> <p> Verzeichnis für die Ressource-Dateien: <br /> <pre> <strong>at.beringer.oopBuch.resources</strong> </pre> </p> <p> Basisname der Ressource-Dateien: <br /> <pre> <strong>dialogModal</strong> </pre> </p> <p> --> vollständiger qualifizierter Name der Ressource-Dateien: <br /> <pre> at.beringer.oopBuch.resources.dialogModal.properties at.beringer.oopBuch.resources.dialogModal_de_AT.properties at.beringer.oopBuch.resources.dialogModal_en.properties </pre> <br /> usw. </p> <p> Die JVM sucht - analog zur Suche einer Klasse - automatisch nach der entsprechenden (lokalisierten) Ressource-Datei. <br /> Die JVM behandelt eine Ressource-Datei wie eine Klasse, u.a. wird eine Resource-Datei automatisch geladen. Wenn die Datei nicht existiert, wird eine 'MissingResourceException' ausgelöst. </p> <p> Der Benutzer kann (und darf) Ressource-Dateien <strong>nicht</strong> ändern. </p><hr /><p> Nicht-lokalisierte Konstante können in Properties-Dateien definiert werden. Im Allg. ist die Dateinamenserweiterung von Properties-Dateien 'properties', allerdings ist - im Gegensatz zu Ressource-Dateien - jede beliebige Dateinamenserweiterung erlaubt. </p> <p> Properties-Dateien müssen AUSSERHALB des Klassenpfads liegen. </p> <p> Name der Properties-Datei für nicht-lokalisierte Konstante: <br /> <pre> <strong>dialogModal.properties</strong> </pre> </p> <p> Diese Properties-Datei muss enthalten sein im Unterverzeichnis<br /> <pre> <strong>at/beringer/oopBuch/properties</strong> </pre> <br /> des Benutzerverzeichnisses (d.h. des Projektverzeichnis). </p> <p> --> vollständiger qualifizierter Name der Properties-Datei: <br /> <pre> <strong>at/beringer/oopBuch/properties/dialogModal.properties</strong> </pre> </p> <dl> <dt>Bem.: <dd>Ressource- und Properties-Dateien befinden sich immer in unterschiedlichen Verzeichnissen (innerhalb bzw. außerhalb des Klassenpfads). Daher können die Dateinamen von Ressource- und Properties- Dateien gleich sein (müssen aber nicht). </dl> <p> Der Benutzer kann (und darf) Properties-Dateien ändern. </p> <hr /> @since Juni 2012 @see DialogModalElternfensterV @see DialogModalKindfensterV @author Beringer Alfred */ public final class DialogModalKonstante { // ------------------------------------------------------------------------- // Private Klassenkonstante // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // Ressource-Datei /** Basisname der Ressource-Dateien für lokalisierte Konstante (Texte und Beschriftungen) */ private static final String RESS_DATEINAME = "at.beringer.oopBuch.resources.dialogModal"; /** Ressource-Datei für lokalisierte Konstante (Texte und Beschriftungen). <p> Die JVM sucht - analog zur Suche einer Klasse - automatisch nach der entsprechenden Ressource-Datei. </p> */ private static final ResourceBundle RESS; // ------------------------------------------------------------------------- // Projekt-Verzeichnis /** Name des Projekt-Verzeichnisses */ private static final String PROJEKTVERZEICHNISNAME = System.getProperty("user.dir") + System.getProperty("file.separator") + "at" + System.getProperty("file.separator") + "beringer" + System.getProperty("file.separator") + "oopBuch" + System.getProperty("file.separator"); // ------------------------------------------------------------------------- // Properties-Datei /** Name der Properties-Datei (für nichtlokalisierte Konstante) */ private static final String PROPS_DATEINAME = PROJEKTVERZEICHNISNAME + "properties" + System.getProperty("file.separator") + "dialogModal.properties"; /** Properties-Datei für nichtlokalisierte Konstante */ private static final Properties PROPS; // ------------------------------------------------------------------------- // Öffentliche Klassenkonstante // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // System Konstante: public static final String NEUEZEILE = System.getProperty("line.separator"); // ------------------------------------------------------------------------- // Lokalisierte Konstante: // Texte und Beschriftungen für GUI-Komponenten: public static final String FENSTERTITEL_E; public static final String LABEL1TEXT; public static final String BUTTON; public static final String LABEL2TEXT; public static final String FENSTERTITEL_K; public static final String LABELTEXT; public static final String DLG_BUTTON1; public static final String DLG_BUTTON2; public static final String MELDETEXT; // ------------------------------------------------------------------------- // Nichtlokalisierte Konstante: // Koordinaten für Location des Dialogfensters public static final int LOCATIONx; private static final String LOCATIONxstr; public static final int LOCATIONy; private static final String LOCATIONystr; // Fenstergröße (Kindfenster) public static final int FENSTERBREITE; private static final String FENSTERBREITEstr; public static final int FENSTERHOEHE; private static final String FENSTERHOEHEstr; // ------------------------------------------------------------------------- // Klassenkonstruktor // ------------------------------------------------------------------------- /** Klassenkonstruktor. <br /> Initialisieren der Klassenkonstanten. <p> Die Anfangswerte für die Klassenkonstanten werden von einer Ressource- und einer Properties-Datei übernommen. </p> */ static { // --------------------------------------------------------------------- // Ressources RESS = ResourceBundle.getBundle(RESS_DATEINAME, Locale.getDefault()); FENSTERTITEL_E = RESS.getString("FENSTERTITEL_E"); LABEL1TEXT = RESS.getString("LABEL1TEXT"); BUTTON = RESS.getString("BUTTON"); LABEL2TEXT = RESS.getString("LABEL2TEXT"); FENSTERTITEL_K = RESS.getString("FENSTERTITEL_K"); LABELTEXT = RESS.getString("LABELTEXT"); DLG_BUTTON1 = RESS.getString("DLG_BUTTON1"); DLG_BUTTON2 = RESS.getString("DLG_BUTTON2"); MELDETEXT = RESS.getString("MELDETEXT"); // --------------------------------------------------------------------- // Properties PROPS = new Properties(); try { PROPS.load(new FileInputStream(PROPS_DATEINAME)); } catch (IOException exc) { System.err.println("Properties-Datei nicht gefunden!!!!!!!!"); // Default properties: PROPS.setProperty("LOCATIONx", "500"); PROPS.setProperty("LOCATIONy", "50"); PROPS.setProperty("FENSTERBREITE", "500"); PROPS.setProperty("FENSTERHOEHE", "150"); } LOCATIONxstr = PROPS.getProperty("LOCATIONx"); LOCATIONx = Integer.parseInt(LOCATIONxstr); LOCATIONystr = PROPS.getProperty("LOCATIONy"); LOCATIONy = Integer.parseInt(LOCATIONystr); FENSTERBREITEstr = PROPS.getProperty("FENSTERBREITE"); FENSTERBREITE = Integer.parseInt(FENSTERBREITEstr); FENSTERHOEHEstr = PROPS.getProperty("FENSTERHOEHE"); FENSTERHOEHE = Integer.parseInt(FENSTERHOEHEstr); } // ------------------------------------------------------------------------- // Konstruktoren // ------------------------------------------------------------------------- /** Privater Standardkonstruktor */ private DialogModalKonstante() { } } |
7.10.3 Klassendefinition des Elternfensters mit Ereigniswächter (Hauptfenster)
Klasse DialogModalElternfensterV |
---|
/* * DialogModalElternfensterV.java */ package at.beringer.oopBuch.guiSwingI18N; import javax.swing.*; import java.awt.*; import java.awt.event.*; import at.beringer.oopBuch.einfacheBsp.AutoM; import static at.beringer.oopBuch.guiSwingI18N.DialogModalKonstante.*; /** Hauptfenster für einen modalen Dialog. <br /> Schaltfläche öffnet Dialogfenster, Textbereich speichert Dialogeingabe. <p> Anonyme Klasse: von 'ActionListener' <br /> Model-Klasse: 'AutoM' (dient als Fachobjekt zum Testen dieser Fensterklasse) </p> <p> Vollständig internationalisierte und parametrisierte Klasse. </p> <hr /> @since Juni 2012 @see DialogModalElternfensterV @see DialogModalKonstante @see DialogModalKindfensterV @see AutoM @see ProgrammDialogModal @author Beringer Alfred */ public class DialogModalElternfensterV extends JFrame { // ------------------------------------------------------------------------- // Instanzattribute // ------------------------------------------------------------------------- private JLabel label1 = new JLabel(LABEL1TEXT); private JButton button = new JButton(BUTTON); private JLabel label2 = new JLabel(LABEL2TEXT); private JTextArea text = new JTextArea("",4,20); private JScrollPane textscroll = new JScrollPane(text); private DialogModalKindfensterV dlg; /** Model-Klasse: Fachobjekt (zum Testen) */ private AutoM auto = new AutoM(); // ------------------------------------------------------------------------- // Konstruktoren // ------------------------------------------------------------------------- /** Standardkonstruktor */ public DialogModalElternfensterV() { this.setTitle(FENSTERTITEL_E); // Methode 'pack' (statt 'setSize') erst nach Fertigstellung des // Fensters durchführen! this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new GridLayout(2,1)); // Eigenschaften der GUI-Komponenten definieren text.setEditable(false); // GUI-Komponenten mit Hilfe von Layout-Managern anordnen JPanel p1 = new JPanel(); JPanel p11 = new JPanel(); JPanel p12 = new JPanel(); JPanel p2 = new JPanel(); JPanel p21 = new JPanel(); JPanel p22 = new JPanel(); p11.setLayout(new FlowLayout(FlowLayout.RIGHT)); p11.add(label1); p12.setLayout(new FlowLayout(FlowLayout.LEFT)); p12.add(button); p1.setLayout(new GridLayout(1,2)); p1.add(p11); p1.add(p12); p21.setLayout(new FlowLayout(FlowLayout.RIGHT)); p21.add(label2); p22.setLayout(new FlowLayout(FlowLayout.LEFT)); p22.add(textscroll); p2.setLayout(new GridLayout(1,2)); p2.add(p21); p2.add(p22); // GUI-Komponenten dem Fenster hinzufügen this.add(p1); this.add(p2); this.pack(); // GUI-Komponenten bei Ereigniswächtern anmelden button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { buttonevent(evt); // Event mitgeben, falls Daten vom Event benötigt werden } }); initDialogfenster(); } /** Dialogfenster erzeugen - eigene Referenz mitgeben, falls Daten vom Elternfenster benötigt werden <br /> Fenster als Dialog darstellen, d.h. Fenstergröße kann nicht verändert werden, nur Schließen möglich */ private void initDialogfenster() { dlg = new DialogModalKindfensterV(this); dlg.setModal(true); // Dialog modal definieren dlg.setResizable(false); // Fenstergröße kann nicht verändert werden dlg.setLocation(LOCATIONx, LOCATIONy); // Dialogfenster platzieren } // ************************************************************************* // Ereignisbehandlungsmethoden // ************************************************************************* /** Methode für Schaltfläche 'button'. @param evt ActionEvent (von API-Methode 'actionPerformed' übernommen) */ private void buttonevent(ActionEvent evt) { dlg.setVisible(true); // Dialogfenster anzeigen /* Applikation stoppt hier (Dialog ist modal!) */ if (dlg.getEnde().equals(DLG_BUTTON1)) { auto.setFarbe(dlg.getRueckgabe()); auto.zeigeInhalt(); // nur zum Testen text.append(dlg.getRueckgabe()); text.append(NEUEZEILE); } } } |
7.10.4 Klasse für das modale Kindfensters mit Ereigniswächter (Dialogfenster)
Klasse DialogModalKindfensterV |
---|
/* * DialogModalKindfensterV.java */ package at.beringer.oopBuch.guiSwingI18N; import javax.swing.*; import java.awt.event.*; import at.beringer.oopBuch.einfacheBsp.AutoM; import static at.beringer.oopBuch.guiSwingI18N.DialogModalKonstante.*; /** Modales Dialogfenster. <br /> Textfeld für Eingabe mit 2 Buttons ('OK' und 'Abbruch'). <p> Anonyme Klassen: von 'ActionListener' <br /> und von 'WindowAdapter' <br /> Model-Klasse: 'AutoM' (dient als Fachobjekt zum Testen dieser Fensterklasse) </p> <p> Vollständig internationalisierte und parametrisierte Klasse. </p> <hr /> @since Juni 2012 @see DialogModalKindfensterV @see DialogModalKonstante @see DialogModalElternfensterV @see AutoM @author Beringer Alfred */ public class DialogModalKindfensterV extends JDialog { // ------------------------------------------------------------------------- // Instanzattribute // ------------------------------------------------------------------------- private JLabel label = new JLabel(LABELTEXT); private JTextField text = new JTextField(20); private JButton button1 = new JButton(DLG_BUTTON1); private JButton button2 = new JButton(DLG_BUTTON2); private JFrame elternfenster; /** Inhalt des Textfelds, der ans Elternfenster übergeben werden soll. */ private String rueckgabe; /** gedrückter Button ('OK' oder 'Abbruch' oder 'X'). */ private String ende; /** Model-Klasse: Fachobjekt (zum Testen) */ private AutoM auto = new AutoM(); // ------------------------------------------------------------------------- // Konstruktoren // ------------------------------------------------------------------------- /** Referenz auf Elternfenster wird übernommen, falls Daten vom Elternfenster benötigt werden. @param elternfenster Elternfenster */ public DialogModalKindfensterV(JFrame elternfenster) { this.elternfenster = elternfenster; this.setTitle(FENSTERTITEL_K); this.setSize(FENSTERBREITE, FENSTERHOEHE); this.setLayout(null); // Eigenschaften der GUI-Komponenten definieren text.setEditable(true); // GUI-Komponenten im Fenster platzieren label.setBounds( 10, 20, label.getPreferredSize().width, label.getPreferredSize().height); text.setBounds( 230, 20, text.getPreferredSize().width, text.getPreferredSize().height); button1.setBounds(100, 70, button1.getPreferredSize().width, button1.getPreferredSize().height); button2.setBounds(280, 70, button2.getPreferredSize().width, button2.getPreferredSize().height); // GUI-Komponenten dem Fenster hinzufügen this.add(label); this.add(text); this.add(button1); this.add(button2); // GUI-Komponenten bei Ereigniswächtern anmelden this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent evt) { fensterschliessen(evt); } }); button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { button1event(evt); } }); button2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { button2event(evt); } }); } // --------------------------------------------------------------------------- // Zugriffsmethoden (Get- und Set-Methoden) // --------------------------------------------------------------------------- /** Liefert den Inhalt des Textfelds, der ans Elternfenster übergeben werden soll. @return Inhalt Textfeld */ public String getRueckgabe() { return rueckgabe; } /** Liefert den gedrückten Button ('OK' oder 'Abbruch' oder 'X'). @return gedrückter Button */ public String getEnde() { return ende; } // ************************************************************************* // Ereignisbehandlungsmethoden // ************************************************************************* /** Methode für Schaltfläche 'OK'. @param evt ActionEvent (von API-Methode 'actionPerformed' übernommen) */ private void button1event(ActionEvent evt) { ende = DLG_BUTTON1; rueckgabe = text.getText(); auto.ausgeben(ende + " " + MELDETEXT + " *" + rueckgabe + '*'); fensterende(); } /** Methode für Schaltfläche 'Abbruch'. @param evt ActionEvent (von API-Methode 'actionPerformed' übernommen) */ private void button2event(ActionEvent evt) { ende = DLG_BUTTON2; rueckgabe = ""; auto.ausgeben(ende + " " + MELDETEXT); fensterende(); } /** Methode für 'Fenster schließen'. @param evt WindowEvent (von API-Methode 'windowClosing' übernommen) */ private void fensterschliessen(WindowEvent evt) { ende = "X"; rueckgabe = ""; auto.ausgeben(ende + " " + MELDETEXT); fensterende(); } /** Dialogfenster beenden. */ private void fensterende() { text.setText(""); this.setVisible(false); this.dispose(); } } |
- Bem.:
- Dieses Beispiel soll allgemein zeigen, wie Dialoge programmiert werden. Dieser Standarddialog könnte natürlich einfacher mit Hilfe der Klasse
JOptionPane
realisiert werden, indem dieDialogModalKindFensterV
-Klasse durch das folgende Standarddialogfenster ersetzt wird:
String rueckgabe = JOptionPane.showInputDialog(LABELTEXT);
- Weiter
- zu Kapitel 8 (JDBC)
- zu den C#-Klassenbeispielen von Kapitel 9.19.1 (Exceptions)
- zu den C#-Klassenbeispielen von Kapitel 10 (Ein-/Ausgabe von Daten)
- zu Kapitel 12 (PL/I)
- zu Kapitel 13 (Reservierte Worte)
- zu den C#-Klassenbeispielen von Kapitel 9.19.1 (Exceptions)
- Zurück
- zum Anfang dieses Kapitels
- zum Inhaltsverzeichnis
- zu Kapitel 1
- zu den Klassenbeispielen von Kapitel 2
- zur Parameterübergabe (Kapitel 2.7.1)
- zu Kapitel 3
- zu den Klassenbeispielen von Kapitel 4
- zu den Java-Klassenbeispielen von Kapitel 5.19.1 (Exceptions)
- zu den Java-Klassenbeispielen von Kapitel 6 (Ein-/Ausgabe von Daten)
- zu den Java-GUI-Beispielen von Kapitel 7.4 (Einführung)
- zu den Java-GUI-Beispielen von Kapitel 7.5 (Fenster mit Label und Buttons)
- zu den Java-GUI-Beispielen von Kapitel 7.8 (Maus, Musterfenster, Menü)
- zu den Java-GUI-Beispielen von Kapitel 7.9 (I18N - L10N - Parametrisierung)
- zum Inhaltsverzeichnis
- Zur
- Java-Dokumentation der Java-Beispiele