Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Generics<T>
8 Äußere.innere Klassen
9 Besondere Klassen der Java SE
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Bits und Bytes und Mathematisches
13 Datenstrukturen und Algorithmen
14 Threads und nebenläufige Programmierung
15 Raum und Zeit
16 Dateien, Verzeichnisse und Dateizugriffe
17 Datenströme
18 Die eXtensible Markup Language (XML)
19 Grafische Oberflächen mit Swing
20 Grafikprogrammierung
21 Netzwerkprogrammierung
22 Verteilte Programmierung mit RMI
23 JavaServer Pages und Servlets
24 Datenbankmanagement mit JDBC
25 Reflection und Annotationen
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
geb., mit DVD
1482 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1506-0
Pfeil 19 Grafische Oberflächen mit Swing
  Pfeil 19.1 Das Abstract Window Toolkit und Swing
    Pfeil 19.1.1 SwingSet-Demos
    Pfeil 19.1.2 Abstract Window Toolkit (AWT)
    Pfeil 19.1.3 Java Foundation Classes
    Pfeil 19.1.4 Was Swing von AWT unterscheidet
  Pfeil 19.2 Mit NetBeans zur ersten Oberfläche
    Pfeil 19.2.1 Projekt anlegen
    Pfeil 19.2.2 Gui-Klasse hinzufügen
    Pfeil 19.2.3 Programm starten
    Pfeil 19.2.4 Grafische Oberfläche aufbauen
    Pfeil 19.2.5 Swing-Komponenten-Klassen
    Pfeil 19.2.6 Funktionalität geben
  Pfeil 19.3 Fenster unter grafischen Oberflächen
    Pfeil 19.3.1 Swing-Fenster mit javax.swing.JFrame darstellen
    Pfeil 19.3.2 Fenster schließbar machen – setDefaultCloseOperation()
    Pfeil 19.3.3 Sichtbarkeit des Fensters
    Pfeil 19.3.4 Größe und Position des Fensters verändern
    Pfeil 19.3.5 Fenster- und Dialog-Dekoration, Transparenz *
    Pfeil 19.3.6 Dynamisches Layout während einer Größenänderung *
  Pfeil 19.4 Beschriftungen (JLabel)
    Pfeil 19.4.1 Mehrzeiliger Text, HTML in der Darstellung
  Pfeil 19.5 Icon und ImageIcon für Bilder auf Swing-Komponenten
    Pfeil 19.5.1 Die Klasse ImageIcon
    Pfeil 19.5.2 Die Schnittstelle Icon und eigene Icons *
  Pfeil 19.6 Es tut sich was – Ereignisse beim AWT
    Pfeil 19.6.1 Swings Ereignisquellen und Horcher (Listener)
    Pfeil 19.6.2 Listener implementieren
    Pfeil 19.6.3 Listener bei dem Ereignisauslöser anmelden/abmelden
    Pfeil 19.6.4 Aufrufen der Listener im AWT-Event-Thread
    Pfeil 19.6.5 Adapterklassen nutzen
    Pfeil 19.6.6 Innere Mitgliedsklassen und innere anonyme Klassen
    Pfeil 19.6.7 Ereignisse etwas genauer betrachtet *
  Pfeil 19.7 Schaltflächen
    Pfeil 19.7.1 Normale Schaltflächen (JButton)
    Pfeil 19.7.2 Der aufmerksame »ActionListener«
    Pfeil 19.7.3 Schaltflächen-Ereignisse vom Typ »ActionEvent«
    Pfeil 19.7.4 Basisklasse »AbstractButton«
    Pfeil 19.7.5 Wechselknopf (JToggleButton)
  Pfeil 19.8 Swing Action *
  Pfeil 19.9 JComponent und Component als Basis aller Komponenten
    Pfeil 19.9.1 Hinzufügen von Komponenten
    Pfeil 19.9.2 Tooltips (Kurzhinweise)
    Pfeil 19.9.3 Rahmen (Border) *
    Pfeil 19.9.4 Fokus und Navigation *
    Pfeil 19.9.5 Ereignisse jeder Komponente *
    Pfeil 19.9.6 Die Größe und Position einer Komponente *
    Pfeil 19.9.7 Komponenten-Ereignisse *
    Pfeil 19.9.8 Undurchsichtige (opake) Komponente *
    Pfeil 19.9.9 Properties und Listener für Änderungen *
  Pfeil 19.10 Container
    Pfeil 19.10.1 Standardcontainer (JPanel)
    Pfeil 19.10.2 Bereich mit automatischen Rollbalken (JScrollPane)
    Pfeil 19.10.3 Reiter (JTabbedPane)
    Pfeil 19.10.4 Teilungs-Komponente (JSplitPane)
  Pfeil 19.11 Alles Auslegungssache: die Layoutmanager
    Pfeil 19.11.1 Übersicht über Layoutmanager
    Pfeil 19.11.2 Zuweisen eines Layoutmanagers
    Pfeil 19.11.3 Im Fluss mit FlowLayout
    Pfeil 19.11.4 BoxLayout
    Pfeil 19.11.5 Mit BorderLayout in alle Himmelsrichtungen
    Pfeil 19.11.6 Rasteranordnung mit GridLayout
    Pfeil 19.11.7 Der GridBagLayoutmanager *
    Pfeil 19.11.8 Null-Layout *
    Pfeil 19.11.9 Weitere Layoutmanager
  Pfeil 19.12 Rollbalken und Schieberegler
    Pfeil 19.12.1 Schieberegler (JSlider)
    Pfeil 19.12.2 Rollbalken (JScrollBar) *
  Pfeil 19.13 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
    Pfeil 19.13.1 Kontrollfelder (JCheckBox)
    Pfeil 19.13.2 ItemSelectable, ItemListener und das ItemEvent
    Pfeil 19.13.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
  Pfeil 19.14 Fortschritte bei Operationen überwachen *
    Pfeil 19.14.1 Fortschrittsbalken (JProgressBar)
    Pfeil 19.14.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
  Pfeil 19.15 Menüs und Symbolleisten
    Pfeil 19.15.1 Die Menüleisten und die Einträge
    Pfeil 19.15.2 Menüeinträge definieren
    Pfeil 19.15.3 Einträge durch Action-Objekte beschreiben
    Pfeil 19.15.4 Mit der Tastatur: Mnemonics und Shortcut
    Pfeil 19.15.5 Der Tastatur-Shortcut (Accelerator)
    Pfeil 19.15.6 Tastenkürzel (Mnemonics)
    Pfeil 19.15.7 Symbolleisten alias Toolbars
    Pfeil 19.15.8 Popup-Menüs
  Pfeil 19.16 Das Model-View-Controller-Konzept
  Pfeil 19.17 Auswahlmenüs, Listen und Spinner
    Pfeil 19.17.1 Auswahlmenü (JComboBox)
    Pfeil 19.17.2 Zuordnung einer Taste mit einem Eintrag *
    Pfeil 19.17.3 Datumsauswahl
    Pfeil 19.17.4 Listen (JList)
    Pfeil 19.17.5 Drehfeld (JSpinner) *
  Pfeil 19.18 Textkomponenten
    Pfeil 19.18.1 Text in einer Eingabezeile
    Pfeil 19.18.2 Die Oberklasse der Text-Komponenten (JTextComponent)
    Pfeil 19.18.3 Geschützte Eingaben (JPasswordField)
    Pfeil 19.18.4 Validierende Eingabefelder (JFormattedTextField)
    Pfeil 19.18.5 Einfache mehrzeilige Textfelder (JTextArea)
    Pfeil 19.18.6 Editor-Klasse (JEditorPane) *
  Pfeil 19.19 Tabellen (JTable)
    Pfeil 19.19.1 Ein eigenes Tabellen-Model
    Pfeil 19.19.2 Basisklasse für eigene Modelle (AbstractTableModel)
    Pfeil 19.19.3 Vorgefertigtes Standard-Modell (DefaultTableModel)
    Pfeil 19.19.4 Ein eigener Renderer für Tabellen
    Pfeil 19.19.5 Zell-Editoren
    Pfeil 19.19.6 Größe und Umrandung der Zellen *
    Pfeil 19.19.7 Spalteninformationen*
    Pfeil 19.19.8 Tabellenkopf von Swing-Tabellen *
    Pfeil 19.19.9 Selektionen einer Tabelle *
    Pfeil 19.19.10 Automatisches Sortieren und Filtern mit RowSorter *
  Pfeil 19.20 Bäume (JTree)
    Pfeil 19.20.1 JTree und sein TreeModel und TreeNode
    Pfeil 19.20.2 Selektionen bemerken
    Pfeil 19.20.3 Das TreeModel von JTree *
  Pfeil 19.21 JRootPane und JDesktopPane *
    Pfeil 19.21.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane)
    Pfeil 19.21.2 JDesktopPane und die Kinder JInternalFrame
    Pfeil 19.21.3 JLayeredPane
  Pfeil 19.22 Dialoge und Window-Objekte
    Pfeil 19.22.1 JWindow und JDialog
    Pfeil 19.22.2 Modal oder nicht-modal
    Pfeil 19.22.3 Standarddialoge mit JOptionPane
    Pfeil 19.22.4 Der Dateiauswahldialog
    Pfeil 19.22.5 Der Farbauswahldialog JColorChooser *
  Pfeil 19.23 Flexibles Java-Look-and-Feel
    Pfeil 19.23.1 Look and Feel global setzen
    Pfeil 19.23.2 UIManager
    Pfeil 19.23.3 Windowsoptik mit JGoodies Looks verbessern *
  Pfeil 19.24 Swing-Komponenten neu erstellen oder verändern *
  Pfeil 19.25 Die Zwischenablage (Clipboard)
    Pfeil 19.25.1 Clipboard-Objekte
    Pfeil 19.25.2 Auf den Inhalt zugreifen mit »Transferable«
    Pfeil 19.25.3 DataFlavor ist das Format der Daten in der Zwischenablage
    Pfeil 19.25.4 Einfügungen in der Zwischenablage erkennen
    Pfeil 19.25.5 Drag
  Pfeil 19.26 AWT, Swing und die Threads
    Pfeil 19.26.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
    Pfeil 19.26.2 Swing ist nicht thread-sicher
    Pfeil 19.26.3 »invokeLater()« und »invokeAndWait()«
    Pfeil 19.26.4 SwingWorker
    Pfeil 19.26.5 Eigene Ereignisse in die Queue setzen *
    Pfeil 19.26.6 Auf alle Ereignisse hören *
  Pfeil 19.27 Barrierefreiheit mit der Java Accessibility API
  Pfeil 19.28 Zeitliches Ausführen mit dem javax.swing.Timer
  Pfeil 19.29 Zum Weiterlesen


Rheinwerk Computing - Zum Seitenanfang

19.22 Dialoge und Window-Objekte  Zur nächsten ÜberschriftZur vorigen Überschrift

Seit den ersten Swing-Tagen besitzt Swing Standard-Dialoge, wie einen Dateiauswahl-, Druck- oder Farbauswahldialog. Auf diese Dialogboxen soll dieser Abschnitt eingehen. Allerdings muss fairerweise gesagt werden, dass die Swing-Standarddialoge nur absolutes Minimim sind. Es lohnt sich, auf quelloffene Komponenten zurückzugreifen. Dazu zählen:

  • Dialoge zur Auswahl von Zeichensätzen oder Verzeichnissen (etwa bei http://common.l2fprod.com/)
  • bessere Dialogboxen (http://code.google.com/p/oxbow/) im Vista-Look
  • alternative Dialoge (http://xito.sourceforge.net/projects/dialog) im Windows-XP-Look

Rheinwerk Computing - Zum Seitenanfang

19.22.1 JWindow und JDialog  Zur nächsten ÜberschriftZur vorigen Überschrift

Ein JFrame ist ein Fenster, das standardmäßig eine Dekoration besitzt. Ein java.awt.Window hat diese Dekoration nicht, sodass sich diese Fläche als Willkommensbildschirm oder als komplette Zeichenfläche nutzen lässt. javax.swing.JWindow ist die Swing-Unterklasse von Window.

Die folgende Tabelle gibt die Unterschiede zwischen Fenster, Window und Dialog an:


Tabelle 19.9  Unterschiede zwischen Frame, Window und Dialog

Eigenschaft Frame Window Dialog

modal

nein

nein

möglich

größenveränderbar

ja

nein

ja

Titel

ja

nein

ja

Rahmen

ja

nein

ja

Menü

ja

nein

unüblich, bei JDialog aber möglich

Symbol-Icon

ja

nein

mit Hack[((Frame) dialog.getOwner()).setIconImage(image);] ja



Rheinwerk Computing - Zum Seitenanfang

19.22.2 Modal oder nicht-modal  Zur nächsten ÜberschriftZur vorigen Überschrift

Bildet eine Java-Applikation zwei Fenster, so kann der Anwender zwischen beiden Fenstern hin- und herschalten. Es ist nicht möglich, ein Fenster aufzubauen und dort Eingaben zu erzwingen, während das andere Fenster gesperrt ist. Dafür gibt es in Java spezielle Fenster, die Dialoge, die Swing mit javax.swing.JDialog angeht. JDialog ist eine Unterklasse von der AWT-Klasse Dialog, und Dialog ist wiederum eine Spezialisierung von Window. Ist ein Dialog im Zustand modal, muss erst der Dialog beendet werden, damit es in einem anderen Fenster weitergehen kann – alle Benutzereingaben an andere Fenster der Java-Anwendung sind so lange gesperrt. Sind mehrere Fenster gleichzeitig offen und können sie Eingaben annehmen, nennt sich dieser Zustand nicht-modal.

Soll der Dialog modal sein, sind ein übergeordnetes Fenster und ein Wahrheitswert true für den Modalitätstyp einzusetzen:

JDialog d = new JDialog( owner, true );
...
d.setVisible( true );
// Hier geht’s erst nach dem Schließen des Dialogs weiter.

Der owner kann ein anderer Dialog, ein Frame oder ein Window sein. Da bei modalen Dialogen alle Eingaben zu anderen Fenstern blockiert sind, nehmen erst nach dem Schließen des Dialogs andere Fenster die Eingaben wieder an. Ob der Dialog modal ist oder nicht lässt sich auch nach dem Erzeugen mit setModal(boolean) setzen.


Rheinwerk Computing - Zum Seitenanfang

19.22.3 Standarddialoge mit JOptionPane  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse JOptionPane erlaubt einfache Meldedialoge, Eingabedialoge, Bestätigungsdialoge und Optionsdialoge mit nur einem einfachen statischen Methodenaufruf der Art showXXXDialog():

  • showMessageDialog(): nur Nachricht anzeigen
  • showInputDialog(): Rückgabe ist ein String mit der Benutzereingabe bzw. Auswahl
  • showConfirmDialog(): Frage beantworten mit Möglichkeiten wie ja/nein
  • showOptionDialog(): allgemeinste Funktion

Einige Beispiele:

Listing 19.62  com/tutego/insel/ui/dialog/JOptionPaneDialogDemo.java, main()

// Dialog for a simple message

JOptionPane.showMessageDialog( null, "Wir Kinder aus dem Möwenweg" );

// Dialog for a user input

JOptionPane.showInputDialog( "Bitte Zahl eingeben" );

// Dialog to confirm a choice

JOptionPane.showConfirmDialog( null, "Alles OK?" );

// Dialog with different choices

String[] genderOptions = {
  "männlich", "weiblich", "keine Ahnung", "ändert sich ständig" };

String gender = (String) JOptionPane.showInputDialog( null,
          "Geschlecht",
          "Bitte das Geschlecht wählen (eigenes, nicht gewünschtes)",
          JOptionPane.QUESTION_MESSAGE,
          null, genderOptions,
          genderOptions[1] );

System.out.println( gender );

// Customized option dialog

String[] yesNoOptions = { "Ja", "Nein", "Abbrechen" };

int n = JOptionPane.showOptionDialog( null,
          "Ja oder Nein?",               // question
          "Ja/Nein/Abbrechen",           // title
          JOptionPane.YES_NO_CANCEL_OPTION,
          JOptionPane.QUESTION_MESSAGE,  // icon
          null, yesNoOptions,yesNoOptions[0] );

if ( n == JOptionPane.YES_OPTION )
  System.out.println("Ja gewählt");

System.exit( 0 );

Einige Methoden erwarten als erstes Argument eine Vater-Komponente, die null sein kann. Sie dient zur relativen Ausrichtung des Dialogs und verknüpft den Dialog derart mit einem Fenster, dass, wenn das Fenster versteckt wird, auch der Dialog verschwindet.

Sich Bestätigung einholen

Die statische Methode showConfirmDialog() gibt es in vier Varianten, denn sie erlaubt die Angabe für Icon, Überschrift, Fragetext und Auswahl unterschiedlicher Schaltflächen.


class javax.swing.JOptionPane
extends JComponent
implements Accessible

  • static int showConfirmDialog( Component parentComponent, Object message ) Dialog mit eigener Nachricht und mit Ja-/Nein-/Abrechen-Schaltfächen sowie vordefiniertem Titel.
  • static int showConfirmDialog( Component parentComponent, Object message, String title, int optionType ) Dialog mit eigener Nachricht sowie Dialogtitel, und der letzte Parameter kann JOptionPane.YES_NO_OPTION oder JOptionPane.YES_NO_CANCEL_OPTION sein, um entweder Ja-/Nein-Schaltflächen darzustellen, oder auch Ja-/Nein-/Abbrechen-Schaltflächen.

Rückgaben der Methode zeigen Auswahl

Bei den statischen Methoden

  • String showInputDialog() (eine Methode liefert auch Object als Rückgabe)
  • int showConfirmDialog()
  • int showOptionDialog()

zeigt eine Rückgabe an, was der Benutzer gewählt/geschrieben hat (showMessageDialog() liefert keine Rückgabe, sondern void). Mögliche Rückgaben sind bei showConfirmDialog() und showOptionDialog() Ganzzahlen, die die Konstanten YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION oder CLOSED_OPTION benennen. showInputDialog() liefert einen String oder null, wenn der Benutzer den Dialog abgebrochen hat. Die Methode showInputDialog() ist flexibel und zeigt nicht einfach nur ein Eingabefeld an, sondern bei entsprechener Parametrisierung auch eine Auswahlliste.

Dialogtyp und Visualisierung mit Icon

Alle vier statischen Dialog-Methoden showMessageDialog(), showConfirmDialog(), showOptionDialog() und showInputDialog() erlauben zusätzlich die Angabe eines Nachrichtentyps; mögliche Konstanten sind ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE und PLAIN_MESSAGE. Sie bestimmen im Allgemeinen ein Standard-Icon, das vom Look & Feel abhängig ist. Ein eigenes Icon kann ebenfalls zugewiesen werden.

  • static int showConfirmDialog( Component parentComponent, Object message, String title, int optionType, int messageType )
  • static int showConfirmDialog( Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon )
  • static String showInputDialog( Component parentComponent, Object message, String title, int messageType )
  • static Object showInputDialog( Component parentComponent, Object message, String title, int messageType, Icon icon, Object[] selectionValues, Object initialSelectionValue )
  • static void showMessageDialog( Component parentComponent, Object message, String title, int messageType )
  • static void showMessageDialog( Component parentComponent, Object message, String title, int messageType, Icon icon )
  • showOptionDialog( Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue )

Exemplare vom JOptionPane erzeugen

Selten gibt es die Notwendigkeit, andere als die statischen Methoden von showXXXDialog() einzusetzen. Erforderlich kann ein in einem solchen Fall genutztes Exemplar der Klasse JOptionPane aber zum Beispiel dann sein, wenn beim Klick auf das × vom Dialog-Fenster der Dialog nicht verschwinden soll oder wenn gewisse Werte im Textfeld bei showInputDialog() nicht erwünscht sind, wie Folgen von Leerzeichen. Grundsätzlich sieht der Aufbau eines eigenen Dialogs dann so aus:

JOptionPane pane = new JOptionPane( ... );
JDialog dialog = new JDialog();
dialog.setContentPane( pane );

oder:

JOptionPane pane = new JOptionPane( ... );
JDialog dialog = pane.createDialog( parent, title );

Rheinwerk Computing - Zum Seitenanfang

19.22.4 Der Dateiauswahldialog  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse JFileChooser (unter AWT heißt die Klasse FileDialog) simuliert einen betriebssystemabhängigen Dialog zur Auswahl von Dateien und Verzeichnissen. Der Selektor ist modal und kann für das Speichern und Öffnen konfiguriert sein. Zudem lassen sich die Pfade und ein Filter zur Auswahl spezieller Dateien setzen. Nach dem Schließen und Beenden mit dem OK-Button stehen ausgewählte Dateien zur Verfügung.

Vollständiges Programm für eine Auswahlbox

Wir können direkt aus dem Hauptprogramm ein Objekt JFrame erzeugen und dann einen Dateiauswahldialog öffnen. Zusätzlich wollen wir ihm einen Filter mitgeben, der Textdateien mit den Endungen .txt, .html und .log zulässt. Die Realisierung des Filterns erfolgt durch eine vorgegebene Implementierung der Schnittstelle FileFilter, durch FileNameExtensionFilter, die erst spät in Java 6 zur API stieß:

Listing 19.63  com/tutego/insel/ui/dialog/JFileChooserDemo.java

package com.tutego.insel.ui.dialog;

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class JFileChooserDemo
{
  public static void main( String[] args )
  {
    JFileChooser fc = new JFileChooser();
    fc.setFileFilter( new FileNameExtensionFilter("Textdateien", ".txt", Umbruch
      "*.html", "*.log" ) );

    int state = fc.showOpenDialog( null );

    if ( state == JFileChooser.APPROVE_OPTION )
    {
      File file = fc.getSelectedFile();
      System.out.println( file.getName() );
    }
    else
      System.out.println( "Auswahl abgebrochen" );

    System.exit( 0 );
  }
}

Abbildung 19.22  Der Dateiauswahldialog


Tipp Im Speichern-Dialog sollte ein Standardname angegeben sein. Im Idealfall richtet er sich nach dem Inhalt der Datei. Dazu bietet die Klasse JFileChooser die Methode setSelectedFile():

c.setSelectedFile( new File("c:/test.txt") );


class javax.swing.JFileChooser
extends JComponent
implements Accessible

Zum Erzeugen eines Auswahldialogs steht eine Reihe von Konstruktoren zur Auswahl:

  • JFileChooser() Erzeugt einen Dateidialog ohne Titel zum Öffnen einer Datei. Zeigt auf das Benutzerverzeichnis.
  • JFileChooser( File currentDirectory ) Erzeugt wie JFileChooser() einen Dateidialog ohne Titel zum Öffnen einer Datei, zeigt aber beim Start auf das Verzeichnis currentDirectory.
  • JFileChooser( String currentDirectoryPath ) Äquivalent zu JFileChooser( new File(currentDirectoryPath) ).
  • String getDirectory() Liefert das Dialogverzeichnis.
  • File getSelectedFile() Liefert die ausgewählte Datei.
  • File[] getSelectedFiles() Liefert alle ausgewählten Dateien, wenn der Dateiauswahldialog Mehrfachselektion zulässt.
  • void setDialogTitle( String dialogTitle ) Setzt einen neuen Fenstertitel.
  • void setDialogType( int dialogType ) Handelt es sich um einen Laden-/Speichern-Dialog oder um einen angepassten Dialog? Deklarierte Konstanten sind JFileChooser.OPEN_DIALOG, JFileChooser.SAVE_DIALOG und JFileChooser.CUSTOM_DIALOG.
  • void setFileView( FileView fileView ) Standardmäßig zeigt der Dialog neben dem Dateinamen ein kleines Bild an. Das lässt sich mit einem FileView-Objekt anpassen.
  • void setAccessory( JComponent newAccessory ) Setzt eine Komponente für eine mögliche Vorschau.

Filtern der Liste *

Ein Dateiauswahldialog zeigt standardmäßig alle nicht-geschützten Dateien und Verzeichnisse an. Dem Dialog lässt sich ein Filter zuweisen, sodass nicht gewünschte Dateien ausgefiltert werden. Standardmäßig beachtet der Dateiauswahldialog drei unterschiedliche Filter:

  • Ob der JFileChooser geschützte Dateien anzeigt oder nicht, setzt setFileHidingEnabled(boolean). So zeigt setFileHidingEnabled(false) alle Dateien, auch die geschützten, an – geschützte Dateien beginnen auf Unix-Systemen mit einem Punkt.
  • Ein eigener Dateifilter lässt sich mit setFileFilter(FileFilter) setzen. Was der Filter nicht akzeptiert, taucht auch später in der Liste nicht auf.
  • Filter-Listen bestehen aus mehreren Filtern, die der Benutzer später auswählen kann. Microsoft Word zeigt zum Beispiel beim Laden Filter-Listen wie »Alle Dateien (*.*)«, »Word Dokumente (*.doc; *.doc*)« usw. an. Ein Filter wird mit addChoosableFileFilter(FileFilter) einem JFileChooser hinzugefügt. Es kann beliebig viele Aufrufe dieser Methode geben, die je ein Filter der Liste hinzufügt.

Einen konkreten Filter implementiert die Schnittstelle javax.swing.filechooser.FileFilter. Achtung! Obwohl wir eine Schnittstelle FileFilter schon kennen, handelt es sich nicht um diejenige aus dem java.io-Paket, sondern um eine Schnittstelle aus dem Paket javax.swing.filechooser.

Die die Schnittstelle FileFilter implementierenden Klassen müssen eine accept()-Methode realisieren und eine Methode getDescription(), die eine Zeichenkette für die Dialog-Liste liefert. Für reine Dateiendungen bietet sich die vorgefertigte Klasse javax.swing.filechooser.FileNameExtensionFilter an.


abstract class javax.swing.filechooser.FileFilter

  • abstract boolean accept( File f ) Akzeptiert der FileFilter die Datei oder nicht?
  • abstract String getDescription() Liefert eine Beschreibung für den Filter.

Beispiel Nur alle Ordner sowie Dateien, die mit der Tilde (»~«) beginnen, sollen angezeigt werden:

fc.setFileFilter( new FileFilter()
{
  @Override public boolean accept( File )

    return f.isDirectory() ||
           f.getName().startsWith( "~" );

  @Override public String getDescription()

    return "Benutzerverzeichnisse";

} );


class javax.swing.JFileChooser
extends JComponent
implements Accessible

  • void setFileHidingEnabled( boolean b ) Bestimmt, ob verborgene Dateien angezeigt werden sollen.
  • void setFileFilter( javax.swing.filechooser.FileFilter filter ) Setzt einen FileFilter zur Anzeige der gewünschten Dateien.
  • void addChoosableFileFilter( FileFilter filter ) Fügt einen Filter hinzu.

Hinweis Sollen im Dialog nur Verzeichnisse, aber keine Dateien auftauchen, so lässt sich dies mit setFileSelectionMode() und einem passenden Argument einstellen:

fileChooser.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );

Insgesamt sind drei Konstanten deklariert: FILES_ONLY, DIRECTORIES_ONLY und FILES_AND_DIRECTORIES. Der Name verrät schon die Bedeutung.


Vorschaubilder *

Die Methode setAccessory() kann eine JComponent für die Vorschau zuweisen, die immer dann aktualisiert wird, wenn der Benutzer im Dialog eine Datei auswählt. Eine Auswahl meldet dabei ein PropertyChangeEvent, das ein Listener abfängt und testet, ob es JFileChooser.SELECTED_FILE_CHANGED_PROPERTY war. Um das Vorgehen kurz zu skizzieren, folgende Ereignisbehandlung:

public void propertyChange( PropertyChangeEvent e )
{
  if ( JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(e.getPropertyName()) )
  {
    File f = (File) e.getNewValue();
    // File f laden, etwa mit ImageIcon, dann anzeigen.
  }
}

Rheinwerk Computing - Zum Seitenanfang

19.22.5 Der Farbauswahldialog JColorChooser *  topZur vorigen Überschrift

Mit einem JColorChooser lassen sich Farben über drei unterschiedliche Reiter auswählen. Der Benutzer hat die Auswahl zwischen vordefinierten Farben, HSB-Werten und RGB-Werten. Um den Farbauswahldialog auf den Bildschirm zu bekommen, genügt ein Aufruf von JColorChooser.showDialog() mit drei Argumenten: einem Component-Objekt (dem Vater des Dialogs), dem Titel und einer Anfangsfarbe. Beendet der Benutzer den Dialog, wird als Rückgabe-wert die ausgewählte Farbe geliefert. Wird der Dialog abgebrochen, so ist der Rückgabewert null:

Listing 19.64  com/tutego/insel/ui/dialog/JFileChooserDemo.java

package com.tutego.insel.ui.dialog;

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

public class JColorChooserDemo
{
 public static void main( String[] args )
 {
  JFrame f = new JFrame();
  f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  JButton b = new JButton( "Farbe ändern" );
  f.add( b );
  b.addActionListener( new ActionListener() {
   public void actionPerformed( ActionEvent e ) {
    Component comp = (Component) e.getSource();
    Color newColor = JColorChooser.showDialog( Umbruch
      null, "Wähle neue Farbe", comp.getBackground() );
    comp.setBackground( newColor );
   }
  } );
  f.pack();
  f.setVisible( true );
 }
}

Den Aufruf mit showDialog() einzuleiten, ist nicht der einzige Weg. Wir können auch den Konstruktor nutzen und dieses Exemplar später mit JColorChooser.createDialog() übergeben und anzeigen.


class javax.swing.JColorChooser
extends JComponent implements Accessible

  • JColorChooser() Erzeugt einen neuen Farbauswahldialog.
  • JColorChooser( Color c ) Erzeugt einen neuen Farbauswahldialog mit einer vordefinierten Farbe.
  • static Color showDialog( Component c, String title, Color initialColor ) Zeigt einen modalen Farbauswahldialog.
  • static JDialog createDialog( Component c, String title, boolean modal, JColorChooser chooserPane, ActionListener okLis, ActionListener cancelLis ) Erzeugt einen neuen Dialog aufgrund des JColorChooser-Objekts mit Standardschaltflächen zum Bestätigen und Abbrechen.

JColorChooser-Objekte als spezielle Komponenten

Neben der statischen Methode showDialog() lässt sich auch der Konstruktor nutzen, um ein JColorChooser als spezielles JComponent-Objekt aufzubauen. Das bringt den Vorteil mit sich, dass die Farbauswahl nicht zwingend in einem eigenständigen Dialog stattfinden muss, sondern im Fall einer Komponente diese zusammen mit anderen Komponenten auf einen Container gesetzt werden kann. Änderungen an der Auswahl registriert ein ChangeListener, der etwa so angewendet wird:

chooser.getSelectionModel().addChangeListener( new ChangeListener() {
 public void stateChanged( ChangeEvent e ) {
  Color c = ((ColorSelectionModel) e.getSource()).getSelectedColor();
 }
} ) ;

Weitere Beispiele finden sich beim Java Developers Almanac unter http://www.exampledepot.com/egs/javax.swing.colorchooser/pkg.html. Die Themen sind unter anderem: Anpassen der Anzeige und Umsortierung der Reiter. Üblich sind drei Reiter mit den Aufschriften Muster (auf einer englischsprachigen Oberfläche Swatch), HSB und RGB. Wie ein neuer Reiter mit einer Graustufenanzeige eingebracht wird, zeigt http://www.java2s.com/Code/Java/Swing-JFC/JColorChooserdialogwiththecustomGrayScalePanelpickertab.htm.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de