Rebecca Tiarks - informatik.uni-bremen.de · Komponenten k onnen transparent und geformt sein und...

56
SWING Literatur Ausgew¨ ahlte Implementierungsprobleme Rebecca Tiarks 15. Januar 2009 1 / 56

Transcript of Rebecca Tiarks - informatik.uni-bremen.de · Komponenten k onnen transparent und geformt sein und...

SWINGLiteratur

Ausgewahlte Implementierungsprobleme

Rebecca Tiarks

15. Januar 2009

1 / 56

SWINGLiteratur

Inhaltsverzeichnis

1 SWING

2 / 56

SWINGLiteratur

AWT

grafische Benutzeroberflache (GUI)

erste API von Sun AWT

bietet GUI-Komponenten, Operationen zum Zeichnen und zurEreignisbehandlung.

sehr einfach gehalten

3 / 56

SWINGLiteratur

Peer-Klassen

jede grafische Komponente wird auf darunterliegendeKomponente der Plattform abgebildet

Peer-Klassen

Schaltflache leitet Visualisierung und Interaktion an einePeer-Klasse auf der Betriebssystemseite weiter.

dadurch sollen Theoretisch alle AWT-Anwendungen dem lookand feel der Plattform entsprechen

plattformunabhangige Bibliothek fur grafische Oberflachenschwer umsetzbar

unterschiedliches Verhalten von Benutzerschnittstellen auf denPlattformen (Menus, Scrollbars, etc.)

4 / 56

SWINGLiteratur

Vor- und Nachteile AWT

Oberflache verhalt sich so wie erwartet

entspricht optisch den nativen Programmen der Plattform

Programme zeigen merkwurdige Seiteneffekte

durch Unabhangigkeit nur wenige Widgets verfugbar

fur modernere, anspruchsvollere grafische Oberflachenungeeignet

heavyweight components beziehen Ressourcen von der nativenPlattform

5 / 56

SWINGLiteratur

JFC

Netscape entwickelte Erweiterungen

Internet Foundation Classes IFC

1997 einigten sich IBM Netscape und Sun auf eineGUI-Bibliothek die auf die IFC aufbaut

Java Foundation Classes JFC

6 / 56

SWINGLiteratur

JFC Bestandteile

SWING-GUI-Komponenten mit vielen neuen grafischenElementen

SWING ist kein Ersatz - benutzt Teile aus derAWT-Architektur (Frame → JFrame)

Pluggable Look and Feel Aussehen der Komponenten kannzur Laufzeit geandert werden

Java 2D-API ermoglicht komplexere Objekte zu bilden

Drag’n Drop ermoglicht Datenubertragung zwischenApplikationen

Unterstutzung fur Menschen mit Behinderungen

7 / 56

SWINGLiteratur

SWING Eigenschaften

mehr Komponenten

Labels auf den Schaltflachen

Komponenten konnen transparent und geformt sein und einenRahmen haben

SWING-Methoden sind nicht Thread-sicher. Parallelitat kannprobleme erzeugen

9 / 56

SWINGLiteratur

Einen Frame erzeugen

JFrame abgeleitet von der AWT-Klasse Frame

Paket javax.swing

Fenster (Toplevel-Container) erzeugen (Fenster ist in keinemanderen enthalten)

Fensterdekorationen ( Titel, Buttons etc. ) werden vomFenstersystem beeinflusst und nicht von SWING

11 / 56

SWINGLiteratur

Beispiel

JFrame hat eine default Große von 0 x 0 Pixeln

setDefaultCloseOperation() gibt Verhalten beimSchließen des Fensters an (Applikation beenden oder Fensterin den Hintergrund)

erst setVisible(true) macht Fenster sichtbar dadurchkonnen vorher Komponenten hinzugefugt werden

12 / 56

SWINGLiteratur

Beispiel

package examples;

import javax.swing.JFrame;

public class JFrameTest

{

public static void main( String [] args )

{

JFrame frame = new JFrame( "Hello World" );

frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

frame.setSize( 300, 100 );

frame.setVisible( true );

}

}

13 / 56

SWINGLiteratur

Positionierung von Frames

setLocation und setBounds setzen Position

setIconIamge setz das Icon in der Taskleiste etc.

setTitle Titel des Fensters

setResizeable Große veranderbar?

mit der Klasse Toolkit abstrahiert von system- undbildschirmabhangigen Implementierungen, fur jede Plattformeine Implementierung (WToolkit Windows

ermoglicht Herausfinden der Bildschirmgroße etc.

14 / 56

SWINGLiteratur

Struktur von JFrame

JFrame besitzt nur einen Container JRootPane

dieser verwaltet eine Layered-Pane die ein Menu und dieContent-Pane aufnimmt

Glass-Pane als Glasscheibe uber allen Komponenten

der Container von JFrame der die Komponenten aufnimmtheisst Content-Pane

Komponenten werden mit der Funktion add() hinzugefugt

da der JFrame mehrere Container verwaltet musste man vorJava 5 zurerst den Content-Pane erfragen:

Container cont = frame.getContentPane ();

cont.add( component );

15 / 56

SWINGLiteratur

atomare Komponenten

Komponenten die direkt angezeigt werden und selber keinContainer sind atomare Komponenten

JLabel javax.swing.JLabel

wird mit add() hinzugefugt

JLabel lost keine Events aus ist aber Component und reagiertz.B. auf MausOperationen

17 / 56

SWINGLiteratur

Beispiel

public class JLabelTest

{

public static void main( String [] args )

{

JFrame frame = new JFrame ();

frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

JLabel label = new JLabel( "neues Label" );

label.setForeground( Color.MAGENTA );

frame.add( label );

frame.pack ();

frame.setVisible( true );

}

}

18 / 56

SWINGLiteratur

Events

ausgesendete Botschaften werden in Ereignisklassen eingeteilt

Ereignisse sind Objekte die aus einer Unterklasse vonAWTEvent gebildet sind

AWTEvent befindet sich direkt in java.awt

Ereignissklassen selber in java.awt.event

jede Ereignisklasse besitzt eine ID die mit getID() erfragtwerden kann

19 / 56

SWINGLiteratur

Event-Listener

es existieren Ereignis-Ausloser wie Schaltflachen

es gibt eine Reihe von Interessenten die informiert werdenwollen

Interessent ist nur an bestimmten Ereignissen interessiertmuss sich bei der Ereignisquelle anmelden

fur jedes Ereignis gibt es einen eigenen Listener, an den dasEreignis weitergeleitet wird

z.B. ActionListener, MouseListener

21 / 56

class WithoutAdapter extends JFrame

implements WindowListener

{

public void windowClosing( WindowEvent event ) {

System.exit( 0 );

}

public void windowClosed( WindowEvent event ) { }

public void windowDeiconified( WindowEvent event ) { }

public void windowIconified( WindowEvent event ) { }

public void windowActivated( WindowEvent event ) { }

public void windowDeactivated( WindowEvent event ) { }

public void windowOpened( WindowEvent event ) { }

WithoutAdapter (){

setSize( 400, 400 );

addWindowListener( this );

setVisible( true );

}

public static void main( String [] args ) {

new WithoutAdapter ();

}

}

SWINGLiteratur

Listener hinzufugen

addEreignis Listener

removeEreignis Listener

fur Fenster z.B. addWindowListener

Adapterklassen fur Listener (nicht mehr jede Methode mussimplementiert werden)

Adapterklasse fur Schnittstelle WindowListener heisstWindowAdapter

man uberschreibt nur noch die Methode die man braucht

23 / 56

SWINGLiteratur

Listener mit Adapterklasse

public class WithAdapter

{

public static void main( String [] args )

{

JFrame frame = new JFrame ();

frame.setSize( 400, 400 );

frame.setVisible( true );

frame.addWindowListener( new CloseWindowAction () );

}

}

class CloseWindowAction extends WindowAdapter

{

public void windowClosing( WindowEvent e ) {

System.exit (0);

}

}

24 / 56

SWINGLiteratur

Listener mit innerer anonymer Klasse

public class Inner extends JFrame

{

public Inner ()

{

setSize( 100, 100 );

addWindowListener( new WindowAdapter () {

public void windowClosing( WindowEvent e ) {

System.exit( 0 );

}

} );

}

public static void main( String [] args )

{

new Inner (). setVisible( true );

}

}

25 / 56

SWINGLiteratur

Schaltflachen

Schaltflachen oder Buttons ermoglichen Interaktion

JButton reagiert auf Aktivierung und erzeugt einActionEvent das ein ActionListener meldet

JButton leitet von der Oberklasse AbstractButton ab

ebenso JToggleButton und JMenuItem

gemeinsame Eigenschaften: Selbstauslosung doClick(), IconssetDisabledIcon(Icon), setPressedIcon(Icon) etc.

Ausrichtung von Text und Position von Text und Icons

26 / 56

SWINGLiteratur

Beispiel

public class JButtonTest

{

public static void main( String [] args )

{

JFrame frame = new JFrame ();

frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

final Icon icon1 = new ImageIcon( JButtonTest.class.getResource( "/images/user -trash -full.png" ) );

final JButton testButton = new JButton( icon1 );

frame.add( testButton );

frame.pack ();

frame.setVisible( true );

}

}

27 / 56

SWINGLiteratur

Actions

eine Aktion lost ein Event aus - mehrere Moglichkeiten(Shortcut, Menu etc.)

javax.swing.Action

Unterschiedliche Aktionen definierbar

Unterklassen von AbstractAction nutzen undActionPerformed() uberschreiben

Action exitAction = new AbstractAction( "Quit" ) {

public void actionPerformed( ActionEvent e ) {

System.exit( 0 );

}

};

JButton but = new JButton( exitAction );

frame.add( but );

28 / 56

SWINGLiteratur

Component und JComponent

Component ist die Basisklasse der Komponenten

JComponent ist erweiterte Klasse allerdings leitet sie nichtdirekt ab sondern erst von Container und dann

jede JComponent ist auch ein Container

JComponent bietet viele Funktionen fur Tooltips, Rahmen,Tastaturbedienung

29 / 56

SWINGLiteratur

Component und JComponent Events

Component ComponentEvent

FocusEvent

KeyEvent

MouseEvent

InputMethodEvent

HierachyEvent

PropertyChangedEvent

Container ContainerEvent

JComponent PropertyChangeEvent

AncestorEvent

30 / 56

SWINGLiteratur

Component-Listener

ComponentListener ist Basisklasse fur alle Komponenten dieEreignisse empfangen

componentHide( ComponentEvent e ) Komponente wurdeversteckt

componentMoved( ComponentEvent e ) Komponentewurde bewegt

componentResized( ComponentEvent e ) Große derKomponente wurde verandert

componentShown( ComponentEvent e ) Komponentewurde angezeigt Tastaturbedienung

32 / 56

SWINGLiteratur

Container

Komponenten mussen auf einem Container platziert werden

Container nehmen Kinder auf und verwalten diese

JPanel ist im JComponent mit der Moglichkeit die Kinderanzuordnen

JScrollPane Komponente mit Scrollbalken

JTabbedPane mit Reitern

JSplitPane Darstellung von zwei KomponentenTastaturbedienung

33 / 56

SWINGLiteratur

Beispiel

public class Tab

{

public static void main( String [] args )

{

JFrame frame = new JFrame ();

frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

JTabbedPane tab = new JTabbedPane ();

tab.addTab( "Tab 1", new JButton("Tab 1") );

tab.addTab( "Tab 2", new JTextArea () );

frame.add(tab);

frame.pack ();

frame.setVisible( true );

}

}

36 / 56

SWINGLiteratur

Rollbalken

JScrollBar

durch verschieben eines Knopfes lasst sich ein Wert auswahlen

wahlt ganzzahligen Wert aus vorher definierten Werten aus

bei vertikalem Balken liegt der großte Wert oben beihorizontalen links

die wichtigsten Werte sind Orientierung (vertikal, horizontal),Minimal-, Maximalwert, aktueller Wert

fur Events muss AdjustmentListener implementiert werdenadjustmentValueChanged( AdjustmentEvent e ) wirdvom Rollbalken aufgerufen

37 / 56

SWINGLiteratur

Schieberegler

JScrollBar

ahnlich wie Rollbalken Auswahl eines Wertes

zusatzlich kann die Skala durch Striche dargestellt werden

die ticks konnen auch automatisch nummeriert werden

auf Events hort der ChangeListener

38 / 56

SWINGLiteratur

Layout Manager

ein Layout Manager ordnet die Elemente eines Containers

Container fragt bei der Darstellung den Layoutmanager wiedie Elemente dargstellt werden sollen

Layoutmanager in Java:

FlowLayout von links nach rechtsBoxLayou horizontal oder vertikalGridLayout Raster mit gleichgroßen ElementenBorderLayout in vier Himmelsrichtungen oder MitteGridBagLayout Erweiterung von GridLayoutCardLayout verwaltet Komponenten wie einen Stapel (nureine sichtbar)SpringLayout Berucksichtigt Kanten von KomponentenGroupLayout

der Layout-Manager wird einem Container mit setLayout(LayoutManager) zugewiesen

39 / 56

Border Layout

Box Layout

FlowLayout

SWINGLiteratur

Kontrollfelder

Kontrollfeler haben einen Zustand an oder aus

JCheckBox

kann mit Grafiken den Zustand darstellen

auf Events hort der ItemListener

mit getState() und setState() kann Zustand erfragt bzw.geandert werden

41 / 56

public static void main( String [] args )

{

JFrame frame = new JFrame( "Frame" );

frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

Icon unchecked = new ImageIcon( Check.class.getResource( "/images/cancel.png" ) );

Icon checked = new ImageIcon( Check.class.getResource( "/images/ok.png" ) );

JCheckBox box = new JCheckBox( "Checkbox", true );

box.setIcon( unchecked );

box.setSelectedIcon( checked );

frame.add( box , BorderLayout.PAGE_START );

ItemListener boxListener = new ItemListener () {

public void itemStateChanged( ItemEvent e ) {

System.out.print( (( JCheckBox) e.getItem ()). getText () );

}

};

box.addItemListener( boxListener );

frame.pack ();

frame.setVisible( true );

}

SWINGLiteratur

Fortschrittsbalken

JProgressBar

zeigt das Vorankommen (oder Nichtvorankommen) einerAnwendung

die wichtigsten Werte sind Orientierung (vertikal, horizontal),Minimal-, Maximalwert, aktueller Wert

setValue(int n) setz den Wert

43 / 56

SWINGLiteratur

Menus

Fenstermenus und Popup-Menus

sind immer mit einem Fenster verbunden

Menubalken nimmt Menueintrage auf

sitzt auf einem Toplevel-Container außerhalb derContent-Pane

Menueintrage losen Aktionen aus und konnen weitere Eintrageenthalten (Untermenu)

44 / 56

SWINGLiteratur

Menus

JMenu

JMenuBar() erzeugt einen neuen Menubalken

setJMenuBar(JMenubar menubar) weist Menu einemJFrame zu

JMenu(String s) erzeugt ein neues Menu

JMenu add(JMenu c) fugt neue Menuzeile

JMenuBar menuBar = new JMenuBar ();

JMenu fileMenu = new JMenu( "Datei" );

menuBar.add( fileMenu );

f.setJMenuBar( menuBar );

45 / 56

SWINGLiteratur

Menueintrage

JMenuItem

add() fugt die vertikalen Elemente vom Typ JMenuItemhinzu

JMenuItemJMenu als Unterklasse fur Untermenus

addSeparator() fugt Trennlinie ein

Menueintrage lassen sich mit Action-Objekten belegen

JMenu helpMenu = new JMenu( "Hilfe" );

menuBar.add( helpMenu );

helpMenu.add( new JMenuItem("Programm") );

46 / 56

SWINGLiteratur

Popup-Menus

haben keine feste Position

meistens auf Rechtsklick des Benutzers aktiviert(Kontextmenu)

JPopupMenu analog wie JMenu

zum Offnen auf Mausereignis horen und show() aufrufen

47 / 56

SWINGLiteratur

Texteingabefelder

vershiedene Moglichkeiten in SWING

JTextField einzeiliges EingabefeldJFormattedTextField einzeiliges Textfeld mitFormatierungsvorgabenJPasswordField verdeckte EingabeJTextArea mehrzeiligJEditorPane EditorJTextPane spezieller Editor

alle von JTextComponent abgeleitet wichtige MethodensetText(String) und getText()

48 / 56

SWINGLiteratur

Formatiertes Eingabefeld

JFormattedTextField ftf1 = new JFormattedTextField(

new SimpleDateFormat("MM/dd/yy") );

49 / 56

SWINGLiteratur

Tabellen

JTable

zweidimensionale Tabellen bei Bedarf auch eigenesTabellenmodell

als Eingabe ein zweidimensionales Feld

String [][] data = { {"A", "B" }, {"U", "V"} };

JTable table = new JTable( data );

50 / 56

SWINGLiteratur

Tabellen-Modell

Trennung von Daten und Anzeige

Daten werden durch die Schnittstelle TableModel

um auf die Daten einer Tabelle zugreifen zu konnen brauchtman das Modell

auch eigenes Modell moglich das mitsetModel(TableModel) gesetzt werden kann

51 / 56

SWINGLiteratur

Dialoge und Windows

JFrame Fenster mit Dekoration java.awt.Window nicht

Swing-Unterklasse JWindow

Dialoge java.awt.Dialog und JDialog

Dialoge konnen modal oder nicht-modal sein (bei modal Restsolange gesperrt bis Nutzer reagiert)

Meldedialoge, Eingabedialoge, Bestatigungsdialoge etc. mitJOptionPane

konnen einfach durch entsprechenden Aufruf verwendet werdeshowXXXDialog()

52 / 56

JOptionPane.showInputDialog( "Bitte Name eingeben" );

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

JOptionPane.showMessageDialog( null , "Message" );

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

int n = JOptionPane.showOptionDialog( null ,

"Ja oder Nein?", // Fragetext

"Ja/Nein/Abbrechen", // Titel

JOptionPane.YES_NO_CANCEL_OPTION ,

JOptionPane.QUESTION_MESSAGE , // Icon

null , optionen ,optionen [0] );

if ( n == JOptionPane.YES_OPTION )

System.out.println("Ja");

SWINGLiteratur

Dateiauswahl

JFileChooser zur Auswahl von Dateien und Verzeichnissen

ist modal und kann furs Offnen oder furs Speichernkonfiguriert sein

erst nach Schließen mit der OK Schaltflache konnen dieDatein verwendet werden

Filtern nach bestimmten Dateien ist moglich

Erzeugen mit JFileChooser()

ausgewahlte Datei oder Verzeichnis abfragbar durchgetSelectedFile() und getDirectory()

FileFilter muss die Methoden accept() undgetDescription() implementieren

54 / 56

SWINGLiteratur

Nebenlaufgkeit

Ereignisse gelangen in eine Ereigniswarteschlange event queue

jedes Fenster hat eine eigene Event-Queue

AWT-Event-Thread lauft parallel und arbeitet die Ereignisseab

fuhrt auch den Prorgammcode in den Listenern aus

dauert die Abarbeiten in dem Handler lange steht dasProgramm

Swing ist nicht Thread-sicher bei konkurrierenden Zugriffengibts eine Exception

deshalb Methoden zur um die Auftrage in den AWT-Threadeinzureihen

invokeLater(Runnable) und invokeAndWait(Runnable)

55 / 56

SWINGLiteratur

Christian Ullenboom. Java ist auch eine Insel. Galileo Computing,7 edition, 2008. ISBN 978-3-8362-1146-8.

56 / 56