Benutzeroberflächen Java Teil 4
Einleitung Eine grafische Benutzeroberfläche (Graphical User Interface) ermöglicht dem Benutzer die Interaktion mit dem Computer über grafische Symbole. Die GUI haben in der Breite die auf Zeichen basierenden Schnittstellen (Command Line Interface) abgelöst. Die Elemente einer grafischen Benutzeroberfläche reagieren auf Ereignisse, z. B. auf einen Mausklick. Das Konzept der GUIs wurde 1970 entworfen. Einen großen Anwenderkreis erreichte das Konzept 1983 mit dem Apple Lisa. 1985 wurde eine erste grafische Benutzerschnittstelle von Microsoft (Windows 1.03) auf den Markt gebracht. Die Anforderungen an GUIs sind genormt nach EN ISO 9241. 2
Anforderungen Nach EN ISO 9241 muss eine grafische Benutzerschnittstelle folgende Merkmale aufweisen: Sie muss der Aufgabe angemessen sein. Sie muss selbstbeschreibend sein. Sie muss individualisierbar sein. Sie muss lernförderlich sein. Sie muss steuerbar sein. Sie muss fehlertolerant sein. Die GUI hat die Aufgabe, Anwendersoftware mit Hilfe von Steuerelementen (Widgets) bedienbar zu machen. 3
Bibliotheken Java kennt für grafische Benutzerschnittstellen verschiedene Bibliotheken. Zu diesen Bibliotheken gehören: AWT - Abstract Window Toolkit Swing - Standard Widget Toolkit - Entwicklung von Sun - enthält das AWT SWT - Entwicklung von IBM für Eclipse, basierend auf Swing GWT - Google Web Toolkit GTK+ - GIMP Toolkit 4
Programmierung Die Programmierung einer grafischen Benutzeroberfläche kann auf zwei Wegen erfolgen: manuell (alle Eigenschaften der grafischen Oberflächen werden manuell programmiert) automatisiert (das Anlegen grafischer Objekte und ihrer Eigenschaften erfolgt über Drag & Drop mittels einer geeigneten IDE) Am Beispiel der folgenden Aufgabenstellung sollen beide Varianten vorgestellt werden: Eine grafische Benutzeroberfläche soll aus einem Fenster mit der Überschrift "Umrechnung" bestehen. Im Fenster soll in ein Textfeld eine Temperatur in C eingetragen werden. In einem zweiten Textfeld soll der umgerechnete Wert angezeigt werden. Durch Klicken auf einen Button soll die Umrechnung der Temperatur in Grad Fahrenheit durchgeführt werden und die Ausgabe in das zweite Textfeld erfolgen. Die grafische Oberfläche soll als Swing - Oberfläche programmiert werden. Eine Behandlung möglicher Fehler soll noch nicht erfolgen. Die Umrechnung von C in F erfolgt mittels der Gleichung F = C * 1,8 + 32. 5
Programmierung Variante 1: Manuelle Programmierung einer Swing - Oberfläche Schritt 1: Anlegen einer Klasse, die von der Klasse JFrame abgeleitet ist import javax.swing.jframe; public class WindowForm extends JFrame In dieser Klasse sollen die Eigenschaften der zukünftigen Benutzeroberfläche abgelegt werden. 6
Programmierung Schritt 2: Deklarierung der benötigten grafischen Objekte import javax.swing.jframe; import javax.swing.jbutton; import javax.swing.jtextfield; public class WindowForm extends JFrame JTextField jtextfield_tempgc, jtextfield_tempgf; JButton jbutton_umrechnen; 7
Programmierung Schritt 3: Programmierung einer Methode, in der die Objekte instanziert und positioniert werden public class WindowForm extends JFrame private void init() //Instanzierung der Objekte jtextfield_tempgc = new JTextField(); jtextfield_tempgf = new JTextField(); //Instanzierung des Buttons einschließlich der Beschriftung jbutton_umrechnen = new JButton("Umrechnung"); //Positionierung und Größe festlegen jtextfield_tempgc.setbounds(10, 10, 200, 25); jtextfield_tempgf.setbounds(10, 40, 200, 25); jbutton_umrechnen.setbounds(10, 70, 200, 25); //Anmelden am Fenster this.getcontentpane().add(jtextfield_tempgc); this.getcontentpane().add(jtextfield_tempgf); this.getcontentpane().add(jbutton_umrechnen); //Anpassen der Fenstergröße an den zur Darstellung erforderlichen Platz this.pack(); 8
Programmierung Schritt 4: Standardkonstruktor ändern - Layout festlegen und Fenster aufrufen (durch init()) public class WindowForm extends JFrame... public WindowForm() this.getcontentpane().setlayout(null); this.init(); 9
Programmierung Schritt 5: Anlegen einer ausführbaren Klasse und Instanzierung der Fensterklasse package gui; import javax.swing.jframe; public class GUI_1 extends JFrame public static void main(string[] args) // Deklarierung und Instantierung der "Fensterklasse" WindowForm mywindow = new WindowForm(); //notwendig um Fenster und Programm zu schließen (nur bei Swing) mywindow.setdefaultcloseoperation(exit_on_close); //Festlegung der Fensterposition und Fenstergröße mywindow.setbounds(100, 100, 235, 150); mywindow.settitle("umrechnung"); //Ausschalten der Größenänderungsfunktion mywindow.setresizable(false); //Anzeigen des Fensters mywindow.setvisible(true); 10
Programmierung Schritt 6: Programm simulieren Die Klasse GUI_1 wird simuliert um die Darstellung des Fensters zu testen. 11
Programmierung Schritt 7: Programmcode generieren, der den Button auf Anklicken reagieren lässt Damit der Button auf das Anklicken reagieren kann muss erkannt werden, ob der Button überhaupt angeklickt wurde. Diese Prüfung geschieht hier durch die Abfrage der "ActionCommand - Eigenschaft". Durch Anklicken des Buttons wird eine Zeichenkette "umrechnen" geliefert, dadurch werden die Anweisungen innerhalb des if - Funktionsblocks ausgeführt. if(jbutton_umrechnen.getactioncommand().equals("umrechnen")) //TODO Anweisungen, die nach dem Anklicken ausgeführt werden sollen Die Kommandozeichenkette wird dem Button über die Anweisungszeile jbutton_umrechnen.setactioncommand("umrechnen"); zugewiesen. Nun muss der Button nur noch für den ActionListener registriert werden. Dies geschieht durch die Anweisungszeile jbutton_umrechnen.addactionlistener(new Actionlauscher());. 12
Programmierung Schritt 8: Programmcode generieren, der die Temperaturumrechnung ausführt Notwendiger Ablauf: Abfrage des Inhaltes des Textfeldes jtextfield_tempgc Berechnung Übergabe an das Textfeld jtextfield_tempgf Für die Berechnung werden zwei double-variablen benötigt. Diese werden am Anfang der Klasse WindowForm deklariert. if(jbutton_umrechnen.getactioncommand().equals("umrechnen")) //Abfrage des Textfeldinhaltes und Übergabe an Rechenvariable tempgc = Double.parseDouble(jtextfield_tempGC.getText()); //Berechnung tempgf = (tempgc * 1.8) + 32; //Übergabe an das Ausgabetextfeld jtextfield_tempgf.settext(tempgf + " F"); 13
Quelltexte Klasse WindowForm package gui; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jtextfield; public class WindowForm extends JFrame private static final long serialversionuid = 1L; JTextField jtextfield_tempgc, jtextfield_tempgf; JButton jbutton_umrechnen; 14
Quelltexte Klasse WindowForm private void init() //Instanzierung der Objekte jtextfield_tempgc = new JTextField(); jtextfield_tempgf = new JTextField(); //Instanzierung des Buttons einschließlich der Beschriftung jbutton_umrechnen = new JButton("Umrechnung"); //Positionierung und Größe festlegen jtextfield_tempgc.setbounds(10, 10, 200, 25); jtextfield_tempgf.setbounds(10, 40, 200, 25); jbutton_umrechnen.setbounds(10, 70, 200, 25); //Anmelden am Fenster this.getcontentpane().add(jtextfield_tempgc); this.getcontentpane().add(jtextfield_tempgf); this.getcontentpane().add(jbutton_umrechnen); //Anpassen der Fenstergröße an den zur Darstellung erforderlichen Platz this.pack(); //Festlegen eines Erkennungsstrings für das Anklicken des Buttons jbutton_umrechnen.setactioncommand("umrechnen"); //Anmelden am Actionlistener jbutton_umrechnen.addactionlistener(new Actionlauscher()); 15
Quelltexte Klasse WindowForm public WindowForm() this.getcontentpane().setlayout(null); this.init(); class Actionlauscher implements ActionListener @Override public voidactionperformed(actionevent arg0) // TODO Auto-generated method stub if(jbutton_umrechnen.getactioncommand().equals("umrechnen")) //Abfrage des Textfeldinhaltes und Übergabe an Rechenvariable tempgc = Double.parseDouble(jtextfield_tempGC.getText()); tempgf = (tempgc * 1.8) + 32; //Berechnung //Übergabe an das Ausgabetextfeld jtextfield_tempgf.settext(tempgf + " F"); //end of class ActionLauscher //end of class WindowForm 16
Quelltexte Klasse GUI_1 package gui; import javax.swing.jframe; public class GUI_1 extends JFrame private static final long serialversionuid = 1L; public static void main(string[] args) // Deklarierung und Instantierung der "Formatierungsklasse" WindowForm mywindow = new WindowForm(); mywindow.setdefaultcloseoperation(exit_on_close); //Festlegung der Fensterposition und Fenstergröße mywindow.setbounds(100, 100, 235, 150); mywindow.settitle("umrechnung"); //Ausschalten der Größenänderungsfunktion mywindow.setresizable(false); //Anzeigen des Fensters mywindow.setvisible(true); //end of main //end of class 17
Beispielfenster Schlussbemerkungen: Auf die Möglichkeit der Eingabe falscher Werte wird noch nicht reagiert. Die Ergebnisausgabe ist noch nicht formatiert. 18