Java GUI

Java enthält zwei Pakete zur Programmierung grafischer Benutzeroberflächen (GUI, Graphical User Interface).

java.awt: Abstract Window Toolkit
AWT ist das ältere, weniger komfortable Paket.

javax.swing:
Swing ist das neuere, komfortablere Paket. Swing baut auf AWT auf.

JavaFX

javafx; sollte eigentlich Swing ablösen, hat sich aber nicht durchgesetzt, seit Java 11 nicht mehr Bestandteil des Standard-JDK

Was ist der Unterschied zwischen Swing und SWT für die Entwicklung von Desktop-Anwendungen?
Swing ist ein leichtgewichtiges GUI-Toolkit, das auf verschiedenen Plattformen ein einheitliches Erscheinungsbild bietet und nicht auf native Betriebssystemkomponenten angewiesen ist. Es ist Teil der Java-Standardbibliothek und bietet umfangreiche Anpassungsmöglichkeiten. SWT (Standard Widget Toolkit) hingegen verwendet systemeigene Komponenten und bietet ein natürlicheres Erscheinungsbild und eine bessere Leistung auf bestimmten Plattformen. Allerdings kann SWT im Vergleich zu Swing mehr plattformspezifische Anpassungen erfordern. Die Wahl zwischen den beiden hängt davon ab, ob eine native Leistung und ein natives Aussehen (SWT) oder eine konsistente, plattformübergreifende Benutzeroberfläche (Swing) benötigt wird.

Frames

frame.setSize(300, 200):

  • Diese Zeile setzt die Größe des Fensters auf 300 Pixel Breite und 200 Pixel Höhe.

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE):

  • Dies stellt sicher, dass das Programm beendet wird, wenn das Fenster geschlossen wird.

frame.setVisible(true):

  • Diese Zeile macht das Fenster sichtbar. Ohne sie würde das Fenster erstellt, aber nicht angezeigt werden.

Kurzer Überblick JFrame

Ein JFrame ist der äußere Rahmen einer Swing-Anwendung. Die Klasse befindet sich im Paket javax.swing. Ein Fenster (JFrame) hat

  • eine Titelleiste mit den drei bekannten Schaltflächen (decorated); setUndecorated(boolean v)
  • einen Rahmen (javax.swing.Border)
  • Sichtbarkeit; setVisible(boolean v)
  • Transparenz; setOpacity(float f) (0 durchsichtig; 1.0 undurchsichtig)
  • eine Größe; setSize(int b, int h)
  • eine Position; setLocation(int x, int y)
  • eine Form; setShape(Shape s)

und kann

  • im Vordergrund sein; toFront()
  • im Hintergrund sein; toBack()

Es können alle Klassen des java.awt und des javax.swing Pakets importiert werden

package gui;
import java.awt.* ;//importiere das Application Window Tool
import javax.swing.* ; //importiere die Swingklassen.



// Basis Klasse
public class Zeiterfassung {
public static void main(String[] args) {
JFrame frame = new JFrame("Einfaches Fenster");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

Ein Button hinzufügen:
Beispiel mit einem FlowLayout:

frame.setLayout(new FlowLayout());
frame.add(jbutton);

In diesem Fall würde der Button seine bevorzugte Größe basierend auf seinem Text annehmen.


Die EventListener-Schnittstelle ist die primäre Methode zur Verarbeitung von Ereignissen. Benutzer implementieren die EventListener-Schnittstelle und registrieren ihren Listener mithilfe der AddEventListener-Methode auf einem EventTarget. Die Benutzer sollten ihren EventListener auch von seinem EventTarget entfernen, nachdem sie den Listener nicht mehr verwenden.

Ein Button-Listener muss die Schnittstelle ActionListener implementieren. Ein ActionListener ist eine Schnittstelle (keine Klasse), die eine einzige Methode enthält:

public void actionPerformed( ActionEvent evt) ;

Eine Klasse, die diese Schnittstelle implementiert muss eine actionPerformed() Methode enthalten. Der ActionEvent-Parameter ist ein Event-Objekt, das ein Ereignis (einen Buttonklick) repräsentiert. Es enthält Informationen, die verwendet werden können, um auf das Ereignis zu reagieren.

Wir importieren das Paket java.awt.event.*, wenn wir Ereignisse behandeln möchten.

Um eine Aktion mit dem Button in Ihrem Java Swing-Programm zu verbinden, können Sie einen ActionListener verwenden. Hier ist eine Schritt-für-Schritt-Anleitung, wie Sie das umsetzen können:

  1. Importieren Sie das ActionListener-Interface und das ActionEvent:
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
  1. Implementieren Sie den ActionListener für Ihren Button. Dies können Sie auf verschiedene Arten tun:

Methode 1: Anonyme innere Klasse

Sie können eine anonyme innere Klasse direkt bei der Button-Erstellung verwenden:

JButton jbutton = new JButton("einfacher Button");
jbutton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button wurde geklickt!");
        // Hier können Sie die gewünschte Aktion einfügen
    }
});

Methode 2: Lambda-Ausdruck (Java 8+)

Wenn Sie Java 8 oder höher verwenden, können Sie einen Lambda-Ausdruck nutzen:

JButton jbutton = new JButton("einfacher Button");
jbutton.addActionListener(e -> {
    System.out.println("Button wurde geklickt!");
    // Hier können Sie die gewünschte Aktion einfügen
});

Methode 3: Separate Klasse

Sie können auch eine separate Klasse erstellen, die ActionListener implementiert:

class ButtonClickListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button wurde geklickt!");
        // Hier können Sie die gewünschte Aktion einfügen
    }
}

// In Ihrer main-Methode:
JButton jbutton = new JButton("einfacher Button");
jbutton.addActionListener(new ButtonClickListener());

Vollständiges Beispiel

Hier ist ein vollständiger Code mit der implementierten Aktion (unter Verwendung der anonymen inneren Klasse):

package gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Zeiterfassung {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Einfaches Fenster");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton jbutton = new JButton("einfacher Button");
        jbutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button wurde geklickt!");
                // Hier können Sie die gewünschte Aktion einfügen
            }
        });

        frame.add(jbutton);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

Mit diesen Änderungen wird jedes Mal, wenn der Button geklickt wird, die Nachricht „Button wurde geklickt!“ in der Konsole ausgegeben. Sie können die Aktion in der actionPerformed-Methode nach Ihren Bedürfnissen anpassen.

Um einen Absatz zwischen dem Button und der Anzeige des Zählerstandes einzufügen, können Sie in Swing einen vertikalen Abstand mit Hilfe eines leeren JPanel oder eines vertikalen Spacers hinzufügen. Hier sind zwei Möglichkeiten, dies zu erreichen:

  1. Verwendung eines leeren JPanel mit vertikalem Abstand:
// Fügen Sie nach dem Button ein leeres JPanel mit vertikalem Abstand hinzu
JPanel spacer = new JPanel();
spacer.setPreferredSize(new Dimension(1, 10)); // 1 Pixel breit, 10 Pixel hoch
frame.add(spacer);
  1. Verwendung eines vertikalen Spacers aus Box:
// Importieren Sie die Box-Klasse
import javax.swing.Box;

// Fügen Sie nach dem Button einen vertikalen Spacer hinzu
frame.add(Box.createVerticalStrut(10)); // 10 Pixel hoher Abstand

Hier ist der aktualisierte Code mit der ersten Methode:

package gui;

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Zeiterfassung {
    private static int zaehler = 0;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Einfaches Fenster");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton jbutton = new JButton("+1 Reihe / Runde");
        jbutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button wurde geklickt!");
                zaehler++;
                System.out.println("Zählerstand: " + zaehler + "\n");
                label.setText("Zählerstand: " + zaehler);
            }
        });

        frame.add(jbutton);

        // Fügen Sie hier den Abstand ein
        JPanel spacer = new JPanel();
        spacer.setPreferredSize(new Dimension(1, 10)); // 1 Pixel breit, 10 Pixel hoch
        frame.add(spacer);

        JLabel label = new JLabel("Zählerstand: 0");
        frame.add(label);

        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}

Diese Änderungen fügen einen vertikalen Abstand zwischen dem Button und dem Label ein, was zu einem besseren visuellen Layout führt.

Sie können einen Zeilenumbruch in der Konsolenausgabe mit "\n" hinzufügen, aber dies hat keinen Einfluss auf das GUI-Layout. Der System.out.println() Befehl gibt nur Text in der Konsole aus, nicht im Swing-Fenster.

  1. Benutzen Sie separate Panels für Button und Label:
JPanel buttonPanel = new JPanel();
JPanel labelPanel = new JPanel();
buttonPanel.add(jbutton);
labelPanel.add(label);
frame.add(buttonPanel);
frame.add(labelPanel);
  1. Verwenden Sie HTML im JLabel für einen Zeilenumbruch:
label.setText("<html>Zählerstand: " + zaehler + "<br><br></html>");

Diese Methoden erzeugen einen sichtbaren Abstand im GUI, während "\n" in System.out.println() nur die Konsolenausgabe beeinflusst.

Radio Button