.: java - grafische programmierung :.
 
abyter.de \\ workshops

<Fortsetzung von letzter Seite

TextField/Label
Bis jetzt haben wir nur mit Buttons gearbeitet. Nun wollen wir zwei neue Komponenten einführen, das TextField und das Label. Ein TextField ist ein einzeiliges Textfeld zur Eingabe von Text. Das Label zeigt nur Text an. Die beiden wichtigsten Methoden sind setText(String str) und getText(), mit dem ersten wird die Beschriftung geändert, mit dem zweiten die Eingabe abgefragt.
Anhand eines Taschenrechners möchte ich nun die Verwendung der neuen Komponenten und der Layout-Manager zeigen:

import java.awt.*;
public class Rechner extends Frame
{
private MyWindowListener myWindowListener = new MyWindowListener();
private MyActionListener myActionListener = new MyActionListener(this);
private Label lblUeberschrift = new Label("Taschenrechner");
private Label lblZahl1 = new Label("1. Zahl");
private Label lblZahl2 = new Label("2. Zahl");
public Label lblErg = new Label("");
public TextField tfZahl1 = new TextField(10);
public TextField tfZahl2 = new TextField(10);
public Button btnBeenden = new Button("Beenden");
public Button btnPlus = new Button("+");
public Button btnMinus = new Button("-");
public Button btnMal = new Button("X");
public Button btnDiv = new Button("/");
private Panel pnlNorth = new Panel();
private Panel pnlCenter = new Panel(new GridLayout(3,1));
private Panel pnlSouth = new Panel(new GridLayout(1,0));
private Panel pnlCenterZeile1 = new Panel(new FlowLayout(FlowLayout.LEFT));
private Panel pnlCenterZeile2 = new Panel(new FlowLayout(FlowLayout.LEFT));
public Rechner()
{
super("Taschenrechner.");
this.lblUeberschrift.setFont(new Font("",Font.BOLD,16));
this.pnlNorth.add(lblUeberschrift);
this.pnlCenterZeile1.add(this.lblZahl1);
this.pnlCenterZeile1.add(this.tfZahl1);
this.pnlCenterZeile2.add(this.lblZahl2);
this.pnlCenterZeile2.add(this.tfZahl2);
this.pnlCenter.add(this.pnlCenterZeile1);
this.pnlCenter.add(this.pnlCenterZeile2);
this.pnlCenter.add(this.lblErg);
this.pnlSouth.add(this.btnPlus);
this.pnlSouth.add(this.btnMinus);
this.pnlSouth.add(this.btnMal);
this.pnlSouth.add(this.btnDiv);
this.pnlSouth.add(this.btnBeenden);
this.add(pnlNorth, BorderLayout.NORTH);
this.add(pnlCenter, BorderLayout.CENTER);
this.add(pnlSouth, BorderLayout.SOUTH);
this.pack();
this.show();
this.addWindowListener(this.myWindowListener);
this.btnPlus.addActionListener(myActionListener);
this.btnMinus.addActionListener(this.myActionListener);
this.btnMal.addActionListener(this.myActionListener);
this.btnDiv.addActionListener(this.myActionListener);
this.btnBeenden.addActionListener(this.myActionListener);
}

public static void main(String args[])
{
Rechner f = new Rechner();
}
}

Wie im Quelltext zu sehen ist, wir das Label folgendermaßen erzeugt: Label(String str), das TextField wird folgendermaßen erzeugt: TextField(int length). Beim Label wird die Beschriftung als Parameter eingetragen und beim TextField die erlaubte Höchstmenge an Zeichen die eingegeben werden dürfen.
Wie beim vorherigen Projekt wird auch beim Taschenrechner das Frame in drei Panels unterteilt. Das mitterlere Panel wird nochmals in zwei Panels unterteilt - CenterZeile1 und CenterZeile2 - die untereinander angeordnet werden. So kann man das BorderLayout und das FlowLayout kombinieren, um die Beschriftung und das TextField perfekt zu positionieren. Für die Überschrift wird mit der Font-Anweisung eine besondere Schriftgestaltung gewählt: Fett und 16 pt groß.
Aufmerksamen wird aufgefallen sein, dass wir diesmal gar nicht die Größe des Frame angegeben haben. Richtig, dafür gibt es aber das Schlüsselwort .pack() dass die Größe des Frame den Dimensionen der Komponenten anpasst. Der Frame wird also ohne ellenlanges Probieren automatisch perfekt dimensioniert.
Noch aber fehlt der ActionListener, hier nun der Quelltext:

MyActionListener.java
import java.awt.event.*;
import java.text.*;
public class MyActionListener implements ActionListener
{
public Rechner f;
public MyActionListener(Rechner f)
{
this.f=f;
}

public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
if(obj == f.btnBeenden)System.exit(0);
Decimal Format df = new DecimalFormat("#,##0.0");
double ergebnis=0;
double zahl1=0;
double zahl2=0;
try
{
zahl1=Double.parseDouble(f.tfZahl1.getText().replace(',','.'));
zahl2=Double.parseDouble(f.tfZahl2.getText().replace(',','.'));
if(obj==f.btnPlus) ergebnis=zahl1+zahl2;
else if(obj==f.btnMinus) ergebnis=zahl1-zahl2;
else if(obj==f.btnMal) ergebnis=zahl1*zahl2;
else if(obj==f.btnDiv) ergebnis=zahl1/zahl2;
f.lblErg.setText("Ergebnis: "+df.format(ergebnis));
}
catch(NumberFormatException error)
{
f.lblErg.setText("Fehler bei Eingabefeld...");
}
}
}

Damit man auf die Komponenten der Klasse Rechner zugreifen kann, müssen wir ein Objekt der Klasse Rechner mit dem Namen f erstellen. Über dieses Objekt laufen alle Aktionen mit dem Frame.
Mit dem Objekt obj der Klasse Object kann man mittels e.getSource den Sender (also die Komponente die eine Action ausgelöst hat) feststellen.
Mit der Klasse DecimalFormat kann man Text sehr ansprechend formatieren. In unserem Beispiel sorgt DecimalFormat für Tausenderpunkte und zwei Nachkommastellen.
Der Taschenrechner merzt einen häufig gemachten Fehler aus: Da Java eine amerikanische Programmiersprache ist, unterliegt sie den dortigen Standards und in Amerika verwendet man kein Komma sondern einen Punkt um die Nachkommastellen von der Zahl zu trennen. Mit .replace wird das Komma einfach durch einen Punkt ersetzt, ansonsten könnte man mit Kommazahlen (mit Komma als Trennzeichen) nicht in Java rechnen.
Und so sieht unser Machwerk aus:

Taschenrechner

TextArea
Soeben haben wir zwei neue Komponenten eingeführt. Damals hatte ich schon erwähnt, dass ein TextField ein einzeiliges Textfeld zur Eingabe von Text ist. Nun was wird nun also kommen? Genau! Ein mehrzeiliges Textfeld zur Eingabe von Text. Dieses mehrzeilige Textfeld nennt sich TextArea.
Für die TextArea gibt es folgenden Kontruktor: TextArea(String text, int zeilen, int spalten, int scrollbars)
Hier gilt, dass man keinen text angeben muss, auch kann man die zeilen und spalten weglassen, dann gibt man der TextArea jedoch gar keine Angabe wie sie aussehen soll. Als scrollbars kommen TextArea.SCROLLBARS_BOTH, SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_NONE und SCROLLBARS_VERTICAL_ONLY in Frage.
Es gibt eine Vielzahl an Methoden, die wichtigsten sind jedoch append und insert. append fügt einen Text ans Ende des Textes ein und wird folgendermaßen definiert: void append(String text)
insert fügt einen String an einer eingegebenen Position ein und wird so definiert: void insert(String text, int pos)
Diesmal möchte ich einen kleinen Texteditor als Beispiel zur Verdeutlichung programmieren. So sieht dessen Quelltext aus:

import java.awt.*;

public class TEditor extends Frame
{
private MyWindowListener myWindowListener = new MyWindowListener();
private MyActionListener myActionListener = new MyActionListener(this);
private Label lblOeffnen = new Label("Datei öffnen:");
private Label lblSpeichern = new Label ("Speichern unter");
public TextField tfOeffnen = new TextField(20);
public TextField tfSpeichern = new TextField(20);
public TextArea taText = new TextArea(15,50);
public Button btnBeenden = new Button("Beenden");
public Button btnOeffnen = new Button("Öffnen");
public Button btnSpeichern = new Button("Speichern");
private Panel pnlNorth = new Panel();
public TEditor()
{
super("Text Editor");
this.pnlNorth.add(this.lblOeffnen);
this.pnlNorth.add(this.tfOeffnen);
this.pnlNorth.add(this.btnOeffnen);
this.pnlNorth.add(this.lblSpeichern);
this.pnlNorth.add(this.tfSpeichern);
this.pnlNorth.add(this.btnSpeichern);
this.add(this.pnlNorth, BorderLayout.NORTH);
this.add(this.taText, BorderLayout.CENTER);
this.add(this.btnBeenden, BorderLayout.SOUTH);
this.pack();
this.show();
this.addWindowListener(this.myWindowListener);
this.btnOeffnen.addActionListener(myActionListener);
this.btnSpeichern.addActionListener(this.myActionListener);
this.btnBeenden.addActionListener(this.myActionListener);
}

public static void main(String args[])
{
TEditor f = new TEditor();
}
}
MyActionListener.java
import java.awt.event.*;
import java.io.*;

public class MyActionListener implements ActionListener
{
public TEditor f;

public MyActionListener(TEditor f)
{
this.f=f;
}

public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
if(obj == f.btnOeffnen)
{
try
{
String zeile=null;
BufferedReader in = new BufferedReader(new InputStreamReader(new ¬ FileInputStream(f.tfOeffnen.getText())));
while((zeile=in.readLine())!=null)
f.taText.append(zeile+"\n");
in.close();
}
catch(FileNotFoundException err)
{
System.out.println("Datei nicht gefunden"+err);
}
catch(IOException err)
{
System.out.println("Lesefehler"+err);
}
}
if(obj==f.btnSpeichern)
{
try
{
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new ¬ FileOutputStream(f.tfSpeichern.getText())));
out.write(f.taText.getText());
out.close();
}
catch(FileNotFoundException err)
{
System.out.println("Fehler beim Speichern"+err);
}
catch(IOException err)
{
System.out.println("Schreibfehler..."+err);
}
}
if(obj==f.btnBeenden)System.exit(0);
}
}

Die MyActionListener-Klasse ist verantwortlich für die Dateioperationen (Öffnen, Speichern) des Programms.
Für Leute, die das Programm durch abtippen nachvollziehen wollen, sei darauf hingewiesen, dass mit (¬) markierte Zeilen im Programm nicht umgebrochen werden müssen! Leider haben die Anweisungen nur so auf die Website gepasst!
So sieht der Editor dann aus:

Texteditor

Der TextEditor arbeitet wirklich einwandfrei. Man kann ihn auch durch das Laden große Dateien (io.sys(108 KB)) nicht aus der Ruhe bringen, auch wenn es eine Ewigkeit dauert bis die Datei angezeigt wird.

Weiter auf der nächsten Seite >

Related Workshops: Allgemeines \\ Java Einführung \\ Arbeit mit dem JCreator \\ Programmieren mit Java \\ Programmiergrundlagen \\ Klassen-Grundlagen \\ Datenbankprogrammierung
Related Files: JCreator LE

Workshop als PDF

<Zurück

© by www.abyter.de (Martin Monshausen)