# JTextPane Bold Italic und Co



## Enigma228 (18. Aug 2009)

Ich möchte ein TextPane nutzen..
über dem Textpane sollen wie z.B. bei word drei Buttons sein mit Bold, Italic und underline.
Beispiele habe ich aber bis jetzt nur für Menu gefunden die nach folgenden Schema verfahren:

```
Action boldAction = new BoldAction();
boldAction.putValue(Action.NAME, "Bold");
styleMenu.add(boldAction);
```

Aber ich möchte es über Buttons machen und habe es bisher so probiert:


```
attr = new SimpleAttributeSet();
StyleConstants.setFontSize(attr, 12);
....
if(e.getActionCommand().equalsIgnoreCase("italic")){
	if(tp_text.getSelectedText()!=null){
		int start, end;
		start = tp_text.getSelectionStart();
		end = tp_text.getSelectionEnd();
		try {
			StyleConstants.setItalic(attr, attr.containsAttribute(StyleConstants.Italic, false));
			/*if(attr.containsAttribute(StyleConstants.Italic, false)){
				System.out.println("setItalic wird auf false gesetzt");
				StyleConstants.setItalic(attr, attr.containsAttribute(StyleConstants.Italic, false));
			}else{
				System.out.println("setItalic wird auf True gesetzt");
				StyleConstants.setItalic(attr, attr.containsAttribute(StyleConstants.Italic, true));
			}*/
			doc.replace(tp_text.getSelectionStart(), tp_text.getSelectedText().length(),
					tp_text.getSelectedText(), attr);
			tp_text.requestFocus();
			tp_text.setSelectionStart(start); // solten eigentlich den Text wieder farblich markieren
			tp_text.setSelectionEnd(end); // hatte aber nicht den gewünschten Effekt
			tp_text.setCaretPosition(end);//wenn keine Markierg mögl., dann CursorPos. ans Ende der Ex-Sel.
		} catch (BadLocationException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
}
```
Effekt: beim ersten Button Klick passiert gar nix ausser das Markierung verschwindet, erst wenn ich den Text ein 2tes mal selektiere und auf den Button drücke funkt. es wie "gewünscht"?
2. Fehler bei der ganzen Sache ist: wenn ich dann einen anderen Bereich markiere und er soll zum Bsp. Underline machen macht er natürlich auch italic + underline weil es ja im AttributSet so drin steht...
Irgendwie erscheint mir auch die Abfrage:

```
attr.containsAttribute(StyleConstants.Italic, false);
```
nicht richtig verwendet von mir.. hier sollte sie anzeigen ob im AttributSet Italic bereits drin ist und als Ergebnis wenn Text nicht kursiv ist, sollte true sein..

*Meine Vermutung ist das man jeweils vorher den aktuellen AttributSet des ersten Buchstabens der Selection herausfinden muss um dann das Attributset zu erweitern.. aber wie?*

Hat jemand eine Idee?

Vielen Dank 
Thomas


----------



## sibianu (19. Aug 2009)

ich benutze die Buttons folgendermassen:

```
JToggleButton    ButItalic        = new  JToggleButton(new StyledEditorKit.ItalicAction());
```


----------



## Enigma228 (19. Aug 2009)

Danke für den Tip!!

Ich habe eine Ähnliche Lösung gefunden gehabt, mit der ich keinen ActionListener schreiben brauche:

```
Action action = new StyledEditorKit.BoldAction();
action.putValue(Action.NAME, "<HTML><B>F</B></HTML>");
b_bold = new JButton(action);
```
JToggleButton hat hier den Nachteil er bleibt auf "gedrückt" Status und erst beim zweiten drücken wieder normal.. das setzt wieder voraus das ich herausbekomme, welches AttributSet auf den ersten markierten Buchstaben um den JToggleButton einen entsprechenden Status zu erteilen (gedrückt, nicht gedrückt).
Also habe ich mich für die einfachere Variante entschieden und beide zusammengefasst:


```
b_bold = new JButton(new StyledEditorKit.BoldAction());
b_bold.setText("<HTML><B>F</B></HTML>");
```

Trotzdem vielen Dank!!!


----------



## sibianu (19. Aug 2009)

dafür setze ich meine Buttuns immer richtig wenn ich irgendwo im Text rumspringe, genau wie Word.


----------



## Enigma228 (20. Aug 2009)

Weisst du auch noch wie ich die aktuelle Fontsize Grösse herausbekomme?


----------



## sibianu (21. Aug 2009)

```
MutableAttributeSet set = editor.getEditorKit().getInputAttributes();
getStyledDocument().getFont(set).getSize();
```

So in der Art benutze ich das, klappt also.


----------



## Enigma228 (21. Aug 2009)

Danke ich probiers mal!!


----------

