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

Container

Top-Level-Container

Jede Komponente einer grafischen Oberfläche ist Teil einer GUI-Hierarchie. An oberster Stelle dieser Hierarchie stehen die Top-Level-Container.

Jeder Top-Level-Container stellt einen Anzeigebereich für Komponenten (content pane) und optional einen Menübereich zur Verfügung.

Dieser Screenshot zeigt ein JFrame. Der Anzeigebereich für Komponenten (content pane) ist gelb, der Menübereich cyan.

Es gibt folgende Top-Level-Container:

  • JFrame - Fenster mit Rahmen
  • JWindow - Fenster ohne Rahmen
  • JDialog - Dialogfenster
  • JApplet - Ein Applet, das im einem Browser ausgeführt wird

Jede Swing-basierte Applikation nutzt ein Objekt der Klasse JFrame bzw. JWindow als Top-Level-Container und hat evtl. zusätzlich noch einige Dialogfenster (also weitere Top-Level-Container) mit eigener Anzeigehierarchie. Jedes Applet nutzt ein Objekt der Klasse JApplet als Top-Level-Container.

Komponenten einem Top-Level-Container hinzufügen

Wie oben bereits angesprochen, kennt jeder Top-Level-Container die Methode getContentPane(), die ein Objekt der Klasse Container zurückliefert. Über dieses Container-Objekt lassen sich dem Top-Level-Container mit Hilfe der add Methode Komponenten hinzufügen. Ein kleiner Schönheitsfehler besteht nun darin, dass die Klasse Container selbst keine Swing-Klasse ist und somit nicht die Funktionalität der anderen "Nicht-Top-Level" Swing-Komponenten - die allesamt von JComponent abstammen - aufweist.

Um dieses kleine Manko zu beseitigen, lässt sich in einem alternativen Ansatz eine Swing-Komponente zur content pane machen. Am besten geeigent erscheint hier ein Objekt der Klasse JPanel, das selbst wieder Komponenten aufnehmen kann. Der voreingestellte Layout-Manager für ein JPanel ist das FlowLayout. Unser FrameMitText-Beispiel sieht dann folgendermaßen aus:

import javax.swing.*;

public class FrameMitText extends JFrame {

JPanel contentPane; // Container dieses Frames
JLabel beschriftung; // Label, das im Frame erscheinen soll

// Konstruktor für unseren Frame
public FrameMitText() {
// Erzeuge ein JPanel-Objekt
contentPane = new JPanel();
// Setze das JPanel-Objekt als content pane
setContentPane(contentPane);
// Erzeuge das LabelObjekt mit Übergabe des Labeltextes
beschriftung = new JLabel("Label-Text im Frame");
// Füge das Label dem content pane hinzu
contentPane.add(beschriftung);
}

public static void main(String[] args) {
FrameMitText fenster = new FrameMitText();
fenster.setTitle("Frame mit Text im Label");
fenster.setSize(300,150);
fenster.setVisible(true);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

Menü hinzufügen

Jedem Top-Level-Container lässt sich mit Hilfe der Methode setMenuBar ein Menü (ein Objekt der Klasse JMenuBar) hinzufügen. Dem JMenuBar-Objekt fügt man verschiedene JMenu-Objekte hinzu. So entstehen die Menüs auf der obersten Ebene. In die JMenu-Objekte lassen sich nun JMenuItems, also einfache Menüeinträge, oder wieder JMenu-Objekte (Untermenüs) packen, usw. Im Quelltext sieht das dann folgendermaßen aus:

import javax.swing.*;

public class Bilderrahmen extends JFrame {

JPanel c;
JMenuBar menuBar;
JMenu menu;

JMenuItem menuItem1, menuItem2, menuItem3;

public Bilderrahmen(){

// JPanel erzeugen
JPanel c = new JPanel();
// und als content pane setzen
setContentPane(c);
// Erzeuge die Menüleiste
menuBar = new JMenuBar();
// Erzeuge ein Menü
menu = new JMenu("Bilder");
// Erzeuge die Menüeinträge und füge sie dem Menü hinzu

menuItem1 = new JMenuItem("Music");
menu.add(menuItem1);
menuItem2 = new JMenuItem("Like a Virgin");
menu.add(menuItem2);
menuItem3 = new JMenuItem("True Blue");
menu.add(menuItem3);

// Füge das Menü der Menüleiste hinzu
menuBar.add(menu);
// Füge die Menüleiste dem Frame hinzu
setJMenuBar(menuBar);

}

public static void main(String[] args){

Bilderrahmen fenster = new Bilderrahmen();
fenster.setTitle("Bilderrahmen");
fenster.setSize(200,160);
fenster.setVisible(true);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

Demo 2: JMenuBar / JMenu / JMenuItem / JToolBar

menubar1.png
menubar2.png

Demonstriert wird der Einsatz der Container-Komponenten JMenuBar, JMenu und JToolBar sowie der Grundkomponente JMenuItem.

Ein JMenuBar (Menüleiste) enthält Objekte vom Typ JMenu (Menüs). Ein JMenu enthält ein Liste von JMenuItem's (Menüeinträge) bzw. JMenu's (Untermenüs). Die hierarchische Menüstruktur wird nach dem Composite-Pattern aufgebaut. Die Methode setMenuBar sorgt schließlich dafür, dass eine Menüleiste einem JFrame hinzugefügt wird.

Die JToolBar (Werkzeugleiste) enthält einfache Button-Objekte.

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

public class MenuBarDemo extends JFrame{

// DATENFELDER
Container c;
JMenuBar menuBar;
JMenu menu, subMenu;
JMenuItem menuItem;
JToolBar toolBar;
JButton button;
JLabel textLabel;
JPanel p1;

// KONSTRUKTOR
public MenuBarDemo() {

c = getContentPane();

// MENÜLEISTE

// neue Menüleiste erzeugen
menuBar = new JMenuBar();

// Menu erzeugen
menu = new JMenu("Hauptmenü");
menu.setMnemonic(KeyEvent.VK_H);
menuBar.add(menu);

// Hauptmenüeinträge erzeugen
for(int i=0; i<3; i++) {
menuItem = new JMenuItem("Menüpunkt " + (i+1));
menu.add(menuItem);
}

// Tastenkürzel für den Letzten Menüpunkt setzen (exemplarisch)
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, KeyEvent.CTRL_MASK));

// ein weiteres Menu erzeugen
menu = new JMenu("Nebenmenü");
menu.setMnemonic(KeyEvent.VK_N);
menuBar.add(menu);

// Nebenmenueinträge erzeugen
for(int i=0; i<3; i++) {
menuItem = new JMenuItem("Nebenmenüpunkt " + (i+1));
menu.add(menuItem);
}

// Trennlinie setzen
menu.addSeparator();

// Untermenü im 'Nebenmenü'
subMenu = new JMenu("Untermenü");
subMenu.setMnemonic(KeyEvent.VK_U);
menu.add(subMenu);

// Untermenüeinträge erzeugen
for(int i=0; i<3; i++) {
menuItem = new JMenuItem("Untermenüpunkt " + (i+1));
subMenu.add(menuItem);
}

// Menüleiste hinzufügen
setJMenuBar(menuBar);

// TOOLBAR

// Toolbar erzeugen
toolBar = new JToolBar("Eine Werkzeugleiste", JToolBar.HORIZONTAL);
toolBar.setFloatable(false);

// Buttons für die Toolbar erzeugen
for(int i=0; i<4; i++) {
button = new JButton("Werkzeug " + (i+1));
button.setToolTipText("Knopf " + (i+1));
toolBar.add(button);
}

// Beschriftung erzeugen
textLabel = new JLabel("Ein tolles Fenster mit Menüleiste und Werkzeugleiste");

p1 = new JPanel();
p1.add(textLabel);

// Objekte hinzufügen
c.add(toolBar, BorderLayout.NORTH);
c.add(p1, BorderLayout.CENTER);

}

// HAUPTPROGRAMM
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);

MenuBarDemo fenster = new MenuBarDemo();
fenster.setTitle("Frame mit Menüleiste und Toolbar");
fenster.setSize(400,250);
fenster.setVisible(true);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

 

» drucken: pdf | html

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