Manfred Fettinger

Java‎ > ‎

Java GUI-Tutorial




DIES IST EINE UNTERSEITE DER JAVA-PAGE
Zurück zur Java Bluej Page


JAVA GUI Tutorial

Wie erstelle ich mein erstes GUI unter Java?

 

Ganz wichtig ist es, dass die Erklärungen auf dieser Seite nicht unbedingt richtig sein müssen!!!
Die hier abgebildeten Codes funktionieren zwar, jedoch möchte ich davor warnen, bzw. übernehme keine Verantwortung auf die Richtigkeit der hier gegebenen Erklärungen, da ich mich nicht selbst als Java-Profi sehe!!

 

Zuerst sollte man einmal wissen, aus welchen Elementen bzw. Objekten so ein GUI(=Graphical User Interface) besteht. Denn, zumindest war das bei mir so, erst dann wird einem klar was man da eigentlich macht bzw. programmieren muss!

1. Das Fenster - Frame

2. Ein Untergrund auf den wir etwas platzieren können - Panel

3. Diverse Dinge wie Buttons, Textfelder,..... welche auf dem Panel plaziert werden

Im Prinzip kann man immer sagen: zuerst Frame erstellen
                                              dann Panel erstellen
                                              diverse Buttons usw. auf Panel packen bzw. neue Panels darauf packen
                                              Panel auf Frame packen
                                              Frame anzeigen


Zuerst gibts ja da mal das eigentliche Fenster. Wir erstellen es mit Swing und nehmen hierfür ein JFrame.

import javax.swing.*;

public class FirstGUI extends JFrame
{
      public FirstGUI()
      {
              super("Fenster");
              setSize(300,300);
              setLocation(300,300);
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setVisible(true);
      }

       public static void main(String[] args)
       {
               FirstGUI g = new FirstGUI();
       }
}

So nun haben wir erstmal ein Fenster am Bildschirm, nur wie haben wir das nun geschafft?

import javax.swing.*;                                                                   Wir importieren diese Bibliothek für diverse Befehle

public class FirstGUI extends JFrame                                                Klasse erstellen, erbt von JFrame

      public FirstGUI()                                                                    Konstruktor
      {
              super("Fenster");                                                           Aufruf des Konstruktors der Superklasse mit übergabe eines Strings
              setSize(300,300);                                                          Fenster auf Grösse 300x300
              setLocation(300,300);                                                    Fenster auf Position 300/300
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             Beim schliessen des Fensters --> Programm beenden
              setVisible(true);                                                            Mach das Fenster sichtbar
      }

 

Genausogut funktioniert dieser Code:

import javax.swing.*;

public class FirstGUI 
{
    private JFrame fenster;

    public FirstGUI()
    {
        fenster = new JFrame("Fenster");
        fenster.setSize(300,300);
        fenster.setLocation(300,300);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setVisible(true);
    }

    public static void main(String[] args)
    {
        FirstGUI g = new FirstGUI();
    }
}

Einziger Unterschied, diese Klasse ist keine Subklasse von JFrame. Darum müssen wir ein Objekt von JFrame erstellen und sämtliche Befehle mit dem Namen des Objektes und dannach die Methode aufrufen.

Welche Art man wählt kommt ganz darauf an, ob sich die komplette Klasse wie ein JFrame verhalten soll oder nicht.


Gut, nun so ein leeres Fenster ist vielleicht am Anfang eine schöne Motivation, jedoch gibt es uns nicht wirlich viel! Wie wäre es nun wenn wir z.B. einen Button daraufsetzen würden!? Gut, mal sehen. Wie wir oben gelesen haben, benötigen wir dafür ein Panel also quasi Unterlage (nicht immer unbedingt, man kann aber z.B. Mausabfragen nur auf ein Panel machen). Wir werden nun also ein Panel und einen Button erzeugen

import javax.swing.*;
import java.awt.*;

public class FirstGUI extends JFrame
{
   private JButton button;
   private JPanel panel;

   public FirstGUI()
   {
       super("Fenster");
       setLocation(300,300);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setLayout(new BorderLayout(5,5));

       panel = new JPanel(new GridLayout(1,1));
       button = new JButton("erster Button");

       panel.add(button);

       getContentPane().add(panel);

       pack();
       setVisible(true);
   }

   public static void main(String[] args)
   {
        FirstGUI g = new FirstGUI();
   }
}

So hier sind nun einige neue Dinge passiert!

import javax.swing.*;                                                                    
import java.awt.*;                                                                        AWT Bibliothek importieren für einige Methoden

public class FirstGUI extends JFrame
{
   private JButton button;                                                                Instanzvariable für ein Button
   private JPanel panel;                                                                    Instanzvariable für ein Panel

   public FirstGUI()
   {
       super("Fenster");
       setLocation(300,300);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setLayout(new BorderLayout(5,5));                                            Ein Layout für JFrame festlegen

       panel = new JPanel(new GridLayout(1,1));                                   Ein Panel erzeugen mit GridLayout
       button = new JButton("erster Button");                                       Einen Button erzeugen

       panel.add(button);                                                                  Button auf Panel packen

       getContentPane().add(panel);                                                   Panel auf Frame packen

       pack();                                                                                 Komplettes Frame auf optimale Größe packen
       setVisible(true);
   }

   public static void main(String[] args)
   {
        FirstGUI g = new FirstGUI();
   }
}

 

Nun haben wir hier des öfteren etwas von Layout gehört, was hat es damit auf sich? Ein Layout gliedert ein Frame oder Panel in Bereiche ein, in diese man gezielt Buttons, Panels, TextField´s usw. hinensetzen kann. Damit das ganze dann auch eine schöne Anordnung hat so wie man sich das wünscht gibt es eben verschiedene Layouts.
Ich will hier jetzt nur auf 2 eingehen. Auf das GridLayout und das BorderLayout. Damit kann man meiner meinung nach schon viel abbilden. Für andere Layouts sucht einfach im Netz.

 

Das GridLayout

Format: new GridLayout(int Zeilen, int Spalten)

Wie man an der Abbildung sehen kann wird z.B. das Panel in Zeilen und Spalten eingeteilt. Objekte werden automatisch von links oben nach rechts unten angeordnet. Und zwar in dieser Reihenfolge in der man sie auf das Panel packt.

Das BorderLayout

Format: new BorderLayout(int horAbstand, int verAbstand)

Beim BorderLayout wird das Panel in 5 Bereiche eingeteilt. Norden, Süden, Osten, Westen und Mitte. Man kann nun Objekte in ein beliebiges Feld packen.

z.B. panel.add(BorderLayout.EAST, button);

Natürlich auch zu verwenden: BorderLayout.NORTH, ...WEST, ...SOUTH

Um in die Mitte zu platzieren braucht man nichts anzugeben. Einfach nur panel.add(button);

Wird ein Bereich nicht gefüllt, entsteht keine freie Fläche, sondern es wird der gesamte Bereich so weit wie möglich genutzt.

Ein Layout kann ein Frame und ein Panel haben. Vielleicht noch andere Komponenten auch, aber da hab ich keine genaue Ahnung darüber (siehe roter Text gaaaanz oben ;-) )



 

Gut, als nächstes wollen wir folgendes Layout entwerfen:

 

 

Oben soll ein sogenanntes Label "Layout Test" anzeigen
3 Buttons sollen am linken Rand positioniert sein
Und daneben soll stehen, welcher Button gerade geklickt wurde

Was brauchen wir? 

3 Buttons
2 Labels (zeigen Text an)
1 Panels für Button, die anderen Objekte legen wir direkt aufs Frame (würde auch mit 2 weiteren Panels gehen)

Code:

import javax.swing.*;
import java.awt.*;
//Event brauchen wir für das Ereigniss, wenn ein Button geklickt wird
import java.awt.event.*;

public class FirstGUI extends JFrame
{
    private JButton button1;
    private JButton button2;
    private JButton button3;
    private JPanel panelButton;
    private JLabel oben;
    private JLabel anzeige;

    public FirstGUI()
    {
        super("Fenster");
        setLocation(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout(5,5));

        //Buttons erzeugen
        button1 = new JButton("Button 1");
        button2 = new JButton("Button 2");
        button3 = new JButton("Button 3");

        //Panels erzeugen
        panelButton = new JPanel(new GridLayout(3,1));

        //Auf Panel Buttons packen
        panelButton.add(button1);
        panelButton.add(button2);
        panelButton.add(button3);

        //Listener für Buttons
        addButtonListener(button1);
        addButtonListener(button2);
        addButtonListener(button3);

        //Labels erzeugen
        oben = new JLabel("Layout Test");
        //Label zentrieren
        oben.setHorizontalAlignment(JLabel.CENTER); 
        anzeige = new JLabel("Button klicken");

        //Labels auf Frame packen
        getContentPane().add(BorderLayout.NORTH, oben);
        getContentPane().add(anzeige);

        //Panels auf Frame packen 
        getContentPane().add(BorderLayout.WEST, panelButton);

        pack();
        setVisible(true);

    }

    public static void main(String[] args)
    {
        FirstGUI g = new FirstGUI();
    }

    private void addButtonListener(JButton b)
    {
        b.addActionListener(new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            { 
                eingabe(ae.getActionCommand());
            }
        });
    }

    private void eingabe(String a)
    {
        anzeige.setText(a);
    }    
}


Abgesehen vom ButtonListener sollte das ganze verständlich sein. Man kann für mehrere Buttons natürlich die JButtons als Array definieren. Den ButtonListener will ich jetzt hier nicht erklären, erstens weil ich das evtl. nicht so genau könnte. Aber im Prinzip legt man für jeden Button eine Methode an. Beim Klick wird diese aufgerufen und von dort auf die Methode eingabe weitergeleitet, mitgeliefert wird der Text am Button. Mittels setText(a) wird der Labeltext geändert.

Also an und für sich wars das schon. Nur eins vielleicht noch. Man denkt sich vielleicht jetzt "So viel Code für so ein bischen GUI... dann lieber GUI nicht händisch programmieren sondern zusammenklicken". Nur bleibt das Verständniss auf der Strecke!!!!!
Und wenn mal man weiss um was und wie das geht, dann kommts es einem nicht mehr sooo viel vor!

Also dann viel Glück! Für Anregungen oder Beschwerden: mfe[at]chello.at

Link zu guter Swing-Seite Swing-Wiki