Welche Möglichkeiten bietet Java, ein Fenster zu erzeugen? - Sammlung von Techniken zum Layout-Projekt
(EN google-translate)
(PL google-translate)
Über die Java-Standard-Bibliotheken, stehen mindestens zwei möglichkeiten zur Verfügung ein Fenster zu erzeugen: Frame und JFrame. Da dies die Grundvoraussetzung zur Erzeugung von GUI-Anwendungen ist und dies auch notwendig zur Realisierung des Layout-Projekts ist und die bestehenden Möglichkeiten zu Beginn etwas verwirren können, werden diese hier in konzentrierter, einfacher Weise dargestellt:
Fenster in der main-Methode erzeugen
Die einfachste Möglichkeit besteht darin, ein Fenster direkt durch einen Aufruf in der main-Methode zu erzeugen.
|
//Codebeispiel wird innerhalb der Vorlesung entwickelt und danach an dieser Stelle ergänzt import javax.swing.JFrame; public class Hauptklasse { public static void main(String[] args) { JFrame fenster = new JFrame("Mein Fenster"); fenster.setBounds(100,200,500,400); //Verwendung der statischen Variable EXIT_ON_CLOSE: fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fenster.setVisible(true); } }
Code 0-1: Hauptklasse.java
Fenster durch eine Klasse, die von Fenster erbt erzeugen
Wenn man von der Fenster-Klasse (JFrame) erbt, hat man die Möglichkeit, einen eigenen Konstruktor zu schreiben, der z.B. Titel, Position und Größe setzt. Auf diese Weise wird die Benutzung dieser Klasse einfacher. Zudem macht es logisch Sinn, dass Fenster als übergeordnete Klasse erscheint "in der" andere Elemente enthalten sind.
//Codebeispiel wird innerhalb der Vorlesung entwickelt und danach an dieser Stelle ergänzt import javax.swing.JFrame; import java.awt.Color; import java.awt.Container; public class FensterErben extends JFrame { public FensterErben() { super("Mein Fenster"); //Aufruf des Konstruktors der Basisklasse //Hier Unsinn: JFrame fenster = new JFrame("Mein Fenster"); //Alternativ: setTitle("Mein Fenster"); //..oder so: this.setTitle("Mein Fenster"); setBounds(100,200,500,400); //Verwendung der statischen Variable EXIT_ON_CLOSE: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); //oder so: // this.setBounds(100,200,500,400); //Verwendung der statischen Variable EXIT_ON_CLOSE: // this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // this.setVisible(true); } public static void main(String[] args) { FensterErben fenster = new FensterErben(); //Funktioniert nicht: fenster.setBackground(new Color(127,127,255)); // fenster.getContentPane().setBackground(new Color(127,127,255)); //oder so: Container pane = fenster.getContentPane(); pane.setBackground(new Color(127,127,255)); } }
Code 0-2: FensterErben.java
Fenster in einer fremden Hauptklasse erzeugen
Eine auf den ersten Blick etwas abwegigere aber bei zweitem Hinsehen auch sinnvolle Möglichkeit ist es, ein Fenster im Konstruktor einer völlig anderen Klasse zu erzeugen. Da Lauscher die Schnittstelle ActionListener implementieren muß, um auf Knopfdrücke reagieren zu können, muß diese Klasse in jedem Fall selber geschrieben werden. Alle anderen Klassen können in ihrer Standardversion (ohne Vererbung) benutzt werden.
//Codebeispiel wird innerhalb der Vorlesung entwickelt und danach an dieser Stelle ergänzt
Code 0-3: Lauscher.java
"Long Version" zu Knopf
Das nachfolgende Programm setzt die gleiche Funktionalität um wie das vorhergehende, bneutzt aber zwei selbst geschriebene Klassen. Das macht die Programmstruktur zumindest für den Einstieg übersichtlicher.
//Codebeispiel wird innerhalb der Vorlesung entwickelt und danach an dieser Stelle ergänzt import javax.swing.JFrame; import java.awt.Color; import java.awt.Container; public class FensterErben extends JFrame { public FensterErben() { super("Mein Fenster"); //Aufruf des Konstruktors der Basisklasse //Hier Unsinn: JFrame fenster = new JFrame("Mein Fenster"); //Alternativ: setTitle("Mein Fenster"); //..oder so: this.setTitle("Mein Fenster"); setBounds(100,200,500,400); //Verwendung der statischen Variable EXIT_ON_CLOSE: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); //oder so: // this.setBounds(100,200,500,400); //Verwendung der statischen Variable EXIT_ON_CLOSE: // this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // this.setVisible(true); } }
Code 0-4: Fenster.java
//Codebeispiel wird innerhalb der Vorlesung entwickelt und danach an dieser Stelle ergänzt import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Lauscher implements ActionListener { JButton knopf; public Lauscher(JButton knopf) { this.knopf = knopf; //Verfügbarmachen des Knopfes durch "Registrieren" } public void actionPerformed(ActionEvent e) { knopf.setText("gedrückt"); } public static void main(String[] args) { FensterErben fenster = new FensterErben(); //Funktioniert nicht: fenster.setBackground(new Color(127,127,255)); // fenster.getContentPane().setBackground(new Color(127,127,255)); //oder so: Container pane = fenster.getContentPane(); pane.setBackground(new Color(127,127,255)); fenster.setLayout(null); JButton knopf = new JButton("Benjamin"); Lauscher lauscher = new Lauscher(knopf); knopf.addActionListener(lauscher); //Registrieren des Lauschers beim Knopf, //damit jedesmal, wenn der Knopf gedrückt wird, die Methode //actionPerformed() aufgerufen wird. fenster.getContentPane().add(knopf); knopf.setBounds(10,10,200,30); } }
Code 0-5: Lauscher.java