Java für Computerlinguisten 5. Grafische Userinterfaces Christian Scheible Institut für Maschinelle Sprachverarbeitung 31. Juli 2009 Christian Scheible Java für Computerlinguisten 31. Juli 2009 1 / 33 Übersicht 1 Besprechung der Übungen vom Donnerstag 2 GUI-Programmierung 3 Sonstiges Christian Scheible Java für Computerlinguisten 31. Juli 2009 2 / 33 GUI Übersicht • Grafische Userinterfaces • Wir stellen dem User Fenster mit Bedienelementen zur Verfügung • Buttons • Texteingaben • Listen • Dialoge (z.B. Speichern als ...) • In Java in mehreren Paketen • Swing • Abstract Window Toolkit Christian Scheible Java für Computerlinguisten 31. Juli 2009 3 / 33 GUI AWT • java.awt • Benutzt GUI-Komponenten des jeweiligen Betriebssystems • Aussehen und Benutzung wie in diesem System • Implementierung für jedes System neu, Portierung könnte Probleme machen Swing • javax.swing • Nachfolger von AWT • Definiert eigene GUI-Komponenten • Sieht etwas eigen aus, Benutzung nicht unbedingt wie im Betriebssystemen • Einfach portierbar Üblich: Swing für Oberfläche, AWT für Logik Christian Scheible Java für Computerlinguisten 31. Juli 2009 4 / 33 Swing Model-View-Controller • Model: Daten/Logik, die repräsentiert werden sollen • View: Darstellung der Daten im Programm • Controller: Verarbeitung von Benutzereingaben Christian Scheible Java für Computerlinguisten 31. Juli 2009 5 / 33 Swing Mein Program Mein Program Frame File Edit View File Edit View Content Pane Fensterinhalt Fensterinhalt • Fenster hat mehrere Schichten • Fenster = Frame (JFrame) • ContentPane → frame.getContentPane() • Später: Mehr Schichten Christian Scheible Java für Computerlinguisten 31. Juli 2009 6 / 33 Swing • Fenster (JFrame) • Text in einem Label (JLabel) Christian Scheible Java für Computerlinguisten 31. Juli 2009 7 / 33 Swing Label • Kann Text und Grafiken darstellen • Kann durchsichtig sein (setOpaque(true)) JLabel myLabel = new JLabel("Hallo!"); Christian Scheible Java für Computerlinguisten 31. Juli 2009 8 / 33 Swing class MeinProgramm { public static void main (String[] args) { JFrame frame = new JFrame("Mein Programm"); // Programm endet, wenn das Fenster geschlossen wird frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Label in Content Pane einfgen frame.getContentPane().add(new JLabel("Hallo!")); // Frame aufbauen frame.pack(); // Frame anzeigen frame.setVisible(true); } } Christian Scheible Java für Computerlinguisten 31. Juli 2009 9 / 33 Swing JButton • Darauf kann man klicken • Tut etwas, wenn man klickt JButton button = new JButton("Hier Klicken"); Christian Scheible Java für Computerlinguisten 31. Juli 2009 10 / 33 Swing JButton JFrame frame = new JFrame("Mein Programm"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton meinButton = new JButton("Hier klicken!"); frame.getContentPane().add(meinButton); frame.pack(); frame.setVisible(true); Christian Scheible Java für Computerlinguisten 31. Juli 2009 11 / 33 Swing Panel • Bis jetzt: Immer nur eine Komponente im Frame • Problem: Alle Komponenten füllen das ganze Fenster aus → Überlagerung bei mehreren Komponenten • Schichtenmodell: Neue Schicht zur Anordnung der Komponenten • JPanel → Üblich: Unterklasse von JPanel erstellen Christian Scheible Java für Computerlinguisten 31. Juli 2009 12 / 33 Swing JPanel • Ordnet seine Elemente automatisch an • Wird in den JFrame gesteckt • Im Beispiel: JButton und JLabel werden dem Panel hinzugefügt class MeinPanel extends JPanel { JLabel meinLabel = new JLabel("Noch nichts passiert"); this.add(meinLabel); JButton meinButton = new JButton("Mein Button"); this.add(meinButton); } Christian Scheible Java für Computerlinguisten 31. Juli 2009 13 / 33 Swing MeinPanel.java class MeinPanel extends JPanel { JLabel meinLabel = new JLabel("Noch nichts passiert"); this.add(meinLabel); JButton meinButton = new JButton("Mein Button"); this.add(meinButton); } MeinHauptprogramm.java public class LabelButton { public static void main(String[] args) { JFrame frame = new JFrame("Beispiel: Panels"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new MeinPanel()); frame.pack(); frame.setVisible(true); } } Christian Scheible Java für Computerlinguisten 31. Juli 2009 14 / 33 Swing Was macht der Button? • Im Moment: nichts. • Button muss sagen, wie die Aktion heißt, die er ausführt (frei definierbar als String) → meinButton.setActionCommand("klick"); • Button braucht einen java.awt.event.ActionListener, dem er die Aktion mitteilen kann → meinButton.addActionListener(this); → this, weil üblicherweise das Panel zum ActionListener gemacht wird (per Interface) Christian Scheible Java für Computerlinguisten 31. Juli 2009 15 / 33 Swing MeinPanel.java public class MeinPanel extends JPanel implements ActionListener { JLabel meinLabel; MeinPanel() { meinLabel = new JLabel("Noch nichts passiert."); this.add(meinLabel); JButton meinButton = new JButton("Der Button"); meinButton.setActionCommand("klick"); meinButton.addActionListener(this); this.add(meinButton); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("klick")) meinLabel.setText("Der Button wurde gedrckt!"); } } Christian Scheible Java für Computerlinguisten 31. Juli 2009 16 / 33 Swing JTextField • User kann Text eingeben (eine Zeile) • Zugriff auf den Inhalt per textEingabe.getText() • Tastatureingaben können abgefangen werden JTextField textEingabe = new JTextField("Hier kann ich etwas eingeben"); Christian Scheible Java für Computerlinguisten 31. Juli 2009 17 / 33 Swing MeinTextPanel.java public class MeinTextPanel extends JPanel implements ActionListener { JTextField textEingabe; MeinTextPanel() { textEingabe = new JTextField("Hier kann ich etwas eingeben"); this.add(textEingabe); JButton meinButton = new JButton("Der Button"); meinButton.setActionCommand("klick"); meinButton.addActionListener(this); this.add(meinButton); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("klick")) JOptionPane.showMessageDialog(new JFrame(), textEingabe.getText()); } } Christian Scheible Java für Computerlinguisten 31. Juli 2009 18 / 33 Swing JOptionPane.showMessageDialog(new JFrame(), textEingabe.getText()); Dialog • Gibt eine Meldung aus • new JFrame(): Normalerweise der Frame, aus dem wir die Methode aufrufen (geht hier nicht) Christian Scheible Java für Computerlinguisten 31. Juli 2009 19 / 33 Swing JTextArea • Wie JTextField, kann aber mehrere Zeilen darstellen • Ähnlich wie die Texteingabe in einem Editor JTextArea textEingabe = new JTextArea(20,40); // 20 Zeilen, 40 Spalten textEingabe.setText("Das Textfeld hat mehrere\nZeilen, in die ich\nschreiben kann."); Christian Scheible Java für Computerlinguisten 31. Juli 2009 20 / 33 Swing JList • Listen mit beliebigen Elementen • Listenmodelle, um den Inhalt zu bearbeiten String[] elemente = { "Item 1", "Item 2", "Item 3", "Item 4"}; JList liste = new JList(elemente); Christian Scheible Java für Computerlinguisten 31. Juli 2009 21 / 33 Swing Menüs • Mehrere Komponenten • JMenu: Das Menü • JMenuBar: Die eigentliche Leiste im Menü • JMenuItem: Ein Element im Menü (funktioniert wie ein Button) Christian Scheible Java für Computerlinguisten 31. Juli 2009 22 / 33 Swing JFrame frame = new JFrame(); // Komponenten erstellen JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Datei"); JMenuItem menuItem = new JMenuItem("Speichern unter ..."); // Komponenten ineinander einfgen menu.add(menuItem); menuBar.add(menu); frame.setJMenuBar(menuBar); frame.pack(); frame.setVisible(true); Christian Scheible Java für Computerlinguisten 31. Juli 2009 23 / 33 Swing Was es sonst noch in Swing gibt: • Checkboxen • Radiobuttons • Tabellen • Scrollbalken • Tabs • Fortschrittsbalken • Vorgefertigte Dialoge (z.B. Datei öffnen) • HTML-Anzeige • Bessere Anordnung von Elementen (z.B. Grid-Layout, Box-Layout) • ... Christian Scheible Java für Computerlinguisten 31. Juli 2009 24 / 33 Obfuscated Java h.java /* Just Java Peter van der Linden April 1, 1996. \u0050\u0076\u0064\u004c\u0020\u0031\u0020\u0041\u0070\u0072\u0039\u0036 \u002a\u002f\u0020\u0063\u006c\u0061\u0073\u0073\u0020\u0068\u0020\u007b \u0020\u0020\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020 \u0073\u0074\u0061\u0074\u0069\u0063\u0020\u0020\u0076\u006f\u0069\u0064 \u006d\u0061\u0069\u006e\u0028\u0020\u0053\u0074\u0072\u0069\u006e\u0067 \u005b\u005d\u0061\u0029\u0020\u007b\u0053\u0079\u0073\u0074\u0065\u006d \u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e \u0028\u0022\u0048\u0069\u0021\u0022\u0029\u003b\u007d\u007d\u002f\u002a */ Hi! Christian Scheible Java für Computerlinguisten 31. Juli 2009 25 / 33 Obfuscated Java class Sig{public static void main(String...args){\u0066or(int \u0020$:"vÌÈÊ\"¤!ÀÊ"¬Æ\"v¤Î¤\""¤¨¸¬Æ".to\u0043h\u0061rArray() )System./*goto/*$/%\u0126//^\u002A\u002Fout.print((char)(($>> +(~'"'&'#'))+('<'>>('\\'/'.')/\u002Array.const(~1)\*\u002F)));}} Just another Java Hacker Christian Scheible Java für Computerlinguisten 31. Juli 2009 26 / 33 Was haben wir nicht gemacht? Threads • System kann mehrere Programme gleichzeitig ausführen • Idee: Wir teilen unser Programm • Mehrere trennbare Abläufe werden parallel erledigt • Nutzung von mehreren Prozessoren gleichzeitig ist möglich • Kann auch bei nur einem Prozessor schon Vorteile haben • In Java mitgeliefert (Thread) • Vorsicht: Programm schwieriger zu überblicken, logische Probleme Verteilte Programmierung • Remote Method Invocation • Rechnen auf mehr als einem Computer Christian Scheible Java für Computerlinguisten 31. Juli 2009 27 / 33 Was haben wir nicht gemacht? JavaBeans • Standardisierung von Objekten • Ähnlich wie UIMA-Deskriptoren, nur nicht nur für NLP NetBeans • Entwicklungsumgebung von Sun • Editor für Swing Grafikprogrammierung • 2D-Zeichnen Christian Scheible Java für Computerlinguisten 31. Juli 2009 28 / 33 Was haben wir nicht gemacht? Andere Verteilungsformen • Applikation: User benutzt ein Programm auf seinem Rechner • Applet: Programm läuft auf einer Webseite im Browser • Web Start: Programm wird automatisch aus dem Internet geladen und ausgeführt Verbindungen zu anderen Sprachen • Python (Jython) • Ruby (JRuby) Christian Scheible Java für Computerlinguisten 31. Juli 2009 29 / 33 Christian Scheible Java für Computerlinguisten 31. Juli 2009 30 / 33 Was haben wir nicht gemacht? Viel Üben! • Der einzige Weg, eine Sprache zu beherrschen. JAVA Christian Scheible Java für Computerlinguisten 31. Juli 2009 31 / 33 Christian Scheible Java für Computerlinguisten 31. Juli 2009 32 / 33 Literatur Sun. JDK 6 Documentation. http://java.sun.com/javase/6/docs/. Sun. The Java Tutorials. http://java.sun.com/docs/books/tutorial/. C. Ullenboom. Java ist auch eine Insel. Galileo Press, 2003. http://openbook.galileocomputing.de/javainsel8/. Christian Scheible Java für Computerlinguisten 31. Juli 2009 33 / 33