Logo Logo
InfoHome Themen Projekte Links Software
Themen
JavaHamster
BlueJ
Java
Sprachelemente
Abstrakte Datentypen
Swing
Composite Pattern
AWT > Swing
GUI-Grundstruktur
Farben und Fonts
Layout-Manager
Komponenten 1
Komponenten 2
Komponenten 3
Container
Observer Pattern
Ereignisverarbeitung
MVC-Pattern
Game Of Life
Threads
Aufgaben
Sortieren
HTML
XHTML
CSS
XML
Datenbanken
MySQL
Theoretische Informatik
PHP
Kara
Lego-Roboter
Algorithmen

Layout-Manager

Layout-Manager sind Objekte, die für die Anordnung von Komponenten innerhalb von Container-Objekten zuständig sind.

Die drei am häufigsten verwendeten Layout-Manager sind:

  • BorderLayout
  • FlowLayout
  • GridLayout
  • BoxLayout

Komplexere Anordnungen lassen sich zum Beispiel mit Hilfe des

  • GridBagLayout

realisieren.

FlowLayout

flowlayout.png

Im FlowLayout werden alle Inhaltskomponenten so angezeigt, wie es der "Dokumentfluss" vorgibt. Das bedeutet, dass, von oben links angefangen, zeilenweise angeordnet wird. Passt eine Komponente nicht mehr in die aktuelle Zeile erfolgt ein Zeilenumbruch. Die Inhaltskomponenten verhalten sich ungefähr so wie per CSS-gefloatete Elemente auf einer Webseite. Standardmäßig werden alle Zeilen zentriert ausgerichtet, außerdem findet sich horizontal und vertikal jeweils ein Abstand von 5 Pixeln.

Konstruktoren:

  • public FlowLayout()
    Standardkonstruktor, default-Werte wie oben beschrieben.
  • public FlowLayout(int align)
    Standardeinstellung für Abstände, Ausrichtung kann mit Hilfe vordefnierter Konstanten LEFT, RIGHT, CENTER der Klasse FlowLayout() festgelegt werden.
  • public FlowLayout(int align, int h, int v)
    Zusätzlich können horizontale (h) und vertikale (v) Abstände festgelegt werden.

BorderLayout

borderlayout2.png

Ein Border-Layout teilt den Anzeigebereich in 5 Teilbereiche ein, die mit NORTH, WEST, CENTER, EAST und SOUTH bezeichnet werden und jeweils eine Komponente aufnehmen können. Im standardmäßigem Border-Layout angeordnete Komponenten füllen ihren Container stets vollständig aus. Die Zuordnung einer Komponente in einen bestimmten Bereich erfolgt bei Aufruf der add-Methode durch Angabe eines zusätzlichen Parameters in Form einer vordefinierten Klassenkonstante.

	...
c.add(buttons[0], BorderLayout.NORTH);
c.add(buttons[1], BorderLayout.WEST);
c.add(buttons[2], BorderLayout.CENTER);
c.add(buttons[3], BorderLayout.EAST);
c.add(buttons[4], BorderLayout.SOUTH);
...

Die Größe der Komponenten im Norden bzw. Süden wird durch ihre übliche Höhe bestimmt, die Größe der Komponenten im Westen bzw. Osten durch ihre übliche Breite. Die Größe des zentralen Gebiets kann je nach Größe des Containers variieren.

Konstruktoren:

  • public BorderLayout()
    Standardkonstruktor: keine Abstände zwischen den Gebieten.
  • public BorderLayout(int h, int v)
    Zusätzlich können horizontale (h) und vertikale (v) Abstände festgelegt werden..

GridLayout

gridlayout2.png

Das GridLayout sorgt für eine Anordnung der Komponenten innerhalb eines Gitterrasters. Bei Erzeugung eines GridLayout-Objekts werden die Dimensionen des Rasters festgelegt.

	...
c.setLayout(new GridLayout(2,3));
...

Alle Rasterelemente werden gleich gross angezeigt, so dass der Anzeigebereich voll ausgeschöpft ist. Per default ist zwischen den Komponenten kein Abstand.

Das Raster wird dann in der linken oberen Ecke angefangend zeilenweise gefüllt. Die Position der Elemente im Raster wird also ausschließlich durch die Reihenfolge der add-Aufrufe festgelegt. Es ist nicht möglich ein Element direkt an eine bestimmte Position im Raster einzufügen.

Konstruktoren:

  • public GridLayout(int z, int s)
    Erzeugt ein GridLayout mit z Zeilen und s Spalten. z oder s kann dabei auch den Wert 0 haben, was für "beliebig viele" steht.
  • public GridLayout(int z, int s, int h, int v)
    Zusätzlich können horizontale (h) und vertikale (v) Abstände festgelegt werden.

BoxLayout

boxlayout.png

Mit Hilfe des BoxLayout lassen sich Komponenten in einer Reihe übereinander (vertikal) oder nebeneinander (horizontal) darstellen, ohne das Zeilenumbrüche entstehen. Verschachtelt man mehrere Container mit vertikalem bzw. horizontalem BoxLayout lassen sich relativ einfach Gitterstrukturen aufbauen, die sehr viel flexibler sind, als die Gitter aus dem GridLayout:

BoxLayout_1.gif

  • public BoxLayout(Container target, int axis)
    target ist das Container-Objekt, dem ein Box-Layout zuweisen möchte. Der zweite Parameter legt die Ausrichtung fest: Die Konstante X_AXIS steht für horizontale Ausrichtung, die Konstante Y_AXIS für vertikale Ausrichtung.

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

public class BoxLayoutDemo extends JFrame {

Container c; // Container dieses Frames
JButton[] buttons = new JButton[5];
JPanel box;;

// Konstruktor für unseren Frame
public BoxLayoutDemo() {

// Bestimme die Referenz auf den eigenen Container
c = getContentPane();

box = new JPanel();
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));

// Erzeuge die Buttons
buttons[0] = new JButton("Button1");
buttons[0].setAlignmentX(Component.CENTER_ALIGNMENT);
buttons[1] = new JButton("Button2");
buttons[1].setAlignmentX(Component.CENTER_ALIGNMENT);
buttons[2] = new JButton("Button3");
buttons[2].setAlignmentX(Component.CENTER_ALIGNMENT);
buttons[3] = new JButton("Long-Named Button");
buttons[3].setAlignmentX(Component.CENTER_ALIGNMENT);
buttons[4] = new JButton("5");
buttons[4].setAlignmentX(Component.CENTER_ALIGNMENT);

// Füge die Buttons der Box hinzu
box.add(buttons[0]);
box.add(buttons[1]);
box.add(buttons[2]);
box.add(buttons[3]);
box.add(buttons[4]);

// Füge die Box dem JFrame hinzu
c.add(box);
}

public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
BoxLayoutDemo fenster = new BoxLayoutDemo();
fenster.setTitle("BoxLayoutDemo");
fenster.pack();
fenster.setVisible(true);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

GridBagLayout

Die Musterlösung der Klausuraufgabe zum Body-Mass-Index demonstriert den Einsatz des GridBagLayouts.

bmi.png 

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;

public class BMI extends JPanel{
JPanel slider = new JPanel();
JSlider alter = new JSlider(18,100,25);
JSlider gewicht = new JSlider(40,200,75);
JSlider groesse = new JSlider(120,210,175);
JLabel label1 = new JLabel("Alter (in Jahren): ");
JLabel label2 = new JLabel("Gewicht (in kg): ");
JLabel label3 = new JLabel("Groesse (in cm): ");
JLabel alterAktuell = new JLabel("");
JLabel gewichtAktuell = new JLabel("");
JLabel groesseAktuell = new JLabel("");
JLabel bmi = new JLabel(" ");
JLabel warnung = new JLabel(" ");

public BMI (){
SliderListener listener = new SliderListener();

alter.addChangeListener(listener);
gewicht.addChangeListener(listener);
groesse.addChangeListener(listener);

// GridBagLayout - "Flexibles" Tabellenlayout
GridBagLayout gridbag = new GridBagLayout();
// als Layout für das Custom-Panel setzen
setLayout(gridbag);

// Zellen lassen sich mit Hilfe von Objekten
// der Klasse GridBagConstraints formatieren
GridBagConstraints constraints = new GridBagConstraints();
// Zellen sollen bei Überlauf in der Breite vergrößert werden
// nicht in der Höhe
constraints.fill = GridBagConstraints.HORIZONTAL;

// Gleiche Komponenten werden in Arrays zusammengefasst
JSlider[] sliders = {alter, gewicht, groesse};
JLabel[] labels = {label1, label2, label3};
JLabel[] aktuell = {alterAktuell, gewichtAktuell, groesseAktuell};

// for-Schleife zum hinzufügen der einzelnen Komponenten
// in das Tabellenraster
for(int i=0; i<3; i++){
// gridy gibt Zeile an, es wird zunächst die erste Zeile gefüllt
// in weiteren Schleifendurchläufen folgen die Zeilen zwei und drei
constraints.gridy = i;
// gridx gibt Spalte an
constraints.gridx = 0;
// Formatierungsobjekt wird dem Label zugewiesen
gridbag.setConstraints(labels[i],constraints);
// Label einfügen
add(labels[i]);
// Jetzt dasselbe mit der zweiten Spalte...
constraints.gridx = 1;
gridbag.setConstraints(sliders[i],constraints);
add(sliders[i]);
// und auch mit der dritten.
constraints.gridx = 2;
gridbag.setConstraints(aktuell[i],constraints);
add(aktuell[i]);
}

constraints.gridx = 0;
// jetzt kommt die dritte Zeile
constraints.gridy = 3;
// im Sinne von colspan werden in Zeile drei Zellen horizontal verbunden
constraints.gridwidth = 3;
gridbag.setConstraints(bmi,constraints);
add(bmi);
// und schließlich die vierte Zeile, gridwidth hat unverändert den Wert 3
constraints.gridy = 4;
gridbag.setConstraints(warnung,constraints);
add(warnung);

alterAktuell.setText(String.valueOf(alter.getValue()));
gewichtAktuell.setText(String.valueOf(gewicht.getValue()));
groesseAktuell.setText(String.valueOf(groesse.getValue()));
}

public class SliderListener implements ChangeListener {
public void stateChanged(ChangeEvent e) {
alterAktuell.setText(String.valueOf(alter.getValue()));
gewichtAktuell.setText(String.valueOf(gewicht.getValue()));
groesseAktuell.setText(String.valueOf(groesse.getValue()));

int bmindex = (int) Math.round(gewicht.getValue() / Math.pow(groesse.getValue() / 100.0, 2));
bmi.setText("Laut diesen Angaben haben Sie einen BMI von " + bmindex + ".");

if(alter.getValue()<35){
if(bmindex<19) warnung.setText("Laut BMI sind Sie untergewichtig. Bitte essen Sie mehr!");
else if(bmindex<25) warnung.setText("Herzlichen Glückwunsch! Bei Ihnen ist alles im Lot!");
else if(bmindex<31) warnung.setText("Laut BMI sind Sie übergewichtig. Bitte tun Sie etwas!");
else warnung.setText("Suchen Sie bitte einen Arzt auf!!!");
}
else{
if(bmindex<19) warnung.setText("Laut BMI sind Sie untergewichtig. Bitte essen Sie mehr!");
else if(bmindex<27) warnung.setText("Herzlichen Glückwunsch! Bei Ihnen ist alles im Lot!");
else if(bmindex<31) warnung.setText("Laut BMI sind Sie übergewichtig. Bitte tun Sie etwas!");
else warnung.setText("Suchen Sie bitte einen Arzt auf!!!");
}
}
}

public static void main(String[] args){
JFrame fenster = new JFrame();
fenster.setTitle("Body-Mass-Index");
fenster.setSize(300,250);
fenster.setContentPane(new BMI());
fenster.pack();
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setVisible(true);
}

}

» drucken: pdf | html

© 2004-2024 M. Blanke · Ursulaschule · Kleine Domsfreiheit 11-18 · 49074 Osnabrück