public JCheckBoxMenuItem(String text)

Werbung
SWING
DVG2 - 10 - Swing
ColorChooser

DVG2 - 10 - Swing
2



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.
Beispiel 7
public Container makeContentPane()
{
DVG2 - 10 - Swing
JPanel pane = new JPanel();
Color c = JColorChooser.showDialog(pane,
"Hintergrundfarbe festlegen", pane.getBackground());
pane.setBackground(c);
c = JColorChooser.showDialog(pane,
"Vordergrundfarbe festlegen", pane.getForeground());
JLabel l = new JLabel("Das sind die neuen Farben");
l.setFont(new Font("Arial", Font.BOLD, 40));
l.setForeground(c);
pane.add(l);
return pane;
}
3
FileChooser

DVG2 - 10 - Swing






4
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.
Öffnen des JFileChooser-Dialogs

DVG2 - 10 - Swing


5
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
JFileChooser-Objekt erzeugt worden ist.
Bei showOpenDialog bzw. showSaveDialog wird die
Beschriftung durch das L&F festgelegt.
Die Methoden 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
Abfragen der ausgewählten Dateien

DVG2 - 10 - Swing
6

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()
Beispiel 8
public class B8 extends JApplet implements ActionListener
{
DVG2 - 10 - Swing
7
...
JLabel la;
File startDir = null;
public Container makeContentPane() {
JPanel pane = new JPanel();
pane.setLayout(new FlowLayout());
JButton jb = new JButton("Open File");
jb.addActionListener(this);
pane.add(jb);
la = new JLabel("Es ist kein File ausgewählt");
pane.add(la);
return pane;
}
DVG2 - 10 - Swing
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());
}
}
8
Filtern der angezeigten Dateien

DVG2 - 10 - Swing
9


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).
Die abstrakte Klasse FileFilter
DVG2 - 10 - Swing

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)“


10
Beispiel
import javax.swing.filechooser.FileFilter;
import java.io.File;
DVG2 - 10 - Swing
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)";
}
}
11
FileView

DVG2 - 10 - Swing



12
Um den Typ der Dateien anhand der Icons unterscheiden zu
können, kann ein Objekt der Klasse FileView zu dem JFileChooserObjekt 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.
Beispiel
DVG2 - 10 - Swing
13
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;
}
}
Dateivorschau


DVG2 - 10 - Swing



14
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.
Beispiel
DVG2 - 10 - Swing
15
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;
}
Beispiel
DVG2 - 10 - Swing
16
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);
}
} }
JTabbedPane

DVG2 - 10 - Swing



17
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
Beispiel 9
DVG2 - 10 - Swing
18
private Container makeContentPane()
{
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");
JPanel panel = new JPanel();
panel.add(pane);
return panel;
}
Tabellen


DVG2 - 10 - Swing
19




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 - 10 - Swing
20

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)
Einfache Tabelle
DVG2 - 10 - Swing
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);
21
}
TableModels


DVG2 - 10 - Swing
22
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)
Beispiel JTable1
DVG2 - 10 - Swing
23
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 - 10 - Swing
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);
}
24
Zellrenderer

DVG2 - 10 - Swing

25
Jede Zelle wird bei der Darstellung durch einen Zellrenderer
bearbeitet. Welcher Zellrenderer verwendet wird hängt vom Typ,
d.h. von der Klasse des Objektes ab. Diese wird mit der Methode
getColumnClass abgefragt. Zellen in einer Spalte werden also
immer gleich gerendert. Folgende Standardrenderer sind im System
enthalten:
– Boolean : als CheckBox
– Number : als rechtsbündiges Label
– ImageIcon : als zentriertes Bild
– Andere Objekte : als linksbündige Zeichenkette des Objektes
Eigene Renderer können hinzugefügt werden.
public void setDefaultRenderer(Class columnClass,
TableCellRenderer renderer)
columnClass : Klasse für die Renderer zuständig ist
renderer : Renderer, der für diese Klasse verwendet werden soll
public void
setCellRenderer(TableCellRenderer cellRenderer)
um den Renderer eines TableColumn-Objektes zu setzen
Zelleditoren

DVG2 - 10 - Swing
26


Zelleditoren werden ähnlich wie die Renderer angewendet. Sie
dienen der Eingabe eines Wertes in einer Zelle.
Sie können ebenfall Spalten- oder Klassenabhängig definiert
werden.
Für spezielle Zelleditoren gibt es die Klasse DefaultCellEditor mit
den Konstruktoren:
public DefaultCellEditor(JTextField textField)
public DefaultCellEditor(JCheckBox checkBox)
public DefaultCellEditor(JComboBox comboBox)
Beispiel JTableEditor
DVG2 - 10 - Swing
27
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));
Layout
DVG2 - 10 - Swing

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.





28
Von LayoutManager abgeleitete Layouts

GridLayout
DVG2 - 10 - Swing
– 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
29
Von LayoutManager2 abgeleitete Layouts

CardLayout
DVG2 - 10 - Swing
– 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
30

DVG2 - 10 - Swing
31
BoxLayout
– Die Komponenten werden
nebeneinander oder
übereinander angeordnet.
Kombination von Layouts

DVG2 - 10 - Swing
32

Zur Beschreibung komplizierterer Layouts können diese kombiniert
werden.
Statt einer Komponente wird ein Container platziert. Dieser
Container erhält ein eigenes Layout.
ToolBars

DVG2 - 10 - Swing





33
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()
wird ein Separator eingefügt
Beispiel
DVG2 - 10 - Swing
34
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 - 10 - Swing
35
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);
}
Menüs


DVG2 - 10 - Swing
36
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.
Konstruktoren


DVG2 - 10 - Swing













37
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 - 10 - Swing


38
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.
Beispiel
DVG2 - 10 - Swing
39
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"));
...
Look and Feel


DVG2 - 10 - Swing




40
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 )
Die Klassen sind:
– Windows:
com.sun.java.swing.plaf.windows.WindowsLookAndF
eel
– Motif:
com.sun.java.swing.plaf.motif.MotifLookAndFeel
– Metal: javax.swing.plaf.metal.MetalLookAndFeel

DVG2 - 10 - Swing
41

Wenn das L&F zur Laufzeit 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.
Herunterladen