Hey Community,
hab da an einem Notepad Projekt gearbeitet und bin soweit eigentlich zufrieden.
Nur eine Sache funktioniert noch nicht - und zwar das Auschneiden, Kopieren und Einfügen über die Buttons in der Leiste.
Wäre super wenn Ihr mal drüber schaut und mir Helft. Ich weiß nicht weiter.
Wichtig ist eigentlich nur warum die letzte Methode nicht funktioniert.
Hier mein Code
Danke
hab da an einem Notepad Projekt gearbeitet und bin soweit eigentlich zufrieden.
Nur eine Sache funktioniert noch nicht - und zwar das Auschneiden, Kopieren und Einfügen über die Buttons in der Leiste.
Wäre super wenn Ihr mal drüber schaut und mir Helft. Ich weiß nicht weiter.
Wichtig ist eigentlich nur warum die letzte Methode nicht funktioniert.
Hier mein Code
Java:
package de.fernschulen.minitext;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PrinterException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Hashtable;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.html.HTMLEditorKit;
public class MiniText extends JFrame {
//automatisch über Eclipse eingefügt
private static final long serialVersionUID = -4622810145518216095L;
//für das Eingabefeld
private JEditorPane eingabeFeld;
//für das Format
//wir verwenden HTML
private HTMLEditorKit htmlFormat;
//für die Aktionen
private MeineAktionen oeffnenAct, speichernAct, beendenAct, neuAct,infoAct,
druckenAct, speichernUnterAct, webOeffnenAct, cutAct,
copyAct, pasteAct;
//für die Datei
private File datei;
//für das Kontext-Menü
private JPopupMenu kontext;
//eine innere Klasse für die Action-Objekte
//Sie ist von der Klasse AbstractAction abgeleitet
class MeineAktionen extends AbstractAction {
//automatisch über Eclipse ergänzt
private static final long serialVersionUID = 5736947176597361976L;
//der Konstruktor
public MeineAktionen(String text, ImageIcon icon, String bildschirmtipp, KeyStroke shortcut, String actionText) {
//den Konstruktor der übergeordneten Klasse mit dem Text und dem Icon aufrufen
super(text, icon);
//die Beschreibung setzen für den Bildschirmtipp
putValue(SHORT_DESCRIPTION, bildschirmtipp);
//den Shortcut
putValue(ACCELERATOR_KEY, shortcut);
//das ActionCommand
putValue(ACTION_COMMAND_KEY, actionText);
}
//die überschriebene Methode actionPerformed()
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("neu"))
dateiNeu();
if (e.getActionCommand().equals("laden"))
dateiLaden();
if (e.getActionCommand().equals("speichern"))
dateiSpeichern();
if (e.getActionCommand().equals("beenden"))
beenden();
if (e.getActionCommand().equals("drucken")) {
//wurde die Aktion über eine Schaltfläche gestartet?
//dann direkt drucken
if (e.getSource() instanceof JButton)
drucken(false);
//wurde die Aktion über einen Menüeintrag gestartet?
//dann erst den Dialog zeigen
if (e.getSource() instanceof JMenuItem)
drucken(true);
}
if (e.getActionCommand().equals("speichernUnter"))
dateiSpeichernUnter();
if (e.getActionCommand().equals("webladen"))
webLaden();
if (e.getActionCommand().equals("information"))
programmInfo();
if (e.getActionCommand().equals("cutAction"))
findAction(actions, DefaultEditorKit.cutAction);
if (e.getActionCommand().equals("pasteAction"))
findAction(actions, DefaultEditorKit.pasteAction);
if (e.getActionCommand().equals("copyAction"))
findAction(actions, DefaultEditorKit.copyAction);
}
}
//eine innere Klasse mit dem Listener für das Kontext-Menü
//sie ist von der Adapter-Klasse MouseAdapter abgeleitet
class MeinKontextMenuListener extends MouseAdapter {
@Override
public void mouseReleased(MouseEvent e) {
//die Methode der übergeordneten Klasse aufrufen
super.mouseReleased(e);
//wurde die Maustaste benutzt, die für das Anzeigen des Kontext-Menüs festgelegt ist?
if (e.isPopupTrigger())
//dann das Kontext-Menü anzeigen
kontext.show(e.getComponent(), e.getX(), e.getY());
}
}
//der Konstruktor der Klasse MiniText
public MiniText(String text) {
super(text);
//wir nehmen ein Border-Layout
setLayout(new BorderLayout());
//die Aktionen erstellen
neuAct = new MeineAktionen("Neu...", new ImageIcon("icons/New24.gif"), "Erstellt ein neues Dokument", KeyStroke.getKeyStroke('N',InputEvent.CTRL_DOWN_MASK), "neu");
oeffnenAct = new MeineAktionen("Öffnen...", new ImageIcon("icons/Open24.gif"), "Öffnet ein vorhandenes Dokument", KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK),"laden");
speichernAct = new MeineAktionen("Speichern", new ImageIcon("icons/Save24.gif"), "Speichert das aktuelle Dokument", KeyStroke.getKeyStroke('S',InputEvent.CTRL_DOWN_MASK), "speichern");
beendenAct = new MeineAktionen("Beenden", null, "", null, "beenden");
druckenAct = new MeineAktionen("Drucken...", new ImageIcon("icons/Print24.gif"), "Druckt das aktuelle Dokument", KeyStroke.getKeyStroke('P',InputEvent.CTRL_DOWN_MASK), "drucken");
speichernUnterAct = new MeineAktionen("Speichern unter...", null, "", null, "speichernUnter");
webOeffnenAct = new MeineAktionen("Webseite...", new ImageIcon("icons/WebComponent24.gif"), "Öffnet eine Webseite", null, "webladen");
infoAct = new MeineAktionen("Info", new ImageIcon("icons/Information24.gif"), "Programminformationen", KeyStroke.getKeyStroke('I',InputEvent.CTRL_DOWN_MASK), "information");
cutAct = new MeineAktionen("Cut", new ImageIcon("icons/Cut24.gif"), "Ausschneiden", KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK), "cutAction");
copyAct = new MeineAktionen("Copy", new ImageIcon("icons/Copy24.gif"), "Kopieren", KeyStroke.getKeyStroke('C',InputEvent.CTRL_DOWN_MASK), "copyAction");
pasteAct = new MeineAktionen("Paste", new ImageIcon("icons/Paste24.gif"), "Einfügen", KeyStroke.getKeyStroke('V',InputEvent.CTRL_DOWN_MASK), "pasteAction");
//das Menü erzeugen
menu();
//die Symbolleiste oben einfügen
add(symbolleiste(), BorderLayout.NORTH);
//das Kontext-Menü erzeugen
kontextMenu();
//das Eingabefeld erzeugen und mit dem EditorKit verbinden
eingabeFeld = new JEditorPane();
htmlFormat = new HTMLEditorKit();
eingabeFeld.setEditorKit(htmlFormat);
//das Eingabefeld mit dem Listener für das Kontext-Menü verbinden
eingabeFeld.addMouseListener(new MeinKontextMenuListener());
//gegebenenfalls mit Scrollbars in der Mitte einfügen
add(new JScrollPane(eingabeFeld), BorderLayout.CENTER);
//anzeigen und Standard-Verhalten festlegen
//das Fenster ist maximiert
setExtendedState(MAXIMIZED_BOTH);
//die Mindestgröße setzen
setMinimumSize(new Dimension(600,200));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
//das Eingabefeld bekommt den Fokus
eingabeFeld.requestFocus();
}
//die Methode erstellt die Menüleiste
private void menu() {
JMenuBar menue = new JMenuBar();
//das Menü Datei
JMenu dateiMenue = new JMenu("Datei");
JMenu hilfeMenue = new JMenu("Hilfe");
//das Untermenü Öffnen
//es ist vom Typ Menu, da es weitere Untereinträge haben soll
JMenu dateiOeffnen = new JMenu("Öffnen");
//die Einträge werden jetzt zum Untermenü hinzugefügt
//das "normale" Öffnen
dateiOeffnen.add(oeffnenAct);
//das Öffnen aus dem Internet
dateiOeffnen.add(webOeffnenAct);
//die Einträge werden direkt über Action-Objekte erzeugt
//der Eintrag Neu
dateiMenue.add(neuAct);
//das komplette Untermenü einfügen
dateiMenue.add(dateiOeffnen);
//der Eintrag Speichern
dateiMenue.add(speichernAct);
//der Eintrag Speichern unter
dateiMenue.add(speichernUnterAct);
//eine Trennlinie
dateiMenue.addSeparator();
//der Eintrag Drucken
dateiMenue.add(druckenAct);
//eine Trennlinie
dateiMenue.addSeparator();
//der Eintrag Beenden
dateiMenue.add(beendenAct);
//Das Hilfe Menu
hilfeMenue.add(infoAct);
//das gesamte Menü hinzufügen
menue.add(dateiMenue);
menue.add(hilfeMenue);
this.setJMenuBar(menue);
}
//die Methode erstellt die Symbolleiste
private JToolBar symbolleiste() {
JToolBar leiste = new JToolBar();
//die Symbole werden ebenfalls direkt über Action-Objekte erzeugt
//das Symbol Neu
leiste.add(neuAct);
//das Symbol Öffnen
leiste.add(oeffnenAct);
//das Symbol für das Laden von Webseiten
leiste.add(webOeffnenAct);
//das Symbol Speichern
leiste.add(speichernAct);
//das Symbol Drucken
leiste.add(druckenAct);
//das Symbol für die Information
leiste.add(infoAct);
//das Symbol cut
leiste.add(cutAct);
//das Symbol copy
leiste.add(copyAct);
//das Symabol Paste
leiste.add(pasteAct);
//etwas Platz einfügen
leiste.addSeparator();
//ein Symbol für die fette Zeichenformatierung
//über eine Standard-Aktion aus dem StyledEditorKit
//die neue Aktion erzeugen
//Vorsicht! Es gibt mehrere Klassen Action
//richtig ist die aus javax.swing
Action fettFormat = new StyledEditorKit.BoldAction();
//den Bildschirmtipp und das Symbol setzen
fettFormat.putValue(Action.SHORT_DESCRIPTION, "Fett formatieren");
//fettFormat.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/Bold24.gif"));
//und zur Leiste hinzufügen
leiste.add(fettFormat);
//ein Symbol für die kursive Zeichenformatierung
Action kursivFormat = new StyledEditorKit.ItalicAction();
kursivFormat.putValue(Action.SHORT_DESCRIPTION, "Kursiv formatieren");
//kursivFormat.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/Italic24.gif"));
leiste.add(kursivFormat);
//ein Symbol für die unterstrichene Zeichenformatierung
Action unterstrichenFormat = new StyledEditorKit.UnderlineAction();
unterstrichenFormat.putValue(Action.SHORT_DESCRIPTION, "Unterstrichen formatieren");
//unterstrichenFormat.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/Underline24.gif"));
leiste.add(unterstrichenFormat);
//Platz einfügen
leiste.addSeparator();
//das Symbol für die linksbündige Ausrichtung
//an den Konstruktor von StyledEditorKit.AlignmentAction() wird eine Beschreibung und die
//gewünschte Ausrichtung übergeben
Action linksAbsatz = new StyledEditorKit.AlignmentAction("Linksbündig", StyleConstants.ALIGN_LEFT);
linksAbsatz.putValue(Action.SHORT_DESCRIPTION, "Linksbündig ausrichten");
//linksAbsatz.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/AlignLeft24.gif"));
leiste.add(linksAbsatz);
//das Symbol für die zentrierte Ausrichtung
Action zentriertAbsatz = new StyledEditorKit.AlignmentAction("Zentriert", StyleConstants.ALIGN_CENTER);
zentriertAbsatz.putValue(Action.SHORT_DESCRIPTION, "Zentriert ausrichten");
//zentriertAbsatz.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/AlignCenter24.gif"));
leiste.add(zentriertAbsatz);
//das Symbol für die rechtsbündige Ausrichtung
Action rechtsAbsatz = new StyledEditorKit.AlignmentAction("Rechts", StyleConstants.ALIGN_RIGHT);
rechtsAbsatz.putValue(Action.SHORT_DESCRIPTION, "Rechtsbündig ausrichten");
//rechtsAbsatz.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/AlignRight24.gif"));
leiste.add(rechtsAbsatz);
//das Symbol für den Blocksatz
Action blockAbsatz = new StyledEditorKit.AlignmentAction("Blocksatz", StyleConstants.ALIGN_JUSTIFIED);
blockAbsatz.putValue(Action.SHORT_DESCRIPTION, "Im Blocksatz ausrichten");
//blockAbsatz.putValue(Action.LARGE_ICON_KEY, new ImageIcon("icons/AlignJustify24.gif"));
leiste.add(blockAbsatz);
//die komplette Leiste zurückgeben
return (leiste);
}
//die Methode erstellt das Kontext-Menü
private void kontextMenu() {
//kontext ist eine Instanzvariable vom Typ JPopupMenu
kontext = new JPopupMenu();
//den Eintrag Neu hinzufügen
kontext.add(neuAct);
//die Einträge zum Öffnen
kontext.add(oeffnenAct);
kontext.add(webOeffnenAct);
}
//die Methode für die Funktion Neu
private void dateiNeu() {
//eine Abfrage
if(JOptionPane.showConfirmDialog(this, "Wollen Sie wirklich ein neues Dokument anlegen?","Neues Dokument", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
//den Text löschen
eingabeFeld.setText("");
//datei wieder auf null setzen, damit klar ist, dass die Datei noch nicht gespeichert wurde
datei = null;
setTitle("MiniText " + "ohneName");
}
}
//die Methode zum Laden einer Datei
private void dateiLaden() {
//für den Dialog
MiniTextDialoge dialog = new MiniTextDialoge();
//die Datei über den Dialog Öffnen beschaffen
//es wird erst einmal in einer lokalen Variablen zwischengespeichert
File dateiLokal = dialog.oeffnenDialogZeigen();
//wenn eine Datei ausgewählt wurde, einlesen
//die Methode read() erzwingt eine Ausnahmebehandlung
if (dateiLokal != null) {
try {
eingabeFeld.read(new FileReader(dateiLokal), null);
//datei neu setzen
datei = dateiLokal;
setTitle("MiniText " + datei);
}
catch (IOException e) {
JOptionPane.showMessageDialog(this, "Beim Laden hat es ein Problem gegeben.", "Fehler", JOptionPane.ERROR_MESSAGE);
}
}
}
//die Methode zum Speichern einer Datei
private void dateiSpeichern() {
//WICHTIG!!!!
//datei muss als Instanzvariable vereinbart werden
//wenn die Datei noch nicht gespeichert wurde, ist datei noch null
if (datei == null) {
//für den Dialog
MiniTextDialoge dialog = new MiniTextDialoge();
//die Datei über den Dialog Speichern beschaffen
datei = dialog.speichernDialogZeigen();
}
//ist datei ungleich null, dann wurde vorher schon einmal gespeichert
//bzw. im Dialog eine Datei ausgewählt
if (datei != null) {
//die Ausnahmebehandlung ist zwingend erforderlich
try {
//den Output-Stream für die Datei beschaffen
OutputStream output = new FileOutputStream(datei);
//das Dokument komplett speichern
htmlFormat.write(output, eingabeFeld.getDocument(), 0, eingabeFeld.getDocument().getLength());
}
catch (IOException e) {
JOptionPane.showMessageDialog(this, "Beim Speichern hat es ein Problem gegeben.", "Fehler", JOptionPane.ERROR_MESSAGE);
}
catch (BadLocationException e) {
JOptionPane.showMessageDialog(this, "Beim Speichern hat es ein Problem gegeben.", "Fehler", JOptionPane.ERROR_MESSAGE);
}
}
}
//die Methode öffnet den Speichern-Dialog und ruft die Methode dateiSpeichern() auf,
//wenn ein neuer Name ausgewählt wurde
private void dateiSpeichernUnter() {
//für den Dialog
MiniTextDialoge dialog = new MiniTextDialoge();
//die Datei über den Dialog Speichern beschaffen
File dateiLokal = dialog.speichernDialogZeigen();
//ist dateiLokal ungleich null, dann wurde ein neuer Name ausgewählt
if (dateiLokal != null) {
datei = dateiLokal;
dateiSpeichern();
}
}
//die Methode beendet die Anwendung nach einer Abfrage
private void beenden() {
if(JOptionPane.showConfirmDialog(this, "Sind Sie sicher?","Anwendung schließen", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
System.exit(0);
}
//die Methode druckt das Dokument
//wenn dialogZeigen true ist, wird erst der Drucken-Dialog eingeblendet
private void drucken(boolean dialogZeigen) {
try {
if (dialogZeigen == true)
//mit Dialog drucken
eingabeFeld.print();
else
//ohne Dialog drucken
//dazu muss das dritte Argument false sein
eingabeFeld.print(null, null, false, null, null, true);
}
catch (PrinterException e) {
JOptionPane.showMessageDialog(this, "Beim Drucken hat es ein Problem gegeben.", "Fehler", JOptionPane.ERROR_MESSAGE);
}
}
//die Methode öffnet ein Dokument aus dem Internet
private void webLaden() {
//für die URL
String adresse;
//einen Dialog zur Eingabe erzeugen
adresse = JOptionPane.showInputDialog(this, "Bitte geben Sie die URL der Seite ein:");
//wurde etwas eingegeben?
if (adresse != null) {
//den Text im Feld löschen
eingabeFeld.setText("");
try {
//den Inhalt anzeigen
eingabeFeld.setPage(adresse);
setTitle("MiniText " + adresse);}
catch (IOException e) {
JOptionPane.showMessageDialog(this, "Beim Laden ist ein Problem aufgetreten.");
}
}
}
private void programmInfo() {
JOptionPane.showMessageDialog(this, "MiniText Version 1.0. Programmiert von: Sven Reitz");
}
private static Action findAction(Action actions[], String key) {
Hashtable<Object, Action> commands = new Hashtable<Object, Action>();
for (int i = 0; i < actions.length; i++) {
Action action = actions[i];
commands.put(action.getValue(Action.NAME), action);
}
return commands.get(key);
}
}
Danke
Zuletzt bearbeitet von einem Moderator: