DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung Aufgabe Editor package BA.GUI.Swing; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.logging.level; import java.util.logging.logger; import javax.swing.*; import javax.swing.filechooser.filefilter; public class Editor extends JFrame { /* Hier werden alle Komponenten vereinbart auf die man später direkt * zugreifen möchte, um ihren Text oder um ihre Attribute zu ändern. * Man kann auch Events auswerten wenn man ein Handle auf die Komponenten * bereithält. Allerdings geht das ebenfalls über den Namen von Komponenten, * der dafür explizit gesetzt werden muss! */ Container c; JMenuBar menu; JMenu dateimenu; JMenu bearbeitenmenu; JEditorPane editfield; Component schliessencomp; Component speicherncomp; Component speichernuntercomp; Component speichernwebsitecomp; /* Hier werden Namen für einzelne Komponenten definiert. * Über diese Namen kann man diese identifizieren, z.b. wenn ein Ereignis * ausgelöst wurde. */ private final String NEU = "NEU"; private final String OEFFNEN = "OEFFNEN"; private final String SCHLIESSEN = "SCHLIESSEN"; private final String SPEICHERN = "S"; private final String SPEICHERNUNTER = "S_U"; private final String SPEICHERNWEBSITE = "S_WEBSITE"; private final String BEENDEN = "BEENDEN"; // Weitere Variablen im Zusammenhang mit der Oberfläche int width = 600; int height = 400; /* Hier kommen Felder für die Anwendung Editor */ boolean documentopen = false; // Ist derzeit ein Dokument geöffnet? boolean backupavailable = false; boolean actionperformed = false; // Ist "Rückgeängig möglich? // Wurde eine Aktion ausgeführt, // die wiederholt werden kann? String[] lastfiles = {"bilanz_2007.doc", "quatalsbericht_2008_01.doc", "ziele.doc"; String documenttitle = "Dokument1"; File datei = null;
/** Konstruktor für den Editor. * Erzeugt erstmalig Menü und Arbeitsfläche. */ Editor() { // Einstellungen für das Fenster (JFrame) UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); catch (Exception ex) { this.settitle(documenttitle); setsize(width, height); c = this.getcontentpane(); c.setlayout(new BorderLayout()); // Arbeitsfläche erzeugen editfield = new JEditorPane(); editfield.settext(""); editfield.setfont(new Font("Courier New", Font.PLAIN, 12)); // Scrollbalken erzeugen. Über diesen wird editfield eingebunden! JScrollPane editorscrollpane = new JScrollPane(editField); editorscrollpane.setverticalscrollbarpolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); editorscrollpane.sethorizontalscrollbarpolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); editorscrollpane.setpreferredsize(new Dimension(250, 145)); editorscrollpane.setminimumsize(new Dimension(10, 10)); c.add(editorscrollpane, BorderLayout.CENTER); // Menü erzeugen menu = new JMenuBar(); dateimenu = setdateimenu(); menu.add(dateimenu); bearbeitenmenu = setbearbeitenmenu(); menu.add(bearbeitenmenu); menu.setsize(width, 30); c.add(menu, BorderLayout.NORTH); setmenu(); // Enable etc. setzen // Alles anzeigen c.setvisible(true); private void setmenu() { this.settitle(documenttitle); schliessencomp.setenabled(!isempty()); speicherncomp.setenabled(datei!= null); speichernuntercomp.setenabled(documentopen); speichernwebsitecomp.setenabled(documentopen);
/** Produziert das "Datei"-Menu. * DEMO: Nicht alle Menüpunkte haben eine Funktion. */ private JMenu setdateimenu() { dateimenu = new JMenu("Datei"); dateimenu.setmnemonic(keyevent.vk_d); dateimenu.add(newjmenuitem(neu, "Neu...", true, KeyEvent.VK_N, editfield.settext(""); documenttitle = "Neue Datei"; boolean backupavailable = false; )); dateimenu.add(newjmenuitem(oeffnen, "Öffnen...", true, KeyEvent.VK_F, dateioeffnen(); )); schliessencomp = newjmenuitem(schliessen, "Schließen",!this.isEmpty(), KeyEvent.VK_C, null); dateimenu.add(schliessencomp); speicherncomp = newjmenuitem(speichern, "Speichern", datei!= null, KeyEvent.VK_S, if (datei == null) // Wenn kein Dateiname bekannt { datei = fileselect(); // Danach fragen dateispeichern(datei); ); dateimenu.add(speicherncomp); speichernuntercomp = newjmenuitem(speichernunter, "Speichern unter...", documentopen, KeyEvent.VK_S, null); dateimenu.add(speichernuntercomp); speichernwebsitecomp = newjmenuitem(speichernwebsite, "Als Webseite speichern...", documentopen, KeyEvent.VK_T, null); dateimenu.add(speichernwebsitecomp); dateimenu.add(newjmenuitem("suchen...")); dateimenu.add(newjmenuitem("versionen...")); dateimenu.add(newjmenuitem("webseitenvorschau")); dateimenu.add(newjmenuitem("seite einrichten...")); dateimenu.add(newjmenuitem("seitenansicht")); dateimenu.add(newjmenuitem("drucken..."));
/* Der nächste Menüpunkt hat ein Untermenü, ist also selbst ein * Container (JMenu) und nimmt eigene MenuItems auf. */ JMenu sendenan = new JMenu("Senden an"); sendenan.add(newjmenuitem("e-mail-empfänger")); sendenan.add(newjmenuitem("e-mail-empfänger (zur Überarbeitung)...")); sendenan.add(newjmenuitem("e-mail-empfänger (als Anlage)...")); sendenan.add(newjmenuitem("verteilerempfänger...")); sendenan.add(newjmenuitem("onlinebesprechungsteilnehmer")); sendenan.add(newjmenuitem("exchange-ordner...")); sendenan.add(newjmenuitem("fax-empfänger...")); sendenan.add(new JSeparator()); sendenan.add(newjmenuitem("microsoft Powerpoint")); dateimenu.add(sendenan); // Ganzes Untermenu einfügen // Und hier gehts weiter im ursprünglichen Menu dateimenu.add(new JMenuItem("Eigenschaften")); // Hier werden die zuletzt geöffneten Files angezeigt. Größe ist dynamisch. for (String file : lastfiles) { dateimenu.add(newjmenuitem(file, true)); dateimenu.add(newjmenuitem(beenden, "Beenden", true, KeyEvent.VK_E, if (JOptionPane.showConfirmDialog(null, "Wirklich beenden?", "Beenden", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { System.exit(0); )); return dateimenu;
/** Produziert das "bearbeiten"-menu * DEMO: Nicht alle Menüpunkte haben eine Funktion. */ private JMenu setbearbeitenmenu() { JMenu bearbeitenmenu = new JMenu("Bearbeiten"); bearbeitenmenu.setmnemonic(keyevent.vk_b); JMenuItem rueckgaengig; // Die nächsten zwei MenuItems werden direkt erzeugt if (backupavailable) { rueckgaengig = new JMenuItem("Rückgängig"); else { rueckgaengig = new JMenuItem("Rückgängig: nicht möglich"); rueckgaengig.setenabled(backupavailable); bearbeitenmenu.add(rueckgaengig); JMenuItem wiederholen; if (actionperformed) { wiederholen = new JMenuItem("Wiederholen"); else { wiederholen = new JMenuItem("Wiederholen: nicht möglich"); wiederholen.setenabled(actionperformed); bearbeitenmenu.add(wiederholen); // Dies folgenden MenuItems werden über die u.s. Methoden erzeugt bearbeitenmenu.add(newjmenuitem("ausschneiden")); bearbeitenmenu.add(newjmenuitem("kopieren")); bearbeitenmenu.add(newjmenuitem("office-zwischenablage")); bearbeitenmenu.add(newjmenuitem("einfügen")); bearbeitenmenu.add(newjmenuitem("inhalte einfügen")); bearbeitenmenu.add(newjmenuitem("als Hyperlink einfügen")); bearbeitenmenu.add(newjmenuitem("löschen")); bearbeitenmenu.add(newjmenuitem("alles markieren")); bearbeitenmenu.add(newjmenuitem("suchen...")); bearbeitenmenu.add(newjmenuitem("ersetzen...")); bearbeitenmenu.add(newjmenuitem("gehe zu...")); bearbeitenmenu.add(newjmenuitem("verknüpfungen...")); bearbeitenmenu.add(newjmenuitem("objekt")); return bearbeitenmenu; /** Produziert ein neues JMenuItem */ JMenuItem newjmenuitem(string name, String text, boolean enable, int mnemonic, ActionListener al) { JMenuItem mi = new JMenuItem(text); mi.setname(name); // Namen setzen. Intern, wird nicht angezeigt! mi.setenabled(enable); // Aktiviert oder nicht? if (al!=null) mi.addactionlistener(al); // Action-Listener hinzufügen if (mnemonic!= ' ') // ggf. Tastaturkürzel hinzufügen { mi.setmnemonic(mnemonic); return mi; /** Kurzfassung für die ausführliche Version von newjmenuitem */ JMenuItem newjmenuitem(string text, boolean enable) { return newjmenuitem(text, text, enable, ' ', null);
/** Kurzfassung für die ausführliche Version von newjmenuitem */ JMenuItem newjmenuitem(string text) { return newjmenuitem(text, text, true, ' ', null); /** Sagt, ob der Editor leer ist */ public boolean isempty() { return (editfield.gettext() == null) editfield.gettext().equalsignorecase(""); /** Öffnen einer neuen Datei inkl. Dateiauswahlbox */ public void dateioeffnen() { File f = fileselect(); if (f!= null) { datei = f; documenttitle = datei.getname(); editfield.settext(dateilesen(datei)); documentopen = true; /** Einlesen einer neuen Datei in einen String */ public String dateilesen(file datei) { if (datei!= null) { BufferedReader br = null; StringBuffer inhalt = new StringBuffer(); br = new BufferedReader(new FileReader(datei)); while (br.ready()) { inhalt.append(br.readline() + "\n"); catch (FileNotFoundException ex) { catch (IOException ex) { finally { br.close(); catch (IOException ex) { Logger.getLogger(Editor.class.getName()).log(Level.SEVERE, null, ex); return inhalt.tostring(); else { return "";
/** Speichern des Inhalts von editfield einer Datei */ public void dateispeichern(file datei) { if (datei!= null) { BufferedWriter bw = null; bw = new BufferedWriter(new FileWriter(datei)); bw.write(editfield.gettext()); catch (FileNotFoundException ex) { catch (IOException ex) { finally { bw.close(); catch (IOException ex) { Logger.getLogger(Editor.class.getName()).log(Level.SEVERE, null, ex); /** Öffnen einer Dateiauswahlbox. * Gibt null zurück, wenn keine Datei ausgewählt wurde. */ public File fileselect() { JFileChooser fc = new JFileChooser(); fc.setfilefilter(new FileFilter() { public boolean accept(file f) { return f.isdirectory() f.getname().tolowercase().endswith(".txt"); public String getdescription() { return "Textdateien"; ); if (fc.showopendialog(null) == JFileChooser.APPROVE_OPTION) { return fc.getselectedfile(); return null; /** Hier startet der Editor */ public static void main(string[] args) { Editor me = new Editor(); me.setdefaultcloseoperation(jframe.exit_on_close); me.setvisible(true);