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 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 das ihr bei “Create Main Class” den Haken weg macht, danach klickt ihr auf Finish.
Jetzt macht ihr einen Rechtsklick auf “JFrame Form” wie man es in dem Screenshot sehen kann. Dort wählt ihr en 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 Design Bereich (die graue Box). Ein Label ist etwas wo ihr einen Text ausgeben könnt. Bei einem Text Field könnt der Benutzter eures Programms selber 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 das euer Programm startet sobald ihr mit der Maus auf den Button klickt müsst ihr so vorgehen:
Ihr klickt zunächst auf den Button so das 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 ihr in beiden Fenstern mit OK. Danach wechselt Netbeans automatisch in den Source Modus und ihr sehr 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, Text Feldern 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 Text Feld 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 ä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 Consolen Programmierung.
Wenn wir Variablen Deklarieren möchten machen wir das nach der Zeile:
public class StartKoto extends javax.swing.JFrame { |
public class StartKoto extends javax.swing.JFrame {
Wenn ihr eine Eingabe aus einem Textfeld einlesen möchtet und danach in einer Variablen speichern möchtet macht ihr das so:
Variable = jTextfeld.getText(); |
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 aus zu geben geht wie folgendermaßen vor:
jLabel.setText (Variable); |
jLabel.setText (Variable);
Mit dem jLabel legt ihr fest auf welchem Label euer text ausgegeben werden soll. setText ist wieder dafür da das ihr befehlt das ein Text ausgegeben werden soll. Die Variable welche sich in der () befindet wird dann in dem Label ausgegeben.
Ihr müsst noch beachten das beim einlesen von einem Text aus einem Textfeld der jeweilige Text als String ausgelesen wird. Wenn ihr aber mit Zahlen weiter arbeitet 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 es 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; |
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); |
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 Test Titel 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 Konto Programm sein. Hier soll es möglich sein das 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 seit. 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.
▼ Code anzeigen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
| /*
* 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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
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();
}// </editor-fold>
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
} |
/*
* 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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
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();
}// </editor-fold>
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
}
- 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 ins Minus gehen würde nach der Buchung.
- 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