# JEditorPane: angezeigter Text



## geisi (2. Jun 2006)

Wenn ich 
	
	
	
	





```
jEditorPane1.getText();
```
 ausführe, bekomme ich immer den ganzen text mit html-tags zurück, wie kann ich aber denn text ohne html-tags bekommen, also nur den angezeigten text?

mfg geisi


----------



## Mörketid (2. Jun 2006)

hi, ich heme an, du brauchst ein jeditorpane, oder? vielleicht kannst du den content type setzen? also _text/plain_?

gruß


----------



## geisi (2. Jun 2006)

dann kann ich aber den text nicht formatieren, oder?


----------



## The_S (2. Jun 2006)

Hast du das JEditorPane auf editable(false) gesetzt?


----------



## geisi (2. Jun 2006)

nein


----------



## Mörketid (2. Jun 2006)

dann zeig mal alles, was du mit dem pane machst...also code 

gruß


----------



## geisi (2. Jun 2006)

ich glaube du hast mich falsch verstanden, also:

ich möchte mir einen editor basteln, mit dem man unterstreichen, zentrieren, färben, usw kann. wenn man jetzt einen text in meiner JEditorPane makiert und z.B. auf den U-Button (unterstreichen) drückt, soll der makierte Text unterstrichen werden. 

um den makierten text zu holen, hole ich mir zuerst die indices des makierten textes mit 
	
	
	
	





```
jEditorPane1.getSelectionStart(); und jEditorPane1.getSelectionEnd();
```
. 

diese indices basieren auf dem angezeigten text (OHNE html-tags). 
mache ich dann folgendes: 
	
	
	
	





```
String text = jEditorPane1.getText(); String selectedText = text.subString(selStart, selEnd);
```

dann steht auf selectedText etwas anderes als wirklich makiert wurde. 
Das kommt, weil mit jEditorPane1.getText(); den gesamten text MIT html-tags zurückgibt, so passen die indices nicht mehr zum text.


ich hoffe ich konnte mein programm so einigermaßen verständlich schildern, wenn nicht bitte fragen.
mfg geisi


----------



## Guest (2. Jun 2006)

Schau dir das Swing Beispiel Stylepad an (in jdk#.#.#/demo/jfc/Stylepad)
Solche Sachen sind bereits als Actions in JTextComponent bzw. im vorliegenden Editorkit definiert. 
Du brauchst diese nur zu verwenden, nicht neu zu schreiben.

Siehe: JTextComponent#getActions()
Schau dir am besten die Liste der Actions an.

```
JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");

for(Action action : editor.getActions())
{
  System.out.println(action.getValue(Action.NAME));
  System.out.println("    " + action);
}
```
Vergliche hierzu die Liste der in Stylepad verwendeten Actions 
in jdk#.#.#\demo\jfc\Stylepad\src\resources\Stylepad.properties


----------



## geisi (2. Jun 2006)

tut mir leid, aber ich habe keine ahnung, was du meinst


----------



## geisi (2. Jun 2006)

```
set-read-only
    javax.swing.text.DefaultEditorKit$ReadOnlyAction@5e179a
selection-down
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@15fadcf
selection-begin-line
    javax.swing.text.DefaultEditorKit$BeginLineAction@8c1dd9
activate-link-action
    javax.swing.text.html.HTMLEditorKit$ActivateLinkAction@fbb7cb
next-link-action
    javax.swing.text.html.HTMLEditorKit$NavigateLinkAction@1df8b99
font-size-48
    javax.swing.text.StyledEditorKit$FontSizeAction@1462851
select-word
    javax.swing.text.DefaultEditorKit$SelectWordAction@1010058
selection-page-right
    javax.swing.text.DefaultEditorKit$PageAction@bdab91
font-family-Serif
    javax.swing.text.StyledEditorKit$FontFamilyAction@4ac00c
select-all
    javax.swing.text.DefaultEditorKit$SelectAllAction@1865b28
InsertOrderedListItem
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@1cac6db
font-size-8
    javax.swing.text.StyledEditorKit$FontSizeAction@1c56c60
selection-page-down
    javax.swing.text.DefaultEditorKit$VerticalPageAction@4e280c
font-size-36
    javax.swing.text.StyledEditorKit$FontSizeAction@1275d39
insert-content
    javax.swing.text.DefaultEditorKit$InsertContentAction@1595f51
left-justify
    javax.swing.text.StyledEditorKit$AlignmentAction@80d1ff
selection-previous-word
    javax.swing.text.DefaultEditorKit$PreviousWordAction@15ac3c9
selection-page-up
    javax.swing.text.DefaultEditorKit$VerticalPageAction@1ebd75b
toggle-componentOrientation
    javax.swing.text.DefaultEditorKit$ToggleComponentOrientationAction@87c268
selection-end-word
    javax.swing.text.DefaultEditorKit$EndWordAction@ec4a87
insert-break
    javax.swing.text.StyledEditorKit$StyledInsertBreakAction@110fe28
caret-end-word
    javax.swing.text.DefaultEditorKit$EndWordAction@9e29fb
center-justify
    javax.swing.text.StyledEditorKit$AlignmentAction@1d64c37
InsertTable
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@25d2b2
page-up
    javax.swing.text.DefaultEditorKit$VerticalPageAction@12be1bd
font-size-24
    javax.swing.text.StyledEditorKit$FontSizeAction@1f17e77
beep
    javax.swing.text.DefaultEditorKit$BeepAction@1a5f739
InsertUnorderedList
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@109fd93
font-family-Monospaced
    javax.swing.text.StyledEditorKit$FontFamilyAction@e6ff0d
selection-page-left
    javax.swing.text.DefaultEditorKit$PageAction@172e449
InsertUnorderedListItem
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@1e97f9f
selection-begin-word
    javax.swing.text.DefaultEditorKit$BeginWordAction@b9b538
right-justify
    javax.swing.text.StyledEditorKit$AlignmentAction@288051
delete-previous
    javax.swing.text.DefaultEditorKit$DeletePrevCharAction@10045eb
caret-begin-line
    javax.swing.text.DefaultEditorKit$BeginLineAction@ee7a14
font-underline
    javax.swing.text.StyledEditorKit$UnderlineAction@90cb03
InsertHR
    javax.swing.text.html.HTMLEditorKit$InsertHRAction@6cb8
font-size-18
    javax.swing.text.StyledEditorKit$FontSizeAction@1e1a408
InsertOrderedList
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@d81784
font-size-16
    javax.swing.text.StyledEditorKit$FontSizeAction@f01a1e
selection-forward
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@142a80d
caret-forward
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@126f75b
font-size-14
    javax.swing.text.StyledEditorKit$FontSizeAction@139b78e
font-size-12
    javax.swing.text.StyledEditorKit$FontSizeAction@41d05d
font-bold
    javax.swing.text.StyledEditorKit$BoldAction@d6a05e
default-typed
    javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction@ba8602
font-size-10
    javax.swing.text.StyledEditorKit$FontSizeAction@1b3f8f6
font-family-SansSerif
    javax.swing.text.StyledEditorKit$FontFamilyAction@9df6f1
cut-to-clipboard
    javax.swing.text.DefaultEditorKit$CutAction@bf7190
select-line
    javax.swing.text.DefaultEditorKit$SelectLineAction@b8bef7
previous-link-action
    javax.swing.text.html.HTMLEditorKit$NavigateLinkAction@1016632
caret-end-paragraph
    javax.swing.text.DefaultEditorKit$EndParagraphAction@dc6a77
selection-up
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@d1e89e
caret-begin
    javax.swing.text.DefaultEditorKit$BeginAction@ff057f
copy-to-clipboard
    javax.swing.text.DefaultEditorKit$CopyAction@c1f10e
select-paragraph
    javax.swing.text.DefaultEditorKit$SelectParagraphAction@b8deef
font-italic
    javax.swing.text.StyledEditorKit$ItalicAction@1342ba4
InsertTableDataCell
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@1d332b
caret-up
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@10a6ae2
selection-end
    javax.swing.text.DefaultEditorKit$EndAction@ef2c60
caret-next-word
    javax.swing.text.DefaultEditorKit$NextWordAction@4a6cbf
caret-down
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@29ab3e
selection-next-word
    javax.swing.text.DefaultEditorKit$NextWordAction@1a99561
InsertPre
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@8e32e7
delete-next
    javax.swing.text.DefaultEditorKit$DeleteNextCharAction@1b000e7
selection-backward
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@b76fa
selection-end-line
    javax.swing.text.DefaultEditorKit$EndLineAction@b01d43
caret-begin-paragraph
    javax.swing.text.DefaultEditorKit$BeginParagraphAction@513cf0
set-writable
    javax.swing.text.DefaultEditorKit$WritableAction@177b3cd
selection-begin
    javax.swing.text.DefaultEditorKit$BeginAction@1bd7848
page-down
    javax.swing.text.DefaultEditorKit$VerticalPageAction@23e5d1
InsertTableRow
    javax.swing.text.html.HTMLEditorKit$InsertHTMLTextAction@c4fe76
caret-end
    javax.swing.text.DefaultEditorKit$EndAction@11e1e67
caret-backward
    javax.swing.text.DefaultEditorKit$NextVisualPositionAction@5e176f
caret-end-line
    javax.swing.text.DefaultEditorKit$EndLineAction@1549f94
unselect
    javax.swing.text.DefaultEditorKit$UnselectAction@b8c8e6
paste-from-clipboard
    javax.swing.text.DefaultEditorKit$PasteAction@18d9850
insert-tab
    javax.swing.text.DefaultEditorKit$InsertTabAction@10ab323
dump-model
    javax.swing.text.DefaultEditorKit$DumpModelAction@176e552
selection-end-paragraph
    javax.swing.text.DefaultEditorKit$EndParagraphAction@c980c9
selection-begin-paragraph
    javax.swing.text.DefaultEditorKit$BeginParagraphAction@12611a7
caret-begin-word
    javax.swing.text.DefaultEditorKit$BeginWordAction@51052d
caret-previous-word
    javax.swing.text.DefaultEditorKit$PreviousWordAction@12ad19e
```

was sagt mir das jetzt?


----------



## Guest (2. Jun 2006)

geisi hat gesagt.:
			
		

> tut mir leid, aber ich habe keine ahnung, was du meinst


Und du hast dir innerhalb von zwei Minuten das Stylepad-Beispiel angeschaut? :autsch:


----------



## geisi (2. Jun 2006)

wo finde ich das stylepad


----------



## Guest (2. Jun 2006)

geisi hat gesagt.:
			
		

> wo finde ich das stylepad


In jdk#.#.#/demo/jfc/Stylepad (habe ich doch geschrieben )


```
JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setEditable(false);

// Alle definierten Actions holen und ein Map eintragen (Name, Action)
Map<String, Action> map = new HashMap<String, Action>(128);
for(Action action : editor.getActions())
  map.put(action.getValue(Action.NAME), action);

// Die Action "font-underline" und "font-bold" holen und in einem Button stecken
JButton underlineButton = new JButton(map.get("font-underline"));
JButton boldButton = new JButton(map.get("font-bold"));
```
Jetzt mach das mal in deinem Code und klicke darauf, wenn der Text selektiert ist.
Geil was?


----------



## Guest (2. Jun 2006)

Kleine Korrektur
	
	
	
	





```
...
Map<Object, Action> map = new HashMap<Object, Action>(128); 
for(Action action : editor.getActions()) 
  map.put(action.getValue(Action.NAME), action);
...
```


----------



## geisi (2. Jun 2006)

habe jetzt folgendes gemacht:

```
import java.util.HashMap;
import java.util.Map;
import javax.swing.Action;
import javax.swing.JButton;
/*
 * asdf.java
 *
 * Created on 02. Juni 2006, 18:20
 */

/**
 *
 * @author  Admin
 */
public class asdf extends javax.swing.JDialog
{
    
    /** Creates new form asdf */
    public asdf(java.awt.Frame parent, boolean modal)
    {
        super(parent, modal);
        initComponents();
        Map<Object, Action> map = new HashMap<Object, Action>(128);
        for(Action action : jEditorPane1.getActions())
            map.put(action.getValue(Action.NAME), action);

        // Die Action "font-underline" und "font-bold" holen und in einem Button stecken
        jButton1.setAction(map.get("font-underline"));
        jButton2.setAction(map.get("font-bold"));
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
    private void initComponents()
    {
        jScrollPane1 = new javax.swing.JScrollPane();
        jEditorPane1 = new javax.swing.JEditorPane();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        jScrollPane1.setViewportView(jEditorPane1);

        jButton1.setText("jButton1");

        jButton2.setText("jButton2");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .add(layout.createSequentialGroup()
                        .add(jButton1)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 238, Short.MAX_VALUE)
                        .add(jButton2)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 243, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jButton1)
                    .add(jButton2))
                .addContainerGap())
        );
        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new asdf(new javax.swing.JFrame(), true).setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JEditorPane jEditorPane1;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration
    
}
```

aber passieren tut nichts.
bitte hilf mir noch einmal!
danke


----------



## Guest (2. Jun 2006)

```
...
jEditorPane1 = new javax.swing.JEditorPane();
jEditorPane1.setContentType("text/html");
oder
jEditorPane1.setContentType("text/rtf");
...
```
EditorPane ist bei Default text/plain und somit sind die font-### Actions 
nicht vorhanden, da sie aus javax.swing.text.StyledEditorKit stammen. 
Schau dir die Liste der Actions genauer an. Es sind unterschiedliche
EditorKits aufgelistet. text/plain sind die Basics in DefaultEditorKit,
StyledEditorKit erweitert diese und HTMLEditorKit erweitert wieder 
StyledEditorKit.


----------



## Guest (2. Jun 2006)

Bevor die Frage kommt... 
Dein Text erscheint nicht im Button, da AbstractButton.setAction(Action action) alle Properties 
der Action holt und im Button setzt. Dazu gehört auch Action.NAME als Label oder auch 
Action.SMALL_ICON, Action.SHORT_DESCRIPTION (Tooltip)

Das ermöglicht es Actions mit Icons, Tooltips, Label etc. zu definieren und mit einem
Einzeiler in AbstractButton (JButton, JMenuItem etc.) zu setzen.

Verwende für den Anfang am besten addActionListener(...)
	
	
	
	





```
jButton1.addActionListener(map.get("font-underline"));
jButton2.addActionListener(map.get("font-bold"));
```


----------



## geisi (3. Jun 2006)

danke! Das klappt ja super! Danke!

Aber ein paar fragen hätt ich noch: 
x) wie kann ich den makierten Text färben?
x) wenn ich auf den Button klicke, dann verschwindet auch die makierung im JEditorPane. Wie kann ich die Makierung trotzdem beibehalten?
x) ich habe für die Schriftgröße und Schriftart eine JComboBox gemacht. Wie kann ich den einzelnen ComboBox-Einträgen einen ActionListener zuweisen?


----------



## Guest (3. Jun 2006)

geisi hat gesagt.:
			
		

> x) wie kann ich den makierten Text färben?


Schau dir doch die EditorKits und das Stylepad-Beispiel an. Es sind darin Actions definiert, die das erledigen.
z.B.
	
	
	
	





```
Action pinkAction = new StyledEditorKit.ForegroundAction("set-foreground-pink", Color.PINK);
```



			
				geisi hat gesagt.:
			
		

> x) wenn ich auf den Button klicke, dann verschwindet auch die makierung im JEditorPane. Wie kann ich die Makierung trotzdem beibehalten?


Dies liegt daran, dass der Button den Focus an sich reisst.
Mach mal
	
	
	
	





```
jButton1.setRequestFocusEnabled(false); 
jButton2.setRequestFocusEnabled(false);
```



			
				geisi hat gesagt.:
			
		

> x) ich habe für die Schriftgröße und Schriftart eine JComboBox gemacht. Wie kann ich den einzelnen ComboBox-Einträgen einen ActionListener zuweisen?


Siehe StyledEditorKit.FontFamilyAction  und StyledEditorKit.FontSizeAction 
Entweder steckst du die Actions in die ComboBox und schreibst einen eigenen Renderer, oder
du reagierst auf Änderungen in der ComboBox und rufst die Actions auf.
Achte darauf, dass du beim Aufruf die Textkomponente als "source" im 
ActionEvent angibst.


----------



## geisi (3. Jun 2006)

mit 
	
	
	
	





```
Action orangeForeAction = new StyledEditorKit.ForegroundAction("set-foreground-orange", Color.ORANGE)
```
 kann man super einfach die schriftfarbe ändern. 
Aber es gibt aber nichts für background 
	
	
	
	





```
Action orangeBackAction = new StyledEditorKit.BackgroundAction("set-background-orange", Color.ORANGE) //gibt es nicht
```
wie löst man dieses Problem?


----------



## The_S (3. Jun 2006)

Ich hab zwar keine Lust mir den ganzen Thread durchzulesen aber



			
				geisi hat gesagt.:
			
		

> nein



du solltest es aber editable(false) setzen wenn du ein HTML-File anschauen möchtest


----------



## semi (3. Jun 2006)

geisi hat gesagt.:
			
		

> ```
> [code]...StyledEditorKit.BackgroundAction(...) //gibt es nicht
> ```


Na dann schau dir StyledEditorKit.ForegroundAction an und schreib eine, die 
den Hintergrund setzt. Dazu überschreibst du am besten StyledEditorKit.StyledTextAction

Sorry, aber ich habe den Eindruck, dass ich hier jeden einzelnen Schritt mit dir durchgehe
und du dir nicht mal das Stylepad Beispiel angeschaut hast.
Es ist ein richtig gutes Beispiel für das Vorgehen bei kleinen, textbasierten Anwendungen.
Insbesondere die ganze Erstellung von MenuItems und Buttons der Toolbar ist in Stylepad
sehr gut gelöst.

Gruß,
Michael


----------

