public JCheckBoxMenuItem(String text)

Werbung
SWING
DVG2 - 09 - Swing
1
ColorChooser




Die Klasse JColorChooser bietet eine komfortable Möglichkeit,
Farben auszuwählen.
Konstruktor:
public JColorChooser()
public JColorChooser(Color initialColor)
Für Änderungen der ausgewählten Farbe ist der ChangeListener
zuständig.
Mit Hilfe der Methode
public static Color showDialog(
Component component, String title,
Color initialColor)
kann ein extra Fenster geöffnet werden das einen ColorChooser
enthält. Die gewählte Farbe wird als return-Wert zurückgegeben.
DVG2 - 09 - Swing
2
Beispiel 7
public B7()
{
Color bgc = JColorChooser.showDialog(this,
"Hintergrundfarbe festlegen", getBackground());
Color fgc = JColorChooser.showDialog(this,
"Vordergrundfarbe festlegen", getForeground());
JLabel l = new JLabel("Das sind die neuen Farben");
l.setFont(new Font("Arial", Font.BOLD, 40));
l.setForeground(fgc);
setBackground(bgc);
add(l);
}
DVG2 - 09 - Swing
3
FileChooser







Die Klasse FileChooser ermöglicht die Auswahl einer Datei aus dem
Filesystem.
Applets sind nicht befugt, auf Clientdaten zuzugreifen. Daher ist in
Applets die Verwendung von FileChoosern stark eingeschränkt.
Es können Filter verwendet werden, um nur bestimmte Dateitypen
anzeigen zu lassen.
Es kann die Darstellung eigener Icons für die Dateien veranlasst
werden.
Es kann eine Dateivorschau programmiert werden.
Die Darstellung kann durch eigene Erweiterungen verändert werden.
Konstuktor:
public JFileChooser()
public JFileChooser(String currentDirectoryPath)
public JFileChooser(File currentDirectory)
erstellt ein FileChooser-Objekt mit dem angegebenen
Anfangsverzeichnis bzw. dem Home-Verzeichnis des Nutzers.
DVG2 - 09 - Swing
4
Öffnen des JFileChooser-Dialogs



Der FileChooser-Dialog wird durch folgende Methoden geöffnet:
public int showDialog(Component parent,
String approveButtonText)
public int showOpenDialog(Component parent)
public int showSaveDialog(Component parent)
approveButtonText enthält dabei die Beschriftung des Buttons mit
dem die Auswahl bestätigt wird.
Component enthält die Swing-Komponente, in der das JFileChooserObjekt erzeugt worden ist.
Bei showOpenDialog bzw. showSaveDialog wird die
Beschriftung durch das L&F festgelegt.
Die Methoden geben einen Wert zurück, aus dem geschlossen
werden kann wie der Dialog beendet wurde:
JFileChooser.CANCEL_OPTION: Cancel-Button wurde betätigt
JFileChooser.APPROVE_OPTION: Auswahl wurde bestätigt
JFileCHooser.ERROR_OPTION: Es ist ein Fehler eingetreten
DVG2 - 09 - Swing
5
Abfragen der ausgewählten Dateien


Mit den Methoden
public File getSelectedFile()
public File getCurrentDirectory()
können ausgewählte Dateien und das letzte aktuelle Verzeichnis
abgefragt werden.
Es gibt entsprechende Methoden um ausgewählte Dateien oder
Verzeichnisse zu setzen:
public void setSelectedFile(File file)
public void setCurrentDirectory(File dir)
public void changeToParentDirectory()
public void rescanCurrentDirectory()
DVG2 - 09 - Swing
6
Beispiel 8
public class B8 extends JPanel implements ActionListener
{
...
JLabel la;
File startDir = null;
public B8_1()
{
setLayout(new FlowLayout());
JButton jb = new JButton("Open File");
jb.addActionListener(this);
add(jb);
la = new JLabel("Es ist kein File ausgewählt");
add(la);
}
DVG2 - 09 - Swing
7
public void actionPerformed(ActionEvent e){
Component comp = (Component)e.getSource();
while (! (comp instanceof JPanel) ) comp=comp.getParent();
JPanel pane = (JPanel)comp;
JFileChooser chooser = new JFileChooser(startDir);
try
{
int returnVal = chooser.showOpenDialog(pane);
if(returnVal == JFileChooser.APPROVE_OPTION)
{
startDir=chooser.getCurrentDirectory();
la.setText("Open "+
chooser.getSelectedFile().getCanonicalPath());
}
}
catch (IOException ioe)
{
la.setText("Fehler beim Bestimmen des FileNamens: "+
chooser.getSelectedFile().getName());
}}
DVG2 - 09 - Swing
8
Filtern der angezeigten Dateien



Oft ist es sinnvoll, nur bestimmte Dateien anzuzeigen, z.B. nur javaDateien oder Grafikfiles.
Die Auswahl der anzuzeigenden Dateien und Verzeichnisse kann
über ein oder mehrere FileFilter-Objekte gesteuert werden.
Als FileFilter können Objekte der Klasse
javax.swing.filechooser.FileFilter verwendet werden.

FileFilter werden mit den Methoden
public void setFileFilter(FileFilter filter)
public void
addChoosableFileFilter(FileFilter filter)
zum JFileChooser-Objekt hinzugefügt.

Mit der Methode
public void setAcceptAllFileFilterUsed(boolean b)
wird der AcceptAllFileFilter aktiviert (b==true) bzw. deaktiviert
(b==false).
DVG2 - 09 - Swing
9
Die abstrakte Klasse FileFilter

Die abstrakte Klasse FileFilter aus dem Package
javax.swing.filechooser definiert zwei Methoden:
public abstract boolean accept(File f)
public abstract String getDescription()

Die Methode accept entscheidet darüber ob eine Datei oder ein
Verzeichnis angezeigt wird (Wert==true) oder nicht (Wert==false).
Es ist meistens sinnvoll Verzeichnisse immer anzuzeigen, damit man
durch das Filesystem navigieren kann.
getDescription gibt eine kuze Beschreibung des Filters aus, z.B.
„Bilddateien (*.gif, *.jpg, *.tif)“


DVG2 - 09 - Swing
10
Beispiel
import javax.swing.filechooser.FileFilter;
import java.io.File;
public class ImageFileFilter extends FileFilter
{
public boolean accept(File f)
{
return f.isDirectory() ||
f.getName().toUpperCase().endsWith(".GIF") ||
f.getName().toUpperCase().endsWith(".JPG");
}
public String getDescription()
{
return "Bilder (*.gif, *.jpg)";
}
}
DVG2 - 09 - Swing
11
FileView




Um den Typ der Dateien anhand der Icons unterscheiden zu können,
kann ein Objekt der Klasse FileView zu dem JFileChooser-Objekt
hinzugefügt werden.
Ein FileView-Objekt wird mit der Methode
public void setFileView(FileView fileView)
zu dem JFileChooser-Objekt hinzugefügt werden.
Die abstrakte Klasse FileView definiert fünf Methoden:
 public String getName(File f)
 public String getDescription(File f)
 public String getTypeDescription(File f)
 public Icon getIcon(File f)
 public Boolean isTraversable(File f)
Liefert eine dieser Methoden den Wert null, wird die entsprechende
Eigenschaft aus dem L&F gewählt.
DVG2 - 09 - Swing
12
Beispiel
public class ImageFileView extends FileView {
ImageIcon jpgIcon = new ImageIcon("images/jpgIcon.gif");
ImageIcon gifIcon = new ImageIcon("images/gifIcon.gif");
public String getName(File f) { return null; }
public String getDescription(File f) { return null; }
public Boolean isTraversable(File f) { return null; }
public String getTypeDescription(File f)
{
String fnu = f.getName().toUpperCase();
if (fnu.endsWith(".JPG")) return "JPEG Image";
if (fnu.endsWith(".GIF")) return "GIF Image";
return null;
}
public Icon getIcon(File f)
{
String fnu = f.getName().toUpperCase();
if (fnu.endsWith(".JPG")) return jpgIcon;
if (fnu.endsWith(".GIF")) return gifIcon;
return null;
}
}
DVG2 - 09 - Swing
13
Dateivorschau





Besonders bei Bilddatei ist eine Vorausschau sinnvoll.
Diese kann neben anderen Erweiterungen vom Programmierer
eingebaut werden.
Möglich sind z.B. besondere Bedienelemente, die vom Dateityp
abhängen oder Elemente, die der Suche von Dateien oder deren
Bearbeitung dienen.
Mit Hilfe der Methode
public void setAccessory(JComponent newAccessory)
wird eine beliebige Swing-Componente hinzugefügt. Diese wird
innerhalb des FileChooser-Fensters angezeigt.
Über Listener kann diese Komponente auf Änderungen reagieren.
DVG2 - 09 - Swing
14
Beispiel
public class ImagePreview extends JComponent implements
PropertyChangeListener {
ImageIcon thumbnail = null;
File file = null;
public ImagePreview(JFileChooser fc) {
setPreferredSize(new Dimension(100, 50));
fc.addPropertyChangeListener(this);
}
public void loadImage() {
if (file == null) return;
ImageIcon tmpIcon = new ImageIcon(file.getPath());
if (tmpIcon.getIconWidth() > 90) {
thumbnail = new ImageIcon(
tmpIcon.getImage().
getScaledInstance(90, -1, Image.SCALE_DEFAULT));
} else thumbnail = tmpIcon;
}
DVG2 - 09 - Swing
15
Beispiel
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (
prop.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY))
{
file = (File) e.getNewValue();
if (isShowing()) {
loadImage();
repaint();
}
}
}
public void paintComponent(Graphics g) {
if (thumbnail == null) loadImage();
if (thumbnail != null) {
int x = getWidth()/2 - thumbnail.getIconWidth()/2;
int y = getHeight()/2 - thumbnail.getIconHeight()/2;
if (y < 0) y = 0;
if (x < 5) x = 5;
thumbnail.paintIcon(this, g, x, y);
}
} }
DVG2 - 09 - Swing
16
JTabbedPane




JTabbedPane ermöglicht es, in einem Fenster mehrere Ebenen
darzustellen.
Die verschiedenen Ebenen können durch „Reiter“ (Tabs) ausgewählt
werden.
Zum Hinzufügen einer Ebene dienen die Methoden
public void addTab(String title,
Component component)
public void addTab(String title, Icon icon,
Component component)
public void addTab(String title, Icon icon,
Component component, String tip)
title : Name der Ebene
component : hinzuzufügende Komponente
icon : anzuzeigendes Icon
tip : ToolTip Text für diese Ebene
DVG2 - 09 - Swing
17
Beispiel 9
public B9()
{
JTabbedPane pane = new JTabbedPane();
JPanel tab1 = new JPanel();
JPanel tab2 = new JPanel();
JPanel tab3 = new JPanel();
JPanel tab4 = new JPanel();
tab1.add(new JLabel("Table"));
tab2.add(new JLabel("FileChooser"));
tab3.add(new JLabel("ColorChooser"));
tab4.add(new JLabel("ProgressBar"));
pane.addTab("Table", null, tab1,
"ToolTip : Table");
pane.addTab("FileChooser", null, tab2,
"ToolTip : FileChooser");
pane.addTab("ColorChooser", null, tab3,
"ToolTip : ColorChooser");
pane.addTab("ProgressBar", null, tab4,
"ToolTip : ProgressBar");
add(pane);
}
DVG2 - 09 - Swing
18
Tabellen






Tabellen werden mit der Klasse JTable erzeugt.
JTable unterstützt den Aufbau von Tabellen mit beliebigen Inhalten.
Tabellenzellen können geändert werden oder für Änderungen
gesperrt sein.
Auf Änderungen von Zellen kann mit Listenern reagiert werden.
Um alle Funktionalitäten nutzen zu können muss man mit
TableModels arbeiten.
Für einfache Standardtabellen gibt es spezielle Konstruktoren.
public JTable(Object[][] rowData,
Object[] columnNames)

Mit diesem Konstruktor wird eine Tabelle erzeugt, die als
Überschriften die Feldelemente von columnNames hat und als
Feldinhalte die Feldelement von rowData.

Damit die Überschriften angezeigt werden und große Tabellen
dargestellt werden können bettet man die Tabelle am besten in ein
JScrollPane ein.
DVG2 - 09 - Swing
19

Mit der Methode
public void
setPreferredScrollableViewportSize(Dimension size)
der Klasse JTable wird die Anfangsgröße der Tabelle festgelegt.

Standardmäßig werden alle Spalten gleich breit angezeigt. Mit der
Methode
public void setPreferredWidth(int preferredWidth)
der Klasse TableColumn kann die Standardbreite einer Spalte
festgelegt werden. Wenn später die Breite der Tabelle verändert wird,
werden die Relationen der Spaltenbreiten beibehalten. Die Methode
kann folgendermaßen aufgerufen werden:
table.getColumnModel().getColumn(i).
setPreferredWidth(breite)
DVG2 - 09 - Swing
20
Einfache Tabelle
private Component makeSimpleJTable()
{
Object[][] data = {
{"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)},
{"Mark", "Andrews", "Speed reading", new Integer(20), new Boolean(true)},
{"Angela", "Lih", "Teaching high school", new Integer(4), new Boolean(false)}
};
String[] columnNames =
{"First Name","Last Name","Sport","# of Years", "Vegetarian"};
JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(
new Dimension(500, 70));
TableColumnModel columnModel = table.getColumnModel();
for (int i = 0; i < table.getColumnCount(); i++)
{
if(i==2)columnModel.getColumn(i).setPreferredWidth(100);
else columnModel.getColumn(i).setPreferredWidth(50);
}
return new JScrollPane(table);
}
DVG2 - 09 - Swing
21
TableModels


Um kompliziertere Tabellen zu erzeugen benötigt man TableModels.
Am einfachsten leitet man ein TableModel von der abstrakten Klasse
AbstractTableModel ab. Es müssen unbedingt folgende
Methoden implementiert werden:
public int getRowCount()
public int getColumnCount()
public Object getValueAt(int row, int column)

Weitere wichtige Methoden die implementiert werden können sind:
public String getColumnName(int column)
public Class getColumnClass(int c)
public boolean isCellEditable(int row, int col)
public void setValueAt(Object value, int row, int
col)

Mit Hilfe verschiedener fireXXX-Methoden können Listener
benachrichtigt werden. Besonders wichtig ist die Methode:
public void fireTableCellUpdated(int row,
int column)
DVG2 - 09 - Swing
22
Beispiel JTable1
private Component makeJTable1()
{
final Object[][] data = {...};
final String[] columnNames = {...};
AbstractTableModel tableModel = new AbstractTableModel()
{
public int getRowCount() { return data.length; }
public int getColumnCount() { return data[0].length; }
public Object getValueAt(int row, int column)
{ return data[row][column]; }
public String getColumnName(int column)
{ return columnNames[column]; }
public Class getColumnClass(int c)
{ return getValueAt(0, c).getClass(); }
public boolean isCellEditable(int row, int col)
{ return true; }
public void setValueAt(Object value, int row, int col)
{
data[row][col] = value;
fireTableCellUpdated(row, col);
}
};
DVG2 - 09 - Swing
23
JTable table = new JTable(tableModel);
table.setPreferredScrollableViewportSize(
new Dimension(500, 70));
TableColumnModel columnModel = table.getColumnModel();
for (int i = 0; i < table.getColumnCount(); i++)
{
if (i == 2)
columnModel.getColumn(i).setPreferredWidth(100);
else columnModel.getColumn(i).setPreferredWidth(50);
}
return new JScrollPane(table);
}
DVG2 - 09 - Swing
24
Zellrenderer



Für die Darstellung eines Objektes in einer Zelle wird ein Objekt
verwendet, das das Interface TableCellRenderer implementiert.
Das Interface TableCellRenderer definiert eine abstrakte
Methode:
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
table: Tabelle in der gerendert wird
value: Wert, der dargestellt werden soll
isSelected: Angabe ob die Zelle selektiert ist (true) oder nicht
(false)
hasFocus: Angabe ob die Zelle gerade den Focus besitzt
row: Zeilennummer der Zelle
column: Spaltennummer der Zelle
Rückgabewert: AWT-Componente, die den Wert darstellt
DVG2 - 09 - Swing
25
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class StudentRenderer implements TableCellRenderer
{
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
Student s = (Student)value;
JLabel comp = new JLabel(""+s.getMatrikelNummer());
comp.setToolTipText(s.getNachName()+
", "+s.getVorName());
comp.setHorizontalAlignment(JLabel.RIGHT);
return comp;
}
}
DVG2 - 09 - Swing
26
Aktivieren des TableCellRenderers

Aktivieren als Standardrenderer für eine Klasse mit der Methode
public void setDefaultRenderer(Class columnClass,
TableCellRenderer renderer)
der Klasse JTable:
table.setDefaultCellRenderer(Student.class, new
StudentRenderer())

Die Klasse wird für eine ganze Tabellenspalte einheitlich mit der
Methode getColumnClass des TableModel-Objektes bestimmt,
das zu der Tabelle gehört.
Alternativ kann der TableCellRenderer einer Spalte direkt gesetzt
werden:
table.getColumnModel().getColumn(3).setCellRenderer
(new StudentRenderer())

DVG2 - 09 - Swing
27
Zelleditor


Falls eine Zelle geändert werden soll, muss eine Eingabe ermöglicht
werden. Die Art der Eingabe ist sehr stark von dem konkreten Objekt
abhängig:
Boolean: JCheckBox
Text: JTextField
Number: JTextField mit anschließender Konvertierung
Auswahl: JComboBox
Allgemein wird ein TableCellEditor-Objekt aufgerufen, der
 Die Darstellung des zu editierenden Objektes enthält
 Den Dialog realisiert
 Das Ergebnis an die Tabelle ausliefert
DVG2 - 09 - Swing
28
DefaultCellEditor

Die einfachste Möglichkeit einen TableCellEditor zu bilden die
Klasse DefaultCellEditor aus javax.swing.

Konstruktoren:
public DefaultCellEditor(JTextField textField)
public DefaultCellEditor(JCheckBox checkBox)
public DefaultCellEditor(JComboBox comboBox)
DVG2 - 09 - Swing
29
Beispiel JTableEditor
JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.addItem("Speed reading");
comboBox.addItem("Teaching high school");
comboBox.addItem("None");
table.getColumnModel().getColumn(2).
setCellEditor(new DefaultCellEditor(comboBox));
DVG2 - 09 - Swing
30
AbstractCellEditor



Zur einfacheren Erzeugung eins TableCellEditors kann die
abstrakte Klasse AbstractCellEditor benutzt werden.
Dieses implementiert allerdings nur das Interface CellEditor.
TableCellEditor ist auch von CellEditor abgeleitet und
definiert die zusätzliche Methode
getTableCellEditorComponent.
DVG2 - 09 - Swing
31
public class StudentEditor extends AbstractCellEditor
implements TableCellEditor, ActionListener {
private StudentenDB db = null;
private JComboBox cb = new JComboBox();
public StudentEditor(StudentenDB db) {
this.db=db;
cb.setRenderer(new StudentRenderer());
cb.addActionListener(this);
}
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
cb.removeAllItems();
Iterator it = db.getStudenten().iterator();
while (it.hasNext()) cb.addItem(it.next());
return cb;
}
public Object getCellEditorValue() {
return cb.getSelectedItem();
}
public void actionPerformed(ActionEvent e) {
stopCellEditing();
}
}
DVG2 - 09 - Swing
32
public class StudentRenderer implements TableCellRenderer,
ListCellRenderer {
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
Student s = (Student)value;
JLabel comp = new JLabel(""+s.getMatrikelNummer());
comp.setToolTipText(s.getNachName()+
", "+s.getVorName());
comp.setHorizontalAlignment(JLabel.RIGHT);
return comp;
}
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean
isSelected, boolean cellHasFocus)
{
Student s = (Student)value;
return new JLabel(s.getNachName()+
", "+s.getVorName()+"("+s.getMatrikelNummer()+")");
}
}
DVG2 - 09 - Swing
33
Layout

Container enthalten AWT-Objekte

Wenn mehrere Objekte enthalten sind, stellt sich die Frage der
Anordnung der Objekte, des Layouts.
Die Anordnung der Objekte kann mit Hilfe der Layout-Managers
beeinflusst werden.
Alle von Container abgeleiteten Klassen erben die Methode
public void setLayout(LayoutManager mgr)
LayoutManager ist ein Interface  man kann prinzipiell eigene
LayoutManager entwickeln.
Vom Interface LayoutManager ist das Interface LayoutManager2
abgeleitet. Mit diesem Interface können kompliziertere Layouts
realisiert werden.
In AWT sind einige gebräuchliche Layouts realisiert.





DVG2 - 09 - Swing
34
Von LayoutManager abgeleitete Layouts

GridLayout



Tabellen-Layout
feste Anzahl von Zeilen und/oder
Spalten
Zeilenhöhe und Spaltenbreite
gleichmäßig
FlowLayout
fließendes Layout
passt sich der Größe des Fensters an
sortiert die Komponenten automatisch
DVG2 - 09 - Swing
35
Von LayoutManager2 abgeleitete Layouts

CardLayout



organisiert mehrere Seiten wie Karteikarten
Spezielle Methoden erlauben das Blättern und
Positionieren
Besser mit JTabbedPane realisieren
GridBagLayout
Verallgemeinertes TabellenLayout
Zusammenfassung von Zellen
Steuerung der Höhen und Breiten
BorderLayout
Randkomponenten um eine
zentrale Komponente platziert
DVG2 - 09 - Swing
36

BoxLayout
 Die Komponenten werden
nebeneinander oder
übereinander angeordnet.
DVG2 - 09 - Swing
37
Kombination von Layouts


Zur Beschreibung komplizierterer Layouts können diese kombiniert
werden.
Statt einer Komponente wird ein Container platziert. Dieser Container
erhält ein eigenes Layout.
DVG2 - 09 - Swing
38
ToolBars






Mit ToolBars kann man wichtige Funktionen schnell erreichbar
gestalten.
In einem ToolBar können beliebige Swing-Komponenten angeordnet
werden.
Die Funktionen werden über Listener aktiviert.
Es wird empfohlen, ToolBars zu Containern hinzuzufügen, die mit
einem BorderLayout versehen sind. Dabei sollte der ToolBar zu einer
Seite hinzugefügt werden und die anderen drei Seiten sollten leer
bleiben.
Konstruktoren:
public JToolBar()
public JToolBar(int orientation)
public JToolBar(String name)
public JToolBar(String name, int orientation)
name : Titel des Fensters, wenn der ToolBar extra dargestellt wird
orientation : HOROZONTAL oder VERTICAL Anfangsorientierung
Mit der Methode
public void addSeparator()
DVG2 - 09 - Swing
wird ein Separator eingefügt
39
Beispiel
toolBar.add(makeToolBarButton(null,
"EX", "Exit"));
toolBar.addSeparator();
toolBar.add(makeToolBarButton("images/fl.gif", null,
"FlowLayout"));
...
panel.add(toolBar, BorderLayout.SOUTH);
...
private JButton makeToolBarButton
(String iconName, String label, String text)
{
JButton button = new JButton(label);
if ( iconName!=null)
button.setIcon(new ImageIcon(iconName));
button.setToolTipText(text);
button.addActionListener(this);
button.setActionCommand(text);
return button;
}
DVG2 - 09 - Swing
40
public void actionPerformed(ActionEvent e)
{
String comm = e.getActionCommand();
if (comm.equals("Exit")) System.exit(0);
int index = tPane.indexOfTab(comm);
if (index>=0) tPane.setSelectedIndex(index);
}
DVG2 - 09 - Swing
41
Menüs


Zu Swing-Containern lassen sich Menüs hinzufügen.
Menüs bestehen aus
 Einem JMenuBar-Objekt, das
 Mehrere JMenu-Objekte enthalten kann, die wiederum
 Mehrere JMenuItem-Objekte enthalten können.
DVG2 - 09 - Swing
42
Konstruktoren















public JMenuBar()
public JMenu()
public JMenu(String s)
public JMenuItem()
public JMenuItem(Icon icon)
public JMenuItem(String text)
public JMenuItem(String text, Icon icon)
public JMenuItem(String text, int mnemonic)
public JCheckBoxMenuItem()
public JCheckBoxMenuItem(Icon icon)
public JCheckBoxMenuItem(String text)
public JCheckBoxMenuItem(String text, Icon icon)
public JCheckBoxMenuItem(String text, boolean b)
public JCheckBoxMenuItem(String text, Icon icon,
boolean b)
analog JRadioButtonMenuItem
DVG2 - 09 - Swing
43



JRadioButtonMenuItems müssen zu einer ButtonGroup
hinzugefügt werden, damit definiert ist, welche Items alternativ
ausgewählt werden können.
JMenuItems, JCheckBoxMenuItems und
JRadioButtonMenuItems verhalten sich bei Betätigung wie
JButtons, d.h. sie Lösen einen ActionEvent aus. Das
ActionCommand wird aus der Beschriftung entnommen, bzw. es
kann mit der Methode setActionCommand gesetzt werden.
Separatoren in JMenus können mit der Methode
public void addSeparator()
eingefügt werden.
DVG2 - 09 - Swing
44
Beispiel
JMenu test = new JMenu("BeispielMenü");
test.add(new JMenuItem("einfacher MenuItem"));
test.addSeparator();
test.add(new JCheckBoxMenuItem("CheckBoxMenuItem 1"));
test.add(new JCheckBoxMenuItem("CheckBoxMenuItem 2"));
test.add(new JCheckBoxMenuItem("CheckBoxMenuItem 3"));
test.addSeparator();
ButtonGroup bg = new ButtonGroup();
bg.add(new JRadioButtonMenuItem("RadioButtonMenuItem 1"));
bg.add(new JRadioButtonMenuItem("RadioButtonMenuItem 2"));
bg.add(new JRadioButtonMenuItem("RadioButtonMenuItem 3"));
for (Enumeration e=bg.getElements();e.hasMoreElements();)
test.add((JRadioButtonMenuItem)(e.nextElement()));
test.addSeparator();
JMenu unterMenue = new JMenu("UnterMenü");
JMenu unterUnterMenue = new JMenu("UnterUnterMenü");
unterUnterMenue.add(new JMenuItem("MenuItem 1"));
...
unterMenue.add(unterUnterMenue);
unterMenue.add(new JMenuItem("MenuItem 2"));
...
DVG2 - 09 - Swing
45
Look and Feel





Das Look & Feel bestimmt das Aussehen und Verhalten der
Swingoberfläche.
Das L&F kann zur Laufzeit des Systems geändert werden oder zu
Beginn festgelegt werden oder es wird das systemeigene L&F
verwendet.
Es sind drei L&F implementiert:
 Windows
 Motif
 Java Metal
Es ist möglich eigene L&F zu implementieren.
Zum Laden eines L&F dient die Methode
public static void setLookAndFeel
(String className )
DVG2 - 09 - Swing
46

Die Klassen sind:
 Windows:
com.sun.java.swing.plaf.windows.WindowsLookAndFeel




Motif:
com.sun.java.swing.plaf.motif.MotifLookAndFeel
Metal: javax.swing.plaf.metal.MetalLookAndFeel
Wenn das L&F zur Laufzeit geändert wird, muss es anschließend
aktiviert werden:
UIManager.setLookAndFeel(L&F-KlassenName);
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
pack() muss nur aufgerufen werden, wenn sich die Größe der
Komponenten durch das neue L&F verändert. Funktioniert nur für
JFrames nicht für JApplets.
DVG2 - 09 - Swing
47
Herunterladen