kramann.info
© Guido Kramann

Login: Passwort:










7.1 Welche Möglichkeiten bietet Java, ein Fenster zu erzeugen? - Sammlung von Techniken zum Layout-Projekt

7.1 (EN google-translate)

7.1 (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.

  • Ein Fenster ist ein Objekt. Folglich wird ein entsprechender Konstruktor aufgerufen.
  • Titel und Größe des Fensters müssen estgelegt werden.
  • Der Titel wird über einen Übergabeparameter des Konstruktors festgelegt.
  • Position und Größe des Fensters werden mit Hilfe der Methode setBounds(...) gesetzt.
  • Um das Schließen des Fensters über das Anklicken des "X" durchführen zu können, wird die so geannte Default-Close-Operation gesetzt.
//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 7.1-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 7.1-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 7.1-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 7.1-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 7.1-5: Lauscher.java