...erinnern Sie sich? oopjs4b / kwhbkd4r

Größe: px
Ab Seite anzeigen:

Download "...erinnern Sie sich? oopjs4b / kwhbkd4r"

Transkript

1 ...erinnern Sie sich? oopjs4b / kwhbkd4r

2 !"

3 Ereignisbehandlung in awt/swing führt Liste interessierter Behandler GUI- Komponente (z.b. Knopf) wird eingetragen trägt ein Ereigniskanal fertigt ab neuer Behandler Als Benutzer muss ich kennen: den erwarteten Behandler-Typ (Interface) die Methode zum Eintragen ("Registrieren") von Behandlern

4 Aufbau von GUIs das WIMP-Konzept Graphische Oberflächen sind Fenster, möglicherweise unterteilt in Unterfenster, in denen "Widgets" plaziert sind. Widget steht für Window Gadget Fenster- "Vorrichtung" oder "Bedienelement" Seit den 80ern üblich, ersonnen in den 60ern! WIMP-Konzept W I M P (Multiple) Windows Icons Menus Pointing Device oopjs4b / kwhbkd4r

5 Java-AWT Die AWT-Klassen implementieren Fenster und Widgets. (c) S.Seehusen 2002 oopjs4b / kwhbkd4r

6 Java-Swing Swing bietet mehr und leistungsfähigere Widgets, die auf AWT-Klassen aufsetzen (d.h. sie erweitern). (c) S.Seehusen 2002

7 AWT und Swing AWT Paket java.awt Frame Label Button Texfield Swing Paket javax.swing JFrame JLabel JButton JTextfield... Da Swing auf AWT aufbaut, müssen meist beide Pakete importiert werden. JBit??

8 Nichts geht mehr ohne Dokumentation! AWT und Swing sind große Bibliotheken So viele Klassen kann man nicht perfekt kennen. Machen Sie sich spätestens jetzt ein Lesezeichen bei der Dokumentation der Java-Standard-Bibliotheken (oder laden Sie sie herunter):

9 AWT-Komponenten

10 Swing-Komponenten (Auswahl) Window JFrame JDialog Container JComponent "Widget" = Window Gadget JPanel JLabel AbstractButton JComboBox JTextComponent JSlider JProgressBar JTable JTree JButton JCheckBox JRadioButton JTextField JTextArea JEditorPane

11 Erstmal ein Hauptfenster: Anwendungsfenster: JFrame Programmstruktur für GUIs: Aufbau des Fensters im Konstruktor dort Aufruf einer init-methode für die Komponenten Erzeugung eines Fensterobjekts in der main-methode

12 public class Hauptfenster2 extends JFrame { public Hauptfenster2() { settitle("fenster im Aufbau"); init(); // noch leer setsize(400,400); setvisible(true); // pack(); } private void init() {} } public static void main (String[] args) { new Hauptfenster(); }

13 Hinzufügen von Widgets Container-Methode add Bis Java 1.4: nicht direkt anwenden, sondern auf die ContentPane vorher Layout einstellen (FlowLayout) zum Abschluss evtl. pack() aufrufen, um das Layout zu berechnen (im Konstruktor) private void init() { JButton taste = new JButton("clear"); JTextField text = new JTextField(" 0.0"); setlayout(new FlowLayout()); } Container fenster = this; // Java 1.4: this.getcontentpane(); fenster.add(taste); fenster.add(text);

14 Aufbau der Komponenten in init() private void init() { JLabel anmeldung = new JLabel ("Bitte melden Sie sich an!"); JLabel user = new JLabel ("username:"); JTextField userfield = new JTextField(" "); JLabel pw = new JLabel ("password:"); JTextField pwfield = new JTextField("", 15); JButton ok = new JButton("ok"); } Container fenster = this; // Java 1.4:.getContentPane(); fenster.setlayout(new FlowLayout()); fenster.add(anmeldung); fenster.add(user); fenster.add(userfield); fenster.add(pw); fenster.add(pwfield); fenster.add(ok);

15 Die Anordnung wird durch FlowLayout gesteuert.

16 Arbeiten mit den Komponenten Jede Komponente hat Eigenschaften, wie Größe Schriftart Farben Text Image Dafür gibt es jeweils get/set-methoden Bei der Weckeranimation hatten wir bereits setimageicon für ein JLabel verwendet.

17 Schreiben wir jetzt den ersten Text etwas größer und in Blau: JLabel anmeldung = new JLabel ("Bitte melden Sie sich an!"); anmeldung.setfont(new Font("Helvetica",Font.BOLD,16)); anmeldung.setforeground(color.blue);

18 Interaktion ohne Ereignisse: Textkomponenten Textkomponenten können editierbar gesetzt werden: set Editable(true) Damit können Benutzereingaben gelesen werden: gettext() JTextField userfield = new JTextfield(" "); JTextField pwfield = new JTextfield(" "); userfield.seteditable(true); // default pwfield.seteditable(true); // default String benutzer = userfield.gettext(); String passwort = pwfield.gettext();

19 Interaktion ohne Ereignisse: CheckBox und RadioButton Eine CheckBox ist ein "ankreuzbares" Kästchen Ein RadioButton ist ein "setzbarer" Knopf (meist als RadioButtonGroup genau ein Knopf zur Zeit setzbar) Abfrage mit isselected() JCheckBox check = new JCheckBox("akzeptiere"); JRadioButton ja = new JRadioButton("ja"); JRadioButton nein = new JRadioButton("nein"); ButtonGroup jein = new ButtonGroup(); jein.add(ja); jein.add(nein); fenster.add(ja); fenster.add(nein); fenster.add(check);

20 Interaktion ohne Ereignisse: ComboBox Eine ComboBox ist eine aufklappbare Auswahlliste Aufklappen und Selektion passieren auf der GUI Mit getselectedindex und getselecteditem kann die Auswahl gelesen werden JComboBox combo1 = new JComboBox(); combo1.additem("männlich"); combo1.additem("weiblich"); String[] anrede = {"Herr", "Frau", "Firma"}; JComboBox combo2 = new JComboBox(anrede); fenster.add(combo1); fenster.add(combo2);

21 Interaktion ohne Ereignisse: Dialogfenster Dialogfenster sind zumeist modale Fenster, die Benutzereingaben entgegennehmen. Ihre Anzeigemethode "show..." ist oft eine Funktion, d.h. sie liefert das Dialogergebnis ab. JDialog ist ein universales Dialogfenster: durch Konstruktorparameter konfigurieren oder erweitern Swing bietet eine Menge fertiger Dialogfenster: JOptionPane: verschiedene Bestätigungs-, Auswahlund Eingabefenster JFileChooser: Dateiwahlfenster JColorChooser: Farbwahlfenster.

22 JOptionPane.showMessageDialog (null, "Controller reagiert nicht", "Alarm", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog (null, "nicht zertifiziert", "Warnung", JOptionPane.WARNING_MESSAGE); JOptionPane.showConfirmDialog (null, "Löschen?", "Bestätigung", JOptionPane.YES_NO_OPTION);

23 String eingabe = JOptionPane.showInputDialog ("Bitte Wert eingeben:"); System.out.println ("eingegeben: "+ eingabe); Object[] werte = { "alpha", "beta", "gamma" }; Object auswahl = JOptionPane.showInputDialog (null, "Bitte wählen Sie", "Auswahl", JOptionPane.INFORMATION_MESSAGE, null, werte, werte[1]); System.out.println ("gewählt: "+auswahl);

24 JFileChooser JFileChooser chooser = new JFileChooser(); chooser.showopendialog(fenster);

25 JColorChooser JColorChooser colors = new JColorChooser(); Color color = colors.showdialog (fenster, "Farbwahl", Color.blue );

26 Menüs JMenuBar enthält JMenu-s JMenu enthält JMenuItem-s oder JMenu-s JMenuItem-s können sein Strings Icons Icons + String CheckBoxes oder RadioButtons JMenuBar wird dem Hauptfenster hinzugefügt mit setjmenubar() Auch aus Menüs kann man mit getselecteditem() die Auswahl erfragen, also ohne Ereignisbehandlung arbeiten

27 Aufbau von Menüs protected void initmenus() { JMenuBar menubar = new JMenuBar(); JMenu menu1 = new JMenu("File"); JMenu menu2 = new JMenu("Edit"); menubar.add(menu1); menubar.add(menu2); menu1.add("erster punkt"); menu1.add(new JMenuItem("zweiter punkt")); JMenu untermenue = new JMenu("auswahl"); untermenue.add("1. wahl"); untermenue.add(new JMenuItem("2. wahl")); menu2.add(untermenue); menu2.add("einfacher punkt"); } this.setjmenubar(menubar);

28 Layout Jedem Container wird ein "Layouter-Objekt" zugeteilt, das die Komponenten darin anordnet. Swings Layouter heißen FlowLayout GridLayout BoxLayout BorderLayout CardLayout GridBagLayout NullLayout einfachste Anordnung in Reihen, Komponenten behalten ihre Größe Anordnung in Reihen und Spalten, Komponenten übernehmen Feldgröße Eine Reihe oder Spalte, sonst wie Grid Große Mitte, dazu Kopf-und Fußzeile und Randspalten (Center, North, South,...) Anordnung von Panels auf Registerkarten Grid mit verbundenen Zellen (komplex) Absolute Größe und Platzierung in Pixeln, unflexibel bei Größenveränderung des Fensters

29 GridLayout fenster.setlayout(new GridLayout(4,2)); fenster.add(anmeldung); fenster.add(new JLabel(" "));// Dummy für GridLayout fenster.add(user); fenster.add(userfield); fenster.add(pw); fenster.add(pwfield); fenster.add(ok);

30 BorderLayout kombiniert mit GridLayout fenster.setlayout(new BorderLayout()); fenster.add(anmeldung,borderlayout.north); JPanel center = new JPanel(new GridLayout(2,2)); center.add(user); center.add(userfield); center.add(pw); center.add(pwfield); fenster.add(center, BorderLayout.CENTER); fenster.add(ok,borderlayout.south);

31 Statt CardLayout In Swing nimmt man für Registerkarten lieber den Spezialcontainer JTabbedPane JTabbedPane tabbedpane = new JTabbedPane(SwingConstants.LEFT); tabbedpane.setbackground(color.blue); tabbedpane.setforeground(color.white); JPanel erstes = new JPanel(); erstes.add(new JLabel("Ich bin Nr.1!")); tabbedpane.addtab("erster", null, erstes,"erste Karte"); tabbedpane.addtab("zweiter", null, new JPanel(),"Zweite Karte"); tabbedpane.addtab("dritter", null, new JPanel(),"Dritte Karte"); fenster.add(tabbedpane);

32 Jetzt geht's ans Basteln... Überlegen Sie, wie Sie das Layout eines Taschenrechners realisieren würden!...so oder ähnlich...

33 ...soweit sind die GUIs ja ganz nett, aber faul! Nächstes Mal müssen sie arbeiten!