In diesem Artikel zeige ich euch, wie ihr in Java ein Programm mit einer grafischen Oberfläche schreiben könnt. Dazu müssen wir ein paar Dinge anders machen beim Erstellen eines neuen Projekts.
Zunächst klickt ihr auf File – New File –> New Project –> Bei Categories wählt ihr, wie ihr es schon kennt, Java, und bei Projects lasst ihr auch Java Application. Jetzt ist es aber wichtig, dass ihr bei „Create Main Class“ den Haken wegmacht. Danach klickt ihr auf Finish.
![]()
Jetzt macht ihr einen Rechtsklick auf „JFrame Form“, wie man auf dem Screenshot sehen kann. Dort wählt ihr den Menupunkt New und klickt dort auf Java Class.
![]()
Jetzt seht ihr dieses Fenster. Dort gebt ihr bei Class Name einen Namen ein, wie eure Klasse heißen soll. Ich habe sie jetzt StartKonto genannt.
Jetzt seht ihr einen grauen Kasten. Dies ist eure grafische Oberfläche, wo ihr Buttons, Textfelder und vieles mehr hinzufügen könnt.
Auf der rechten Seite bei der Palette könnt ihr unter dem Menupunkt Swing Controls z. B. Labels oder Textfelder hinzufügen. Dazu zieht ihr die gewünschte Funktion einfach in euren Designbereich (die graue Box). Ein Label ist etwas, wo ihr einen Text ausgeben könnt. Bei einem Textfeld könnte der Benutzer eures Programms selbst eine Eingabe machen.
Für den Anfang ist der Button noch eine wichtige Funktion. Diesen könnt ihr z. B. zum Starten eures Programms verwenden.
Wenn ihr jetzt z. B. möchtet, dass euer Programm startet, sobald ihr mit der Maus auf den Button klickt, müsst ihr so vorgehen:
Ihr klickt zunächst auf den Button, sodass er markiert ist. Danach geht ihr auf der rechten Seite bei den Properties auf „Events“. Dort scrollt ihr nach unten, bis ihr „mouseClicked“ seht. Wenn ihr das gefunden habt, klickt ihr auf das …, dann öffnet sich das Fenster Handlers for mouseClicked. Hier betätigt ihr den Button Add … und es geht ein weiteres Fenster auf. Hier gebt ihr einen Namen der Funktion an. Ich habe jetzt mouseClicked gewählt. Diese Eingabe bestätigt sie in beiden Fenstern mit „OK“. Danach wechselt NetBeans automatisch in den Source-Modus und ihr seht den Code. Euer Courser ist dann auch gleich an der stelle wo die Aktion mit dem Mausklick auf den Button durchgeführt wird. Also: alles was ihr dort eingebt, wird ausgeführt, wenn ihr den Button betätigt.
![]()
Wenn ihr von einem eurer Labels, Textfelder etc. den Namen ändern möchtet, geht ihr zunächst wieder in den Design-Modus. Hier geht in denn in das Inspector-Fenster links unten bei Netbeans. Dort macht ihr einen Rechtsklick auf das jeweilige Textfeld bzw. Label. Hier klickt ihr dann auf Change Variable Name. In dem Fenster, was sich anschließend ändert, könnt ihr den Namen eurer Variablen anpassen. Mit einem Rechtsklick auf die Variable könnt ihr auch auf Edit Text gehen, um den Text, welchen ein Label oder eine Textbox anzeigt, zu ändern.
Unterschiede zur Consolen Programmierung:
Hier noch ein paar Hinweise für die Programmierung mit einer grafischen Oberfläche. Denn hier müssen wir bei ein paar Dingen anders vorgehen als bei der Konsolenprogrammierung.
Wenn wir Variablen deklarieren möchten, machen wir das nach der Zeile:
public class StartKoto extends javax.swing.JFrame {
Wenn ihr eine Eingabe aus einem Textfeld einlesen und danach in einer Variablen speichern möchtet, macht ihr das so:
Variable = jTextfeld.getText();
Ihr gebt also zuerst die Variable an, in welcher der Inhalt gespeichert werden soll. Das jTextfeld ist der Name eures Textfeldes und mit dem getText() lest ihr den Text ein.
Um einen Text auf einem Label auszugeben, geht man wie folgt vor:
jLabel.setText (Variable);
Mit dem jLabel legt ihr fest, auf welchem Label euer Text ausgegeben werden soll. setText ist wieder dafür da, dass ihr befehlt, dass ein Text ausgegeben werden soll. Die Variable, welche sich in der () befindet, wird dann in dem Label ausgegeben.
Ihr müsst noch beachten, dass beim Einlesen von einem Text aus einem Textfeld der jeweilige Text als String ausgelesen wird. Wenn ihr aber mit Zahlen weiterarbeiten möchtet, müsst ihr diese dann erst in ein Double oder Int umwandeln. Wie das geht, habe ich in dem Java-Tutorial 5 beschrieben. Wenn ihr diese Zahl dann wieder auf einem Label ausgeben möchtet, müsst ihr sie zunächst wieder in einen String umwandeln.
Damit ihr so eine Textbox wie ihr in dem Screenshot seht ausgeben könnt, müsst ihr zunächst dieses Package importieren.
import javax.swing.JOptionPane;
Dort, wo ihr die Messagebox aufrufen möchtet, fügt ihr diesen Code ein.
JOptionPane.showMessageDialog(null, "Test Messagebox", "Test Titel", JOptionPane.OK_CANCEL_OPTION);
Dort, wo jetzt Test Messagebox steht, könnt ihr das eingeben, was in eurer Messagebox angezeigt werden soll. Bei Testtitel könnt ihr den Text einfügen, was als Überschrift von eurer Textbox angezeigt werden soll.
Jetzt solltet ihr eigentlich in der Lage sein, euer erstes kleines Programm mit einer grafischen Oberfläche zu schreiben. Das Ganze soll ein kleines Kontoprogramm sein. Hier soll es möglich sein, dass ihr über ein Textfeld Geld eingeben könnt, was über einen Button „Buchen“ auf ein virtuelles Konto gebucht wird. Mit 2 Labels sollt ihr den Kontostand anzeigen und in einem 2. Label, wie hoch die letzte Buchung war. Bei dem Konto soll es nicht möglich sein, ins Minus zu gehen. Ihr könnt also maximal so viel Geld abheben, bis ihr wieder bei 0 seid. Wenn man bei einer Buchung ins Minus gehen würde, soll eine Messagebox mit einer Warnung kommen und die Buchung soll nicht durchgeführt werden.
Euer fertiges Programm sollte ca. so aussehen.
[spoiler=Code anzeigen|Code ausblenden]
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* StartKoto.java
*
* Created on 20.07.2009, 17:18:21
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.swing.JOptionPane;
/**
*
* @author Administrator
*/
public class StartKoto extends javax.swing.JFrame {
double kontostand = 0.0;
double letzteBuchung;
double betrag;
String eingabe;
String ausgabe;
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
/** Creates new form StartKoto */
public StartKoto() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
//
private void initComponents() {
jLabBuchung = new javax.swing.JLabel();
jLabKontostand = new javax.swing.JLabel();
jLabEingabe = new javax.swing.JLabel();
jLabAusgabe = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
jTextEingabe = new javax.swing.JTextField();
jLabText = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabBuchung.setFont(new java.awt.Font("Tahoma", 1, 11));
jLabBuchung.setText("Letzte Buchung:");
jLabKontostand.setFont(new java.awt.Font("Tahoma", 1, 11));
jLabKontostand.setText("Kontostand:");
jButton1.setText("Buchen");
jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton1SayHelloClicked(evt);
}
});
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jTextEingabe.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextEingabeActionPerformed(evt);
}
});
jLabText.setFont(new java.awt.Font("Tahoma", 1, 11));
jLabText.setText("Buchung:");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(50, 50, 50)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabText)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(30, 30, 30)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabBuchung)
.addComponent(jLabKontostand)))
.addComponent(jTextEingabe, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(42, 42, 42)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(jLabEingabe, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabAusgabe, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 49, Short.MAX_VALUE))
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE))))
.addContainerGap(74, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(40, 40, 40)
.addComponent(jLabText)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jTextEingabe, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jLabAusgabe, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabKontostand, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(jLabEingabe, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabBuchung, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(98, 98, 98))
);
pack();
}//
private void jButton1SayHelloClicked(java.awt.event.MouseEvent evt) {
eingabe = jTextEingabe.getText();
betrag=Double.parseDouble (eingabe);
if (kontostand+betrag >=0.0)
{
kontostand = kontostand + betrag;
ausgabe = Double.toString (kontostand);
jLabEingabe.setText (eingabe);
jLabAusgabe.setText (ausgabe);
// TODO add your handling code here:
}
else
{
JOptionPane.showMessageDialog(null, "Sie würden bei ihrem Konto ins Minus gehen", "Guthaben zu gering", JOptionPane.OK_CANCEL_OPTION);
}
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void jTextEingabeActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new StartKoto().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabAusgabe;
private javax.swing.JLabel jLabBuchung;
private javax.swing.JLabel jLabEingabe;
private javax.swing.JLabel jLabKontostand;
private javax.swing.JLabel jLabText;
private javax.swing.JTextField jTextEingabe;
// End of variables declaration
}
[/spoiler]
- In den Zeilen 12 bis 14 werden die Packages importiert.
- In den Zeilen 22 bis 26 werden die Variablen deklariert.
- In der Zeile 131 wird der Text aus dem Textfeld eingelesen und in der Variablen Eingabe gespeichert.
- In der Zeile 132 wird der String in ein double umgewandelt und in der Variablen Betrag gespeichert.
- In der Zeile 134 ist eine If-Abfrage welche Abfragt ob der Kontostand nach der Buchung kleiner als 0 wäre.
- In der Zeile 136 wird der aktuelle Buchungsbetrag zu dem Kontostand addiert.
- In der Zeile 137 wird das double in einen String umgewandelt und in der Variablen Ausgabe gespeichert.
- In der Zeile 138 wird der Buchungsbetrag auf dem Label jLabEingabe ausgegeben.
- In der Zeile 139 wird der aktuelle Kontostand auf dem Label jLabAusgabe ausgegeben.
- In der Zeile 142 beginnt der else-Bereich der If-Abfrage. Dieser Bereich wird ausgelöst, wenn der Kontostand nach der Buchung ins Minus gehen würde.
- In der Zeile 144
Die restlichen Teile des Codes sind erst einmal nicht so wichtig, daher gehe ich darauf nicht genauer ein.
Hier geht es zu den bisherigen Teilen der Artikelserie Java:
-
- Java 1: Netbeans, die ersten Schritte und Hello World
- Java 2: Rechnen mit Variablen
- Java 3: Werte einlesen, zwischenspeichern und wieder ausgeben
- Java 4: Kassen Programm mit if Abfrage
- Java 5: Kassen Programm while, do-while Schleife
- Java 6: Kassen Programm For Schleife
- Java 7: Array – Lotto Programm erstellen
- Java 8: Inhalt einer Datei auslesen und filtern
- Java 9: Inhalt einer Textdatei in eine andere Datei kopieren