rebecca tiarks - informatik.uni-bremen.de · komponenten k onnen transparent und geformt sein und...
Post on 08-Aug-2019
213 Views
Preview:
TRANSCRIPT
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
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
top related