[an error occurred while processing this directive]
Rheinland-Pfalz;
Informatik
Letzte Aktualisierung: 21.9.2008; Claus Schmitt
![]() |
Startseite Informatik-Rheinland-Pfalz |
Aufrufe seit 13.8.2008
Die Vorlage von Herrn Greulich (Uni Koblenz) wurde von mir leicht angepasst; den ursprünglichen Text lesen Sie unter; vgl.auch Quelle. Vgl. bitte auch den Quelltext für das DM_in_Euro-Problem, wenn man die GUI mit dem Plugin Jigloo automatisiert erzeugt; ebenso die Synopse der Quelltexte.
Im Folgenden wird gezeigt, wie man eine einfache Java-GUI (Graphical User Interface) mit Swing erstellen kann, z.B. um Werte an ein Rechenprogramm zu übergeben (hier z.B. Umrechnung von DM in Euro). Das FensterEine neue Klasse erstellenUm die GUI zu implementieren, erstellt man erstmal eine neue Klasse, die von JFrame ableitet. Eclipse ist ja so freundlich einem dabei zu helfen, rauskommen sollte sowas hier: import javax.swing.JFrame; public class AppWindow extends JFrame { } Das LayoutSwing bietet einem diverse sog. Layout-Manager, die dabei helfen, die Elemente der GUI sinnvoll anzuordnen und es ermöglichen, dass Fenster auch dann noch gut benutzbar sind, wenn die Größe verändert wird. Darauf gehe ich nicht ein, da das hier zu weit führt. Wir benutzen keinen Layout-Manager, sondern geben die Positionen der Elemente im Quellcode an. Also geben wir im Constructor das Layout "null" (also nix) an und rufen noch eine zu erstellende Funktion auf, die dafür zuständig sein wird, die Elemente des Fensters zu instanzieren und zu initialisieren: public AppWindow() { this.getContentPane().setLayout(null); this.initWindow(); } Die ElementeFür die einfache GUI des Programms "DM2Euro" brauchen wir: ein Texteingabefeld, in das der DM-Wert eingegeben werden soll und ein Texteingabefeld, das hier zur Ausgabe genutzt wird und das Ergebnis (also den Euro-Wert) aufnimmt. Die Texteingabefelder sind Objekte der Klasse JTextField, der Button ist ein Objekt der Klasse JButton. Frisch ans Werk: Als Klassenvariablen, also direkt unter public class AppWindow extends JFrame {definieren wir die Objekte:
JTextField textfield_dm; JTextField textfield_euro; JButton button, button_exit; In der Methode initWindow() werden diese Objekte instanziert und die Positionen festgelegt. protected void initWindow() { // Instanzieren: textfield_dm = new JTextField(); textfield_euro = new JTextField(); // Hier auch gleich die Beschriftung des Buttons mit angeben: button = new JButton("DM in Euro"); button_exit = new JButton("Ende"); Die Methode setBounds(...) nimmt vier int-Parameter entgegen: x-Position, y-Postition (für die linke obere Ecke), Breite und Höhe:
// Positionen festlegen
textfield_dm.setBounds(5,10,400,25);
textfield_euro.setBounds(5,80,400,25);
button.setBounds(300,110,100,30);
button_exit.setBounds(300, 110, 100, 30);
Dann müssen wir die Elemente nur noch dem Fenster hinzufügen ...
// Elemente dem Fenster hinzufügen:
// (this ist ein Zeiger auf dieses Objekt, also das Fenster)
this.getContentPane().add(textfield_dm);
this.getContentPane().add(textfield_euro);
this.getContentPane().add(button);
this.getContentPane().add(button_exit);
// Das kommt ganz am Ende:
this.pack();
}
Nun haben wir die Elemente dem Fenster hinzugefügt. Das bringt uns aber noch nicht so viel, ein Klick auf den Button würde nichts bewirken. Wir brauchen einen sog. ActionListener, den wir auch in initWindow() einbauen. Der ActionListener ist dafür zuständig sog. ActionEvents zu empfangen. Wir möchten natürlich mitbekommen, wenn der Benutzer den Button anklickt. Würden wir den ActionListener nicht hinzufügen, könnte der Nutzer solange auf den Knopf drücken wie er wollte, es würde nichts passieren. Wenn wir aber den ActionListener hinzufügen, dann wird die Methode actionPerformed(...) immer dann ausgeführt, wenn der User auf den Button klickt. Weitere Infos finden Sie hier: Learning Swing by Example button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { buttonBerechneClicked(); } }); Entsprechend gehen wir beim Ende-Knopf vor: button_exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { System.exit(0); } }); Dies fügt dem Button einen neuen ActionListener hinzu. Die Methode actionPerformed() wird aufgerufen, wenn der Benutzer den Button anklickt. actionPerformed() wiederrum tut nichts anderes, als die Methode buttonBerechneClicked() aufzurufen, die wir der Einfachheit halber auch direkt in der Klasse implementieren (würde man bei "richtigen" Projekten meist anders machen, hier ist das aber zu vertreten). public void buttonBerechneClicked() { double dm = 0; Hier haben wir einen Try-Catch-Block, der Fehleingaben abfängt, falls z.B. textfield_dm.getText() einen String liefert, der sich nicht in eine Zahl übersetzen lässt. Wenn die Umwandlung fehlschlägt (also das "try" eine Exception auslöst), wird der Code im "catch"-Block ausgeführt. In diesem Fall wird dm einfach auf -1 gesetzt. Da negative Geldbeträge nicht vorgesehen sind, können wir so später eine Fehlerausgabe machen, wenn dm negativ ist: // Hole Zahl aus Textfeld: try { dm = Double.parseDouble(textfield_dm.getText()); } catch (NumberFormatException e) { // TODO Auto-generated catch block dm = -1; } Dann eine Fallunterscheidung, nur wenn dm > oder = 0 ist, wird das Ergebnis berechnet, ansonsten eine Fehlermeldung ausgegeben: // Falls das n Okay ist: if (dm>=0) { // Rechne: double euro = this.dm2euro(dm); Die Berechnungsfunktion dm2euro(...) findet sich im Komplett-Quelltext weiter unten. // Packe a in Ausgabefeld, und zwar formatiert: // Dies ist nur für die Formatierung (x.xx) zuständig: NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); Die Formatierung sorgt nur dafür, dass man sinnvolle Euro-Beträge herausbekommt, also mit zwei Stellen hinter dem Komma. nf.format(...) gibt einen String zurück. String ausgabe = nf.format(euro); // Der String wird hier ins Feld geschrieben: textfield_euro.setText(ausgabe); } else { textfield_euro.setText("Eingabe ist nicht in Ordnung."); } } Der folgende Eingabefehler wird also abgefangen, ohne das das Programm abstürzt: Das war's eigentlich schon. ___________________________________________________________________________________________ Nun müssen wir in der Hauptklasse (dort wo die Methode static void main ist) noch das Fenster aufrufen: public class Tutorial_1 { /** * @param args */ public static void main(String[] args) { AppWindow theAppWindow = new AppWindow(); theAppWindow.setBounds(10, 10, 420, 180); theAppWindow.show(); } } Wer mag, kann ja das Programm ein wenig schöner
machen und z.B. Überschriften für die Eingabefelder einbauen Erscheint jetzt vielleicht recht umfangreich, aber man kann sowas ja wiederverwenden und von Fall zu Fall anpassen. Es gibt auch GUI-Builder, die einem da viel Arbeit abnehmen, z.B. Netbeans oder auch Plugins für Eclipse. Quellcode komplett:
|
Klaus L. Greulich ; Universität Koblenz; Tutorial: Eine einfache Java GUI Herrn Dr. A. Winter
/ Universität
Mainz
/ Fachbereich Informatik bin ich
für die Durchsicht der Vorlage und die
hilfreichen
|
![]() |
Startseite Informatik-Rheinland-Pfalz |