import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * Finales Beispiel zu Swing-GUI, und ActionEvents. * Zeigt zwei Instanzen einer Klasse die (jeweils) ein Fenster öffnet und * auf Events reagiert. Demonstriert inner classes.
* Noch offen: anonymous inner classes * @author Tom.Eicher@bigfoot.com */ public class Fenster5 implements ActionListener { /** * prozeduraler / strukturierter Startpunkt der Anwendung. Instanziiert * lediglich die Fenster5 objekte. Alles weitere passiert in deren * Konstruktoren */ public static void main(String[] aaa) { new Fenster5("Eins"); new Fenster5("Zwei"); } // innerhalb Klasse = member Variable. Zugriff aus allen Methoden /** trägt den Namen der Fenster5 instanz. */ private String name; /** Textfeld zur Ein- und Ausgabe */ private JTextArea textfeld; /** Statusfeld zur Ausgabe */ private JLabel status; /** Referenz auf JFrame-Objekt. Benötigt um später das Fenster zu vernichten */ private JFrame f; /** * Constructor erzeugt neue Fenster5 instanz. Kann nur mit dem Namen der * (zukünftigen) Instanz aufgerufen werden. * @param titel Namen der (zukünftigen) Instanz */ public Fenster5(String titel) { // innerhalb Konstruktor = local Variable. Nur hier Zugriff. f = new JFrame(titel); JFrame x = f; name=titel; textfeld = new JTextArea("Es war einmal..."); // Toolbar bauen JPanel toolbar = new JPanel(); toolbar.setLayout(new FlowLayout(FlowLayout.LEFT)); // Erzeugen der Inner classes. Geht nur im nicht-static code! toolbar.add(new InnererLoadButton()); toolbar.add(new InnererSaveButton()); JButton ende = new JButton("Exit"); toolbar.add(ende); // "ende" wird nicht mit inner class sondern mit Fenster5 selbst als // ActionListener behandelt. ende.addActionListener( this ); // StatusZeile bauen status = new JLabel ("Melde: "+name+" in Ordnung."); Container c = f.getContentPane(); c.setLayout (new BorderLayout()); c.add(toolbar, BorderLayout.NORTH); c.add(status, BorderLayout.SOUTH); JScrollPane textPane = new JScrollPane(textfeld); c.add(textPane, BorderLayout.CENTER); f.pack(); // Ideale Grösse berechnen f.setVisible(true); // Sichtbar machen. Meldet beim 1sten mal beim // Betriebssystem / java.exe zur Darstellung an. } /** * implementiert das ActionListener interface für Fenster5. Wird * benötigt weil für "Exit" Fenster5 selbst als ActionListener fungiert. */ public void actionPerformed(ActionEvent e) { System.out.println("Beende mich auf Benutzer-Wunsch im Fenster "+name); f.setVisible(false); f.dispose(); //System.exit(0); //beendet die JVM - endgültig! } /** * inner-class implementierung des Load-Knopfes. * greift dank der inner-class Funktionalität auf private members von * Fenster5 zu! */ public class InnererLoadButton extends JButton implements ActionListener { /** * Creiere neue Instanz durch Übergabe von Beschriftung an JButton * super-Konstruktor, dann registriere mich selbst als ActionListener */ public InnererLoadButton() { super("Load"); addActionListener(this); } /** * Reagiere auf Aktionen dieses Knopfes. Arbeitet mit private * members meiner outer class Fenster5. */ public void actionPerformed(ActionEvent ae) { System.out.println("Load something"); textfeld.setText("I was loaded!"); } } /** * inner-class implementierung des Save-Knopfes. * In Implementierung wie InnerLoadButton * @see Fenster5.InnererLoadButton */ public class InnererSaveButton extends JButton implements ActionListener { public InnererSaveButton() { super("Save"); addActionListener(this); } public void actionPerformed(ActionEvent ae) { status.setText("Saved something!"); } } }