JTextPane mit Textformatierung funktioniert nicht

Status
Nicht offen für weitere Antworten.

Steev

Bekanntes Mitglied
Hallo liebe Forengemeinde,

ich habe einen kleinen Texteditor mit Formatierung geschrieben.
Leider funktioniert die Formatierung nicht so wie es eigendlich gewünscht ist.

Wenn ich einen Text mit verschiedenen Formatierungen (Fett, Kursiv, Unterstrichen)
markiere und die Formatierung zum Beispiel auf Fett setze, so übernimmt der
Editor die Formatierung die das erste markierte Zeichen hat.

Beispiel:
Formatierter Text:
test test test test

Jetzt markiere ich den Text und setzte die Formatierung auf Fett, das Ergebniss
ist wie folgt:
test test test test


Kennt jemand das Problem und kann mir vieleicht helfen?

Die Hotkeys für die Formatierungen sind:
Strg + Shift + F --> Fett
Strg + Shift + K --> Kursiv
Strg + Shift + U --> Unterstrichen

Hier ist nochmal der ganze Code:
(Tut mir leid aber ich weis ja nicht wo der Fehler ist, daher poste ich mal alles)
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.text.AttributeSet;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.JTextComponent;
import javax.swing.text.Keymap;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import javax.swing.undo.UndoManager;

import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;


@SuppressWarnings("serial")
public class StyledEditorPane extends JTextPane
{
	public JTextPane my;
	public HTMLDocument doc;
	public StyleSheet styleSheet;
	public HTMLEditorKit kit;
	public MutableAttributeSet attr;
	public UndoManager ed_undomanager;
	public Hashtable kit_actions;
	public Hashtable ed_actions;
	public Hashtable ed_hotkeys;
	
	public StyledEditorPane()
	{
		my = this;
		
		// Formatierungstyp:
		setContentType("text/html");
		
		// HTML-Dokument:
		doc = (HTMLDocument) getDocument();
		
		// Editor-Kit:
		kit = (HTMLEditorKit) getEditorKit();
		kit.install(this);
		
		// MutableAttributSet:
		attr = (MutableAttributeSet) getInputAttributes().copyAttributes();
		
		// Aktionen:
		kit_actions = new Hashtable();
		addEditorKitActions();
		
		ed_hotkeys = new Hashtable();
		addEditorHotkeys();
		
		// Editoraktionen:
		ed_actions = new Hashtable();
		addEditorKitCommands();
		
		// Textaktionen:
		addEditorTextActions();
		
		// Undo-Manager:
		ed_undomanager = new UndoManager();
		doc.addUndoableEditListener(ed_undomanager);
		
		updateEditor();
	}
	
	private void addEditorKitActions()
	{
		Action[] actions = kit.getActions();
		Action a;
		for (int i = 0; i < actions.length; i++)
		{
			a = actions[i];
			kit_actions.put(actions[i].getValue(Action.NAME), a);
		}
	}
	
	private void addEditorKitCommands()
	{
		ed_actions.put("action-undo", new AbstractAction()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(ed_undomanager.canUndo())
					ed_undomanager.undo();
			}
		});
		ed_actions.put("action-redo", new AbstractAction()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(ed_undomanager.canRedo())
					ed_undomanager.redo();
			}
		});
		ed_actions.put("action-bold", new AbstractAction()
		{
			public void actionPerformed(ActionEvent e)
			{
				int p = getCaretPosition();
				int start = getSelectionStart();
				int end = getSelectionEnd();
				p = start > end ? end : start;
				if (start == end)
					p -= 1;
				
				AttributeSet a = doc.getCharacterElement(p).getAttributes();
				attr = (MutableAttributeSet) getInputAttributes().copyAttributes();
				
				boolean bold = StyleConstants.isBold(a);
				StyleConstants.setBold(attr, !bold);
				setAttributeSet(attr);
				grabFocus();
			}
		});
		ed_actions.put("action-italic", new AbstractAction()
		{
			public void actionPerformed(ActionEvent e)
			{
				int p = getCaretPosition();
				int start = getSelectionStart();
				int end = getSelectionEnd();
				p = start > end ? end : start;
				if (start == end)
					p -= 1;
				
				AttributeSet a = doc.getCharacterElement(p).getAttributes();
				attr = (MutableAttributeSet) getInputAttributes().copyAttributes();
				
				boolean italic = StyleConstants.isItalic(a);
				StyleConstants.setItalic(attr, !italic);
				setAttributeSet(attr);
				grabFocus();
			}
		});
		ed_actions.put("action-underline", new AbstractAction()
		{
			public void actionPerformed(ActionEvent e)
			{
				int p = getCaretPosition();
				int start = getSelectionStart();
				int end = getSelectionEnd();
				p = start > end ? end : start;
				if (start == end)
					p -= 1;
				
				AttributeSet a = doc.getCharacterElement(p).getAttributes();
				attr = (MutableAttributeSet) getInputAttributes().copyAttributes();
				
				boolean underline = StyleConstants.isUnderline(a);
				StyleConstants.setUnderline(attr, !underline);
				setAttributeSet(attr);
				grabFocus();
			}
		});
	}
	
	private void addEditorHotkeys()
	{
		ed_hotkeys.put("hotkey-delete",
				KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK));
		ed_hotkeys.put("hotkey-deleteLastWord",
				KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
		ed_hotkeys.put("hotkey-redo",
				KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
		ed_hotkeys.put("hotkey-undo",
				KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
		ed_hotkeys.put("hotkey-bold",
				KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
		ed_hotkeys.put("hotkey-italic",
				KeyStroke.getKeyStroke(KeyEvent.VK_K, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
		ed_hotkeys.put("hotkey-underline",
				KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
		ed_hotkeys.put("hotkey-copy",
				KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
		ed_hotkeys.put("hotkey-paste",
				KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
		ed_hotkeys.put("hotkey-cut",
				KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
		ed_hotkeys.put("hotkey-enterLineBreak",
				KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
	}
	
	private void addEditorTextActions()
	{
		final JTextComponent.KeyBinding[] defaultBindings =
		{
				// Standard Textfunktionen:
				new JTextComponent.KeyBinding(
						(KeyStroke) ed_hotkeys.get("hotkey-copy"),
						DefaultEditorKit.copyAction),
				new JTextComponent.KeyBinding(
						(KeyStroke) ed_hotkeys.get("hotkey-paste"),
						DefaultEditorKit.pasteAction),
				new JTextComponent.KeyBinding(
						(KeyStroke) ed_hotkeys.get("hotkey-cut"),
						DefaultEditorKit.cutAction),
				
				// Spezielle Textfunktionen:
				// **Löschen:
				new JTextComponent.KeyBinding(
						(KeyStroke) ed_hotkeys.get("hotkey-delete"),
						DefaultEditorKit.deletePrevCharAction),
				new JTextComponent.KeyBinding(
						(KeyStroke) ed_hotkeys.get("hotkey-deleteLastWord"),
						DefaultEditorKit.deletePrevWordAction),
				// **Zeilenumbruch
				new JTextComponent.KeyBinding(
						(KeyStroke) ed_hotkeys.get("hotkey-enterLineBreak"),
						DefaultEditorKit.insertBreakAction)
		};
		
		Keymap k = getKeymap();
		loadKeymap(k, defaultBindings, getActions());
		
		// Speziele Editorfunktionen:
		k.addActionForKeyStroke(
				(KeyStroke) ed_hotkeys.get("hotkey-undo"),
				(AbstractAction) ed_actions.get("action-undo"));
		k.addActionForKeyStroke(
				(KeyStroke) ed_hotkeys.get("hotkey-redo"),
				(AbstractAction) ed_actions.get("action-redo"));
		k.addActionForKeyStroke(
				(KeyStroke) ed_hotkeys.get("hotkey-bold"),
				(AbstractAction) ed_actions.get("action-bold"));
		k.addActionForKeyStroke(
				(KeyStroke) ed_hotkeys.get("hotkey-italic"),
				(AbstractAction) ed_actions.get("action-italic"));
		k.addActionForKeyStroke(
				(KeyStroke) ed_hotkeys.get("hotkey-underline"),
				(AbstractAction) ed_actions.get("action-underline"));
	}
	
	private void setAttributeSet(AttributeSet attr)
	{
		int xStart = getSelectionStart();
		int xFinish = getSelectionEnd();
		
		if (xStart != xFinish)
		{
			doc.setCharacterAttributes(xStart, xFinish - xStart, attr, false);
		}
		else
		{
			doc.setCharacterAttributes(xStart, xStart + 1, attr, false);
			MutableAttributeSet inputAttributes = kit.getInputAttributes();
			inputAttributes.addAttributes(attr);
		}
	}
	
	public void updateEditor()
	{
		kit = (HTMLEditorKit) getEditorKit();
		doc = (HTMLDocument) getDocument();
		styleSheet = kit.getStyleSheet();
		styleSheet.addRule(
			"body { font-family : Arial; font-size : 12pt }");
		styleSheet.addRule(
			"ul{ font-family : Arial; alignment : left }");
	}
	
	// Test: Starten des Editors:
	public static void main(String[] args)
	{
		JFrame f = new JFrame("TextEditor - Test");
		f.setSize(400, 300);
		f.setLocation(
				(java.awt.Toolkit.getDefaultToolkit().getScreenSize().width-f.getWidth())/2,
				(java.awt.Toolkit.getDefaultToolkit().getScreenSize().height-f.getHeight())/2
				);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// Komponenten:
		f.setLayout(new BorderLayout());
		f.add(new JScrollPane(new StyledEditorPane()));
		
		f.setVisible(true);
	}
}
 

Steev

Bekanntes Mitglied
Dankeschön MiDniGG,

ich werde mir das mal ansehen. Ich dachte nur das es vieleicht ein kleiner dummer Fehler war, den man mit ein oder zwei Zeilen hätte beheben können.
 
M

MiDniGG

Gast
Das kann natürlich sein. Ich geb zu ich hab mir deinen Quelltext nicht angeschaut :oops:
Aber das Problem hatte ich auch mal und ich/wir haben das dann so gelöst :)
 

Steev

Bekanntes Mitglied
Na ja, wenn du mal Zeit hast kannst du ja mal kurz drüber gucken. Ich gebe zu dass, das auch viel Code ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Textformatierung in JTextPane AWT, Swing, JavaFX & SWT 8
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
S Swing Style Attribute aus JTextPane kopieren AWT, Swing, JavaFX & SWT 1
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
TheJavaKid JTextPane: komplexe Formatierung (links) AWT, Swing, JavaFX & SWT 2
B Swing JTextPane - Einfärbungen auf "default" AWT, Swing, JavaFX & SWT 2
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
T Hintergrundbild in JTextPane fixieren AWT, Swing, JavaFX & SWT 2
M Swing JTextPane frisst Anführungszeichen AWT, Swing, JavaFX & SWT 2
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
R Swing Renderproblem bei HTML in einer JTextPane AWT, Swing, JavaFX & SWT 12
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
Tobse Swing [JTextPane] Farbliche Hervorhebung AWT, Swing, JavaFX & SWT 9
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JTextPane Tastatureingabe abfangen AWT, Swing, JavaFX & SWT 4
B Durchsichtiges JScroll und JTextPane AWT, Swing, JavaFX & SWT 4
xehpuk Swing JTextPane in JScrollPane wird nicht ordentlich neugezeichnet AWT, Swing, JavaFX & SWT 3
S Swing JTextPane append formatprobleme AWT, Swing, JavaFX & SWT 5
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
S JEditorPane oder JTextPane? AWT, Swing, JavaFX & SWT 2
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTextPane - bewegungsloses Hintergrundsbild (Duplikat) AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
P Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane) AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
K Swing JTextPane Formatierungen SyntaxHighlighting AWT, Swing, JavaFX & SWT 11
F Mit TAB JTextPane wechseln AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
S Buchstabenpositionen in JTextPane erhalten..? AWT, Swing, JavaFX & SWT 5
I JTextPane und Hyperlink (ohne JEditorPane) AWT, Swing, JavaFX & SWT 5
T Swing JTextArea, JTextPane, JEditorPane...Unterschied?! AWT, Swing, JavaFX & SWT 3
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
A JTextPane: Text hinzufügen AWT, Swing, JavaFX & SWT 9
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
E Swing JTextPane linewrap AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
M Formatierungsfehler JTextPane WARUM ?? AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
E JTextPane Bold Italic und Co AWT, Swing, JavaFX & SWT 6
M JTextPane Ende des Feldes AWT, Swing, JavaFX & SWT 4
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
P Probleme mit JTextpane AWT, Swing, JavaFX & SWT 7
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
bugmenot JTextPane String stimmt nicht mit übergebenem String überein AWT, Swing, JavaFX & SWT 9
C JTextPane <br oder <p> statt \n AWT, Swing, JavaFX & SWT 2
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
G JTextPane durchsichtig? AWT, Swing, JavaFX & SWT 6
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
S JTextPane: Probem mit AlignmentAction AWT, Swing, JavaFX & SWT 3
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
G insert & JTextPane AWT, Swing, JavaFX & SWT 4
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
A JScrollPane in JTextPane AWT, Swing, JavaFX & SWT 2
B Swing Logging: Ein/Ausblenden eines scrollenden JTextPane AWT, Swing, JavaFX & SWT 2
F Java JTextPane AWT, Swing, JavaFX & SWT 13
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
G Zeilenabstand bei HTML-Texten in JLabel/JTextPane AWT, Swing, JavaFX & SWT 7
O Swing Xml highlightning mit JTextPane und Regular expressions AWT, Swing, JavaFX & SWT 5
J JTextPane Alignment AWT, Swing, JavaFX & SWT 6
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5
B Ein großes JTextPane komplett drucken AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben