Die Hauptelemente des Swing Framework
Java Swing verwendet zum Aufbau von Benutzeroberfläche zwei Hauptelemente: Container und Component. In Java ist ein Frame ein Fenster mit hübschen Rahmen, mit verschiedenen Buttons unterhalb des oberen Rahmens und mit anderen Merkmalen. Was wir üblicherweise ein „Fenster“ nennen, heißt in Java „Frame„. Ein Frame ist ein Containerobjekt, also können GUI-Komponenten darin platziert werden.
1. Container
Ein Container ist in Swing ein Fenster der obersten Ebene. Die vier zur Verfügung stehenden Container der obersten Ebene sind JFrame, JWindow, JApplet und JDialog. Ein Swing-Container wird verwendet, um eine Reihe von Komponenten aufzunehmen, und sie als Teil einer window-basierten Anwendung anzuzeigen. Alle mit Swing erstellten Anwendungen verfügen über mindestens einen Container.
2. Component
Component wird verwendet, um mehrere andere Komponenten aufzunehmen. Alle Komponenten zusammen werden in einem Container auf oberster Ebene gehalten. Beispiele für Komponenten in Swing sind JPanel, JMenu, JTable, JLabel JButton, JcheckBox oder JscrollBar. Alle Swing-Komponenten erben die JComponent-Klasse.
Grafische Komponenten müssen innerhalb eines Containers platziert werden. Ein Container entspricht einer rechteckigen Fläche auf dem Bildschirm und die Komponenten, die er enthält, entsprechen kleineren Flächen in ihm.


Damit die Fensteranordnung gut funktioniert, können Fenstermanager verwendet werden
Layoutmanager bezeichnet in der Programmierung eine Softwarekomponente, die sich um die Anordnung von Steuerelementen in einem übergeordneten Container (z. B. einem Fenster) kümmert.
Beispiele:
BorderLayout
BoxLayout
CardLayout
FlowLayout (Standardmäßig aktiviert)
GridBagLayout
GridLayout
OverlayLayout
SpringLayout
Um einen Layoutmanager zu Ihrem Swing-Programm hinzuzufügen, können Sie die setLayout()
-Methode verwenden. Hier ist eine Version mit einem GridBagLayout
, das mehr Flexibilität bei der Anordnung der Komponenten bietet:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonTextExample extends JFrame {
private JTextField textField;
private JButton button;
public ButtonTextExample() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
textField = new JTextField();
textField.setPreferredSize(new Dimension(400, 400));
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.insets = new Insets(10, 10, 10, 10);
add(textField, gbc);
button = new JButton("6 fM in MR");
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
add(button, gbc);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText("6 fM in den Maschenring");
}
});
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ButtonTextExample());
}
}
Hier sind die wichtigsten Punkte:
setLayout(new GridBagLayout())
setzt den Layoutmanager auf GridBagLayout.GridBagConstraints
wird verwendet, um die Position und das Verhalten der Komponenten zu steuern.textField.setPreferredSize(new Dimension(400, 400))
setzt die bevorzugte Größe des Textfelds.- Die
add()
-Methode wird mit den GridBagConstraints aufgerufen, um die Komponenten hinzuzufügen.
Diese Änderungen machen das Layout flexibler und besser anpassbar an verschiedene Fenstergrößen.

Wenn Sie eine strukturiertere Anordnung benötigen, können Sie auch andere einfache Layoutmanager wie das BorderLayout oder GridLayout in Betracht ziehen Hier ist ein Beispiel, wie Sie das Programm mit dem BorderLayout umgestalten können:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonTextExample extends JFrame {
private JTextField textField;
private JButton button;
public ButtonTextExample() {
setLayout(new BorderLayout());
textField = new JTextField();
textField.setPreferredSize(new Dimension(400, 400));
add(textField, BorderLayout.CENTER);
button = new JButton("6 fM in MR");
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
buttonPanel.add(button);
add(buttonPanel, BorderLayout.SOUTH);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText("6 fM in den Maschenring");
}
});
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ButtonTextExample());
}
}
Diese Version verwendet das BorderLayout, das einfacher zu verstehen und zu verwalten ist als das GridBagLayout. Hier sind die Hauptänderungen:
- Das Hauptlayout wurde auf BorderLayout geändert:
setLayout(new BorderLayout());
- Das Textfeld wurde in die Mitte (CENTER) des BorderLayouts platziert:
add(textField, BorderLayout.CENTER);
- Für den Button wurde ein separates JPanel mit FlowLayout erstellt, um ihn links auszurichten: java
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); buttonPanel.add(button); add(buttonPanel, BorderLayout.SOUTH);
- Die komplexen GridBagConstraints wurden entfernt, da sie nicht mehr benötigt werden.
Diese Änderungen machen den Code einfacher und übersichtlicher, während die Funktionalität des Programms erhalten bleibt. Das BorderLayout sorgt automatisch dafür, dass das Textfeld den verfügbaren Platz ausfüllt, und der Button wird am unteren Rand des Fensters platziert.
Um einen einfachen Layoutmanager hinzuzufügen, können Sie die Methode setLayout()
verwenden. Der einfachste Layoutmanager ist das FlowLayout. Hier ist ein Beispiel, wie Sie es implementieren können:
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class BeispielFrame extends JFrame {
public BeispielFrame() {
setLayout(new FlowLayout());
// Hier können Sie nun Komponenten hinzufügen
}
}
Alternativ können Sie auch einem JPanel einen Layoutmanager zuweisen:
import java.awt.FlowLayout;
import javax.swing.JPanel;
JPanel panel = new JPanel(new FlowLayout());
// Fügen Sie dem Panel Komponenten hinzu
Das FlowLayout ordnet die Komponenten von links nach rechts an und bricht in die nächste Zeile um, wenn der Platz nicht ausreicht. Es ist besonders gut geeignet für einfache Anordnungen von Buttons, Labels oder kurzen Textfeldern.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Anleitungen_schreiben implements ActionListener {
private JFrame frame;
private JButton button1;
private JButton button2;
private JLabel text;
private int numClicks = 0;
public Anleitungen_schreiben() {
frame = new JFrame("Anleitungen schreiben");
frame.setSize(300, 400);
button1 = new JButton("6 fM in Maschenring");
button2 = new JButton("fM, Zun) * 6");
text = new JLabel();
button1.addActionListener(this);
button2.addActionListener(this);
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
frame.add(button1);
frame.add(button2);
frame.add(text);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1) {
text.setText("6 fM in den Maschenring");
} else if (e.getSource() == button2) {
text.setText("(fM, Zun) * 6");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Anleitungen_schreiben();
}
});
}
}


Schaltflächen wie JButton
erzeugen bei Benutzung, wie viele andere Komponenten auch, sog. events (Ereignisse). Je nach Komponente werden unterschiedliche Ereignisse ausgesandt. Bei Schaltflächen ist dies ein ActionEvent
.

Ich habe die Darstellung von VSCode lieb gewonnen. Durch die Farbdarstellung wird es übersichtlicher. Allerdings wird ein Code mittlerweile zu lang für ein Fenster. Hier habe ich den VSCode aneinander gefügt …




import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
import java.awt.*;
import java.util.ArrayList;
public class ButtonEvents implements ActionListener {
private JButton start, stop;
private ArrayList<JCheckBox> boxes;
private ArrayList<JRadioButton> buttons;
public void createAndShowGUI(){
JFrame frame = new JFrame("Button Demo");
// Add a title in the Page Start section
JLabel title = new JLabel("Button Demo", SwingConstants.CENTER);
Font heading = new Font("Times Roman", Font.BOLD, 20);
title.setFont(heading);
title.setPreferredSize(new Dimension(300, 50));
title.setOpaque(true);
title.setBackground(Color.decode("#f0e9e9"));
frame.getContentPane().add(title, BorderLayout.PAGE_START);
// Add a flow pane in the main center section
JPanel pane = new JPanel(new FlowLayout());
pane.setPreferredSize(new Dimension(300, 400));
pane.setBackground(Color.PINK);
pane.setOpaque(true);
frame.getContentPane().add(pane, BorderLayout.CENTER);
// Add two buttons to our pane
start = new JButton("Start");
stop = new JButton("Stop");
// Adjust the size and color of the start button
start.setPreferredSize(new Dimension(100, 30));
start.setBackground(Color.green);
// Adjust the size and color of the stop button
stop.setPreferredSize(new Dimension(75, 25));
stop.setBackground(Color.red);
pane.add(start);
pane.add(stop);
start.addActionListener(this);
stop.addActionListener(this);
// // Create 3 check boxes
JCheckBox cb1 = new JCheckBox("Option 1");
JCheckBox cb2 = new JCheckBox("Option 2");
JCheckBox cb3 = new JCheckBox("Option 3");
cb1.setOpaque(false);
cb2.setOpaque(false);
cb3.setOpaque(false);
// Add check boxes to a seperate panel
JPanel checkBoxes = new JPanel();
checkBoxes.setOpaque(false);
checkBoxes.add(cb1);
checkBoxes.add(cb2);
checkBoxes.add(cb3);
boxes = new ArrayList<JCheckBox>();
boxes.add(cb1);
boxes.add(cb2);
boxes.add(cb3);
// Add the new panel into the flow pane
pane.add(checkBoxes);
// // Create 3 radio buttons
JRadioButton b1 = new JRadioButton("Option A");
JRadioButton b2 = new JRadioButton("Option B");
JRadioButton b3 = new JRadioButton("Option C");
b1.setOpaque(false);
b2.setOpaque(false);
b3.setOpaque(false);
// Create a button group to add buttons into
ButtonGroup group1 = new ButtonGroup();
group1.add(b1);
group1.add(b2);
group1.add(b3);
// Create a panel to add buttons into
JPanel radioButtons1 = new JPanel();
radioButtons1.setOpaque(false);
radioButtons1.add(b1);
radioButtons1.add(b2);
radioButtons1.add(b3);
buttons = new ArrayList<JRadioButton>();
buttons.add(b1);
buttons.add(b2);
buttons.add(b3);
// Add panel to flow pane
pane.add(radioButtons1);
// Create a second set of buttons
JRadioButton b4 = new JRadioButton("Option X");
JRadioButton b5 = new JRadioButton("Option Y");
JRadioButton b6 = new JRadioButton("Option Z");
b4.setOpaque(false);
b5.setOpaque(false);
b6.setOpaque(false);
/**
* Since these buttons go into a different group
* they are selected seperate of group 1
*/
ButtonGroup group2 = new ButtonGroup();
group2.add(b4);
group2.add(b5);
group2.add(b6);
JPanel radioButtons2 = new JPanel();
radioButtons2.setOpaque(false);
radioButtons2.add(b4);
radioButtons2.add(b5);
radioButtons2.add(b6);
buttons.add(b4);
buttons.add(b5);
buttons.add(b6);
pane.add(radioButtons2);
// Show the Frame
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == start) {
System.out.println("Start");
}
if (e.getSource() == stop) {
System.out.println("Stop");
}
for (int i = 0; i < boxes.size(); i ++) {
if (boxes.get(i).isSelected()) {
System.out.println(boxes.get(i).getText() + " is selected");
}
else {
System.out.println(boxes.get(i).getText() + " is NOT selected");
}
}
for (int i = 0; i < buttons.size(); i ++) {
if (buttons.get(i).isSelected()) {
System.out.println(buttons.get(i).getText() + " is selected");
}
else {
System.out.println(buttons.get(i).getText() + " is NOT selected");
}
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
ButtonEvents test = new ButtonEvents();
test.createAndShowGUI();
}
});
}
}
Einen Text festelegen, der in ein Feld eingefügt wird.
