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:
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:
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:
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:
Weiter auf der nächsten Seite
|