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

<Fortsetzung von letzter Seite

FileDialog
Der Texteditor hat ja schon ganz gut funktioniert. Leider war das Öffnen und Speichern alles andere als komfortabel, da man den Pfad der Datei immer von Hand eingeben musste. Das wollen wir nun mit der Einführung einer neuen Komponente einfacher gestalten. Die Komponente heißt FileDialog und erzeugt die bekannten Öffnen- und Speichern-Dialoge die einem fast jedes Programm anzeigt.
Der FileDialog hat folgenden Konstruktor: FileDialog(Frame parent, String title, int mode)
Wie man sieht muss im Konstruktor ein Verweis auf den Frame gemacht werden, damit dessen Aktionen (größer, kleiner und schließen) von dem FileDialog mit gemacht werden können. Dieser Verweis wird mit Frame parent gemacht. Den Titel des Fensters könnte man noch mittels title ändern. Mit mode kann man den Modus Öffnen oder Speichern, den der Dialog abbilden soll, angeben. Öffnen lässt sich mittels FileDialog.LOAD einstellen und Speichern mittels FileDialog.SAVE
Die wichtigsten Methoden der FileDialog-Klasse sind setDirectory, setFile, getDirectory, getFile. Mit setDirectory wird ein vorgegebener Pfad gesetzt, mit setFile wird ein vorgegebener Dateinamen gesetzt, bzw. ein Filter (*.txt) gesetzt, mit getDirectory wird der ausgewählte Pfad (Verzeichnis) zurückgegeben und mit getFile der ausgewählte Dateiname, falls der Benutzer "Abbrechen" gedrückt hat, ist der Rückgabewert für Dateiname und Verzeichnis null. Die Methoden sind folgendermaßen aufgebaut:

public void setDirectory(String dir)
public void setFile(String file)
public String getDirectory()
public String getFile()

Hier nun nochmals das Beispiel TextEditor von eben, jedoch mit dem FileDialog:

import java.awt.*;
public class TEditor2 extends Frame
{
private MyWindowListener myWindowListener = new MyWindowListener();
private MyActionListener myActionListener = new MyActionListener(this);
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 TEditor2()
{
super("Text Editor Version 2");
this.pnlNorth.add(this.btnOeffnen);
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[])
{
TEditor2 f = new TEditor2();
}
}

Wie Sie sehen, sehen Sie nichts! In der Hauptklasse taucht der FileDialog überhaupt nicht auf. Diese Komponente kommt erst jetzt in MyActionListener zum Einsatz:

MyActionListener.java

import java.awt.event.*;
import java.awt.*;
import java.io.*;

public class MyActionListener implements ActionListener
{
public TEditor2 f;

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

public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
if(obj == f.btnOeffnen)
{
FileDialog fd = new FileDialog(f,"Öffnen",FileDialog.LOAD);
fd.setFile("*.txt");
fd.show();
String file = fd.getDirectory()+fd.getFile();
if(fd.getFile()!=null)
{
BufferedReader in =null;
f.taText.selectAll();
f.taText.replaceRange("",f.taText.getSelectionStart(), ¬
f.taText.getSelectionEnd());
try
{
String zeile=null;
in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
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)
{
FileDialog fd = new FileDialog(f,"Speichern",FileDialog.SAVE);
fd.setFile("*.txt");
fd.show();
String file = fd.getDirectory()+fd.getFile();
if(fd.getFile()!=null)
{
BufferedWriter out =null;
try
{
out = new BufferedWriter(new OutputStreamWriter(new ¬ FileOutputStream(file)));
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);
}
}

Hier nun sieht man den FileDialog mit den angesprochenen Methoden im Einsatz. Außerdem wird vor jedem Laden die TextArea gesäubert (replaceRange). Ansonsten entspricht das Programm TEditor.
So sieht das Programm nun aus:

FileDialog in Aktion

Checkbox
Eine Checkbox ist die einfachste Möglichkeit, eine Ja/Nein-Auswahl vom Benutzer zu erhalten. Dabei ist der Begriff 'Checkbox' etwas irreführend, Kenner werden den Unterschied zwischen einer Checkbox und Radio-Buttons kennen, allen anderen sei gesagt, dass man beliebig viele Checkboxen ankreuzen kann, jedoch immer nur einen Radio-Button. Java scheint den Unterschied zumindestens im Namen nicht zu kennen, denn eine CheckboxGroup macht aus Checkboxen Radio-Buttons.
So ist der Konstruktor aufgebaut:
Checkbox(String label, CheckboxGroup group, boolean state)

Das Label wir immer rechts von der Checkbox angezeigt, die CheckboxGroup macht die Checkboxen zu Radio-Buttons und mit dem state kann man schon beim Entwurf festlegen, ob die Checkbox angekreuzt ist.
Unser Beispiel soll einen vom Benutzer eingegebenen Text formatieren, dabei soll der Benutzer ankreuzen können ob der Text fett oder/und kursiv ist und wie groß der Text werden soll. Und so sieht der Quelltext aus:

import java.awt.*;
import java.awt.event.*;
public class TFormat extends Frame
{
public Checkbox cb1 = new Checkbox("fett");
public Checkbox cb2 = new Checkbox("kursiv");
public CheckboxGroup cbg = new CheckboxGroup();
public Checkbox cb3 = new Checkbox("14 pt",cbg,false);
public Checkbox cb4 = new Checkbox("16 pt",cbg,false);
public TextField tf1 = new TextField(20);
public Label lblDisplay = new Label("");
public Button btnFormat = new Button("Formatieren");
public Panel pnlNorth = new Panel(new GridLayout(1,2));
public Panel pnlCenter = new Panel(new FlowLayout(FlowLayout.LEFT));
public Panel pnlSouth = new Panel(new BorderLayout());
public Panel pnlNorthL = new Panel(new FlowLayout(FlowLayout.LEFT));
public Panel pnlNorthR = new Panel(new FlowLayout(FlowLayout.RIGHT));
private MyWindowListener myWindowListener = new MyWindowListener();
private MyActionListener myActionListener = new MyActionListener(this);

public TFormat()
{
super("Text-Formatierung");
this.pnlNorthL.add(this.cb1);
this.pnlNorthL.add(this.cb2);
this.pnlNorthR.add(this.cb3);
this.pnlNorthR.add(this.cb4);
this.pnlNorth.add(this.pnlNorthL);
this.pnlNorth.add(this.pnlNorthR);
this.pnlCenter.add(this.tf1);
this.pnlCenter.add(this.btnFormat);
this.pnlSouth.add(this.lblDisplay);
this.add(this.pnlNorth,BorderLayout.NORTH);
this.add(this.pnlCenter,BorderLayout.CENTER);
this.add(this.pnlSouth,BorderLayout.SOUTH);
this.pack();
this.show();
this.addWindowListener(this.myWindowListener);
this.btnFormat.addActionListener(myActionListener);
}

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

MyActionListener.java

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

public void actionPerformed(ActionEvent e)
{
Object obj = e.getSource();
int style;
style = 0;
int size;
size = 12;
if(obj == f.btnFormat)
{
if(f.cb1.getState()==true)
{
style = 1;
}
if(f.cb2.getState()==true)
{
style = 2;
}
if(f.cb3.getState()==true)
{
size = 14;
}
if(f.cb4.getState()==true)
{
size = 16;
}
String text;
text = f.tf1.getText();
f.lblDisplay.setFont(new Font("",style,size));
f.lblDisplay.setText(text);
}
}
}

Das einzig neue an diesem Quelltext ist die Verwendung der Methode getState(), damit wird überprüft, ob die Checkbox angekreuzt ist. So sieht unser Machwerk aus:

Textformatierungen

Man könnte das Problem aber auch anders angehen und die Formatierung des Textes direkt nach dem Ankreuzen durchführen (also ohne Button-Einsatz). Dafür gibt es den ItemListener. Dieser verarbeitet z.B. Checkboxereignisse und wird in der Hauptklasse so eingesetzt wie der ActionListener. Die Klasse MyItemListener implementiert die Schnittstelle ItemListener:
public class MyItemListener implements ItemListener

Diese schreibt nur eine Methode vor: public void itemStateChanged(ItemEvent e)
Also ob sich der Zustand der Checkbox geändert hat.

Choice
Die Komponente Choice stellt eine Pulldownliste dar, die man auch unter den Namen Optionsmenü oder Combobox kennt. Es gibt folgenden Konstruktor: Choice() Die einzelnen Elemente der Pulldownliste fügt man mit der Methode add(String eintrag) hinzu.
Wie bei der CheckBox werden Ereignisse der Zustandsänderung über die Schnittstelle ItemListener verarbeitet. Nun der Quelltext zu unserer Beispielanwendung, die die Hintergrundfarbe ändert, wenn eine andere Farbe in der Choice-Komponente ausgewählt wurde:

import java.awt.*;

public class Backgr extends Frame
{
private MyItemListener myItemListener= new MyItemListener(this);
public Label lblFarbe = new Label("Farbe:");
public Choice chcFarbe = new Choice();

public Backgr()
{
super("Background-Changer");
this.setLayout(new FlowLayout());
this.chcFarbe.add("rot");
this.chcFarbe.add("grün");
this.chcFarbe.add("blau");
this.chcFarbe.add("gelb");
this.add(this.lblFarbe);
this.add(this.chcFarbe);
this.setBackground(Color.red);
this.setSize(200,100);
this.show();
this.addWindowListener(new MyWindowListener());
this.chcFarbe.addItemListener(myItemListener);
}

public static void main(String args[])
{
Backgr f = new Backgr();
}
}
MyItemListener.java
import java.awt.event.*;
import java.awt.*;
public class MyItemListener implements ItemListener
{
public Backgr f;
public MyItemListener(Backgr f)
{
this.f=f;
}

public void itemStateChanged(ItemEvent e)
{
switch(f.chcFarbe.getSelectedIndex())
{
case 0: f.lblFarbe.setBackground(Color.red);
f.setBackground(Color.red);break;
case 1: f.lblFarbe.setBackground(Color.green);
f.setBackground(Color.green);break;
case 2: f.lblFarbe.setBackground(Color.blue);
f.setBackground(Color.blue);break;
case 3: f.lblFarbe.setBackground(Color.yellow);
f.setBackground(Color.yellow);break;
}
f.show();
}
}

Es gibt mehrere Möglichkeiten den selektierten Eintrag von Choice herauszufinden:

  • public String getSelcetedItem() liefert den selektierten Eintrag als String zurück
  • public int getSelectedIndex() liefert den selektierten Eintrag als int zurück

Bei einem Stringvergleich ist es allerdings unmöglich mit einer einfachen mehrfachen Auswahl den Vergleich durchzuführen. Bei dem Einsatz des int-Vergleichs muss man jedoch die genaue Position des Items in der Liste kennen.
So sieht das Programm dann aus:

Backgroundfarbe des Fensters ändern

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)