# JTextPane - markierten Text Formatieren



## Sythus (28. Feb 2008)

Hallo Leute,

ich bastele zur Zeit an einem Texteditor der JTextPane nutzt und schon einige Formatierungsmöglichkeiten besitzt!

Problem: Bisher kann man nur den kompletten Text formatieren.

Ich bräuchte nun einen Ansatz oder eine Idee wie ich markierten Text einzelnen formatieren kann. 
Welche Elemente könnten mir helfen?

Bin für jede Idee Dankbar,
habe zwar in der Suche schon einige Posts gefunden die sich auf das Thema beziehen, jedoch gab esn irgends eine hilfreiche Antwort.

Code posten hilft hier warscheinlich nicht oder?

Danke schonmal für eure Hilfe

lg Sythus


----------



## Guest (28. Feb 2008)

würde mich auch interessieren


----------



## The_S (28. Feb 2008)

Sythus hat gesagt.:
			
		

> Welche Elemente könnten mir helfen?



Schau dir mal die Klasse DefaultStyledDocument an bzw. generell das Interface Document. Mit Code kann ich leider nicht dienen, der liegt irgendwo vergraben auf meiner Festplatte (glaub ich zumindest  ).


----------



## zilti (28. Feb 2008)

Für n Editor eignet sich JEditorPane besser.


----------



## zilti (28. Feb 2008)

Für n Editor eignet sich JEditorPane besser.


----------



## Sythus (28. Feb 2008)

Okay danke,

hab mich mal drangesetzt aber habe ein Problem:


```
package guiPackage;

import java.awt.Color;

import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;



class Text extends JTextPane  {

	private static final long serialVersionUID = 1L;

	Text(int Zeilen, int Spalten) {
		super();
		setBackground(Color.white);
	}
	public void append(Color c, int start, int end, String selectedText) { // better implementation--uses StyleContext
		 
		 StyleContext sc = StyleContext.getDefaultStyleContext();
		 AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,
		                                     StyleConstants.Foreground, c);

		
		setCaretPosition(start); 
		setCharacterAttributes(aset, false);
		 
		 
		replaceSelection(selectedText);
	}


}
```


```
private void Font_aktualisieren() {

			String farbe = (String) farben.getSelectedItem();

			int start = compTField.getSelectionStart();
			int end = compTField.getSelectionEnd();
			String selectedText = compTField.getSelectedText();
			
			
			//Farben
			if (farbe.equals("Schwarz"))
				compTField.append(Color.black, start, end, selectedText);

			if (farbe.equals("Rot"))
				compTField.append(Color.red, start, end, selectedText);

			if (farbe.equals("Grün"))
				compTField.append(Color.green, start, end, selectedText);

			if (farbe.equals("Blau"))
				compTField.append(Color.blue, start, end, selectedText);

			if (farbe.equals("Magenta")) 
				compTField.append(Color.magenta, start, end, selectedText);

			if (farbe.equals("Cyan"))
				compTField.append(Color.cyan,  start, end, selectedText);

			if (farbe.equals("Gelb"))
				compTField.append(Color.yellow,  start, end, selectedText);
			
			
		}

	}
```


Also Klasse Text regelt nun auch markierten Text zu formatieren, in fontaktualisieren wird anfang und ende ausgelesen und dann jenachdem welche Farbe angewählt ist die append Funktion aus der Klasse Text aufgerufen.

Pro: Es funktioniert, der markierte Text wird eingefärbt
Problem: er wird einfach hintendran gesetzt, d.h. der ungefärbte einst markierte Text bleibt stehen und ich kriege es einfach nicht hin, das dass alte markierte einfach weggelöscht wird!

Hier zum verständnis








Danke schonmal für eure Hilfe

PS: @ Zilti
wenn ich JEditorPane benutze kann ich die Funktion setCharacterAttributes(aset, false) aus Text ->Funktion append nicht benutzen und es klappt überhaupt nicht, daher bleibe ich erstmal bei JTextPane


----------



## Sythus (28. Feb 2008)

Keine ne Idee? Sitz nun schon ne weile dran, aber nix geht Oo


----------



## The_S (29. Feb 2008)

Sei mal nicht so ungeduldig. So schnellen support wie hier bekommst du  normal nichtmal bei einem kostenpflichtigen Angebot!

Du hängst ja auch alles hintendran an dein compTField (append). Du musst zuerst das markierte löschen und dann über insert an der gewünschten Stelle wieder einfügen.


----------



## Sythus (29. Feb 2008)

Huhu,

sorry ungeduldig sollte das nicht wirken!! Bin ja dankbar für jede Hilfe die ich kiege.

Das Löschen ist ja genau mein Problem, ich kriege es nicht hin. 
Da gibt es irgendwie nichts was löschen kann, kam bisher nur auf die Idee den kompletten Text bis kurz vor der Markierung komplett neu in das Textfeld zu schreiben und danach erst den Farbigen teil.
Das ist aber auch nicht besonders effizient und hinbekommen hab ich es auch nicht :/


bin wirklich für jede Hilfe Dankbar
LG Sythus


----------



## MiDniGG (29. Feb 2008)

So. Ich versuchs dann mal...

Also. Als erstes erstmal die länge und Position vom String bestimmen:


```
.getSelectionStart();
.getSelectionEnd();
```

Als nächstes tust dann mit em SimpleAttributeSet und der Position das Style über den StyleConstants setzen. So etwa:


```
private void setBold(SimpleAttributeSet sas, int pos) {
		
        if(StyleConstants.isBold(sas))
        {
        	StyleConstants.setBold(sas, false);
        }
        else
        {
        	StyleConstants.setBold(sas, true);
        }
        setCharacterAttributes(pos, 1, sas, true);
	}
```

Mit der if-Abfrage schaust einfach ob der markierte Text schon fett is oder ned...

mit .setBold eben fett machn. und dieses setCharacterAttributes schaust eben jedes einzelne Zeichen an und kehrst ihn um ...

So. Besser kann ich s leider ned erklären. Vielleicht hilft es ja. Bei weiteren Fragen wende dich an Hobbit ;-)

cya & have a nice weekend!!!


----------



## Sythus (29. Feb 2008)

Sehr cool!! Danke!!!
Das hilft mir auch bei meinem nächsten vorhaben weiter=)

Schönes Wochenende


----------



## The_S (3. Mrz 2008)

wichtig ist evtl. noch, dass diese setBold-Methode (+ Konsorten) in dein StyledDocument müssen (welches du deiner JEditorPane zuweist), und dass du dir das SimpleAttribute set für den zu veränderten Text auslesen solltest, da du sonst alle bereits gesetzten Attribute wieder überschreibst.

[edit] Das ist vermutlich auch ganz interessant für dich  http://www.java-forum.org/de/viewtopic.php?p=390750#390750


----------

