JTextPane wie formatierten Inhalt "formatiert" abspeichern?

gigagon

Mitglied
Hallo Java-Freunde,

ich habe vor einen kleinen TextEditor zu machen, der ein paar einfache Formatierungen beherrschen soll.
Ich habe dazu schon etwas gesucht und gelesen und diesen interessanten Beitrag gefunden:
http://www.tutorials.de/forum/826818-post2.html



Der gefällt mir so schon ganz gut, doch eine Sache bleibt mir immer noch schleierhaft:
Wie kann ich den Text formatiert abspeichern?
(Leider wurde das abspeichern nicht gezeigt)

Das Speichern sei jetzt außen vor gelassen, aber wie komme ich an den "formatierten" String zum speichern?
Ich habe immerhin schon rausbekommen, dass man dies in HTML/XML machen könnte, aber wie "baue" ich diesen XML-String zusammen?
Wir er mir schon fertig geliefert oder wie?
Auf der ansonsten sehr guten Tut Seite von Sun, wird auch nur gezeigt, wie man Text anzeigt.

Ich hoffe mir kann jemand bei dem Problem helfen.

MfG gigagon
 
Wieso nimmst du nicht eibfach eine JEditorPane? Mit der JEditorPane kannst du mithilfe von HTML-Tags Formattierungen darstellen udn diese auch dementsprechend speichern.
 
So, ich bin jetzt auch schon weitergekommen, habe eine TextPane verwendet (ob TextPane oder EditorPane ist mir persönlich eigentlich egal).
Zudem hab ich irgendwo gelesen, das man möglichst RTF in ner DB speichern sollte, was ich dann wohl auch erstmal machen werde.

Habe jetzt eine Klasse geschreiben, in der ich den Text schon mal etwas formatieren kann.
Nun wollte ich ausprobieren, wie es aussehen würde, wenn ich dies speichern wollte und habe dafür eine TextArea unter die TextPane gepackt.
Klickt man auf den Button Save sollte der Text in die TextArea übertragen werde, was aber leider nicht funktioniert.
Zusätzlich wollte ich noch einen Text beim starten des Programms in die TextPane packen, was leider auch nicht geht.
( mit getText() kommt immer null)

Hier mal der Code:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;

import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
import javax.swing.text.rtf.RTFEditorKit;

public class EditorFrame extends JFrame implements ActionListener {


	//private final JEditorPane editorPane = new JEditorPane();
	private final JTextPane editorPane = new JTextPane();
	private final JPanel toolBarPane = new JPanel();
	private final JToolBar sizeToolBar = new JToolBar();
	private final JToolBar styleToolBar = new JToolBar();
	private final JToolBar toolBar = new JToolBar();
	
	private final HashMap<String, Action> actionsMap = new HashMap<String, Action>();
	
	private final String[] fontSize = { "font-size-8", "font-size-14", "font-size-16", "font-size-18", "font-size-24", "font-size-36", "font-size-48"};
	private final String[] fontStyle = {"font-italic", "font-bold", "font-underline", "left-justify", "right-justify", "center-justify" };
	private final String[] tools = {"select-all", "cut-to-clipboard", "paste-from-clipboard" };
	
	private final JTextArea textArea = new JTextArea(20, 5);
	
	EditorFrame() {
		super("Editor");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(800, 800);
		
		JPanel contentPane = (JPanel) this.getContentPane();
		contentPane.setLayout(new BorderLayout());

		
		//TextPane erstellen
		editorPane.setContentType("text/rtf");
		editorPane.setEditorKit(new RTFEditorKit());
		
		JScrollPane editorScrollPane = new JScrollPane(editorPane);
		editorScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		editorScrollPane.setPreferredSize(new Dimension(250, 145));
		editorScrollPane.setMinimumSize(new Dimension(10, 10));

		editorPane.setText("Hallo");		//<----------------- geht nicht

		// ToolBars erstellen
		createActionTable();
		fontSizeBox();
		fontStyleBox();
		toolBox();
			
		toolBarPane.setLayout(new GridLayout(4, 1, 0, 00));

		toolBarPane.add(myToolBox());
		toolBarPane.add(toolBar);
		toolBarPane.add(sizeToolBar);
		toolBarPane.add(styleToolBar);		
		
		contentPane.add(BorderLayout.NORTH, toolBarPane);	
		contentPane.add(BorderLayout.CENTER, editorScrollPane);
		contentPane.add(BorderLayout.SOUTH, textArea);		
		
		this.setVisible(true);
	}
	
	private void createActionTable() {	
	    Action[] actionsArray = editorPane.getActions();
	    
	    for (int i = 0; i < actionsArray.length; i++) {
	        Action a = actionsArray[i];
	        actionsMap.put((String) a.getValue(Action.NAME), a);
	    }
	}  
	
	private void fontSizeBox() {		
		for (int i = 0; i < fontSize.length; i++) {
			if(actionsMap.containsKey(fontSize[i])) {
				sizeToolBar.add(actionsMap.get(fontSize[i]));
			}
		}		
	}
	
	private void fontStyleBox() {		
		for (int i = 0; i < fontStyle.length; i++) {
			if(actionsMap.containsKey(fontStyle[i])) {
				styleToolBar.add(actionsMap.get(fontStyle[i]));
			}
		}		
	}	
	
	private void toolBox() {		
		for (int i = 0; i < tools.length; i++) {
			if(actionsMap.containsKey(tools[i])) {
				toolBar.add(actionsMap.get(tools[i]));
			}
		}		
	}	
	
	public JPanel myToolBox() {
		JPanel myToolPanel = new JPanel();
		
		JButton save = new JButton("save");
		save.setActionCommand("save");
		save.addActionListener(this);
		
		myToolPanel.add(save);		
		
		return myToolPanel;
	}


	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("save")) {
			textArea.setText("Save: "+ editorPane.getText());	// <----------------- geht nicht
		}
		
	}
}

Ich habe darüber hinaus noch etwas mit einem "StyledDocument" gefunden, verstehe den Sinn aber irgendwie nicht ganz.
Brauch ich dass, um darüber den Text laden und speichern zu können?
 
Zuletzt bearbeitet:
Hallo,

in der Dokumentation von der JEditorPane.setText() Methode steht, dass der String Parameter entsprechend dem verwendeten EditorKit formatiert sein muss. Ich vermute, da du ein RTFEditorKit benutzt, sollte der Text, den du in die Pane einfügst, auch RTF-conform formatiert sein.

Grüße
Vincent
 
Hey cool,
danke für den Tipp. Dachte zwar das hätte ich schon probiert, aber hatte wohl nen fehler drinn.
Auch das Auslesen klappt jetzt und zwar über ein Umweg.
Hier der Code, für die Leute, die auch damit Probleme haben:
Java:
try {
	textArea.setText(editorPane.getDocument().getText(0, editorPane.getDocument().getLength()));
} catch (BadLocationException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
}
 
Zurück