bestimmte Zeichen eines Strings einfärben

Steppo110

Grünschnabel
Hi,
ich möchte ein Programm schreiben, in dem ich ausgewählte Buchstaben eines Strings einfärben kann. Sowie das hier auf dieser Seite funktioniert:

http://www.ebi.ac.uk/cgi-bin/proteincol/ProteinColourer.pl

Ich habe auch schon probiert htlm einzubinden, um Zeichen einzufärben. Dabei habe ich herausgefunden das das scheinbar nicht mit einer jTextArea funktioniert. Deshalb habe ich den jEditorPane und auch den jTextPane genommen. Trotzdem funktioniert es nicht. :(
Hat jemand eine Idee, wie ich mein Vorhaben in die Tat umsetzen kann?

Vielen Dank im Voraus :)
 
Du könntest mit RTFEditorKit (javax.swing.text.rtf) arbeiten, den Text analysieren und wenn eine gewisse Zeichenfolge kommt diese mit RTF-Tags einfärben.
An sonsten müsstest du die Renderer-Klasse einer JTextPane/JEditorPane überschreiben, was vermutlich sehr aufwändig wird.
 
Es geht auf jeden Fall mit HTML und JEditorPane! Beispiel:
Java:
JEditorPane editor = new JEditorPane("text/html","<P><FONT COLOR=blue>blue</FONT></P>");
 
Hey,

sobald man versucht den Style eines Textes zu verändern, haben die hierfür nötigen Komponenten fast immer das Prefix "Rich" im Namen, wie z.B. RichTextBox usw. - Einfach mal googlen, da wirste auf jeden fall fündig.

Gruß

Sebastian
 
Hi,
vielen Dank. Ich habs jetzt doch mit HTML und dem JEditorPane hinbekommen. :) Jetzt steh ich vor dem Problem, dass ich ausgewählte Buchstaben aus einem String färben will. Also ich habe eine jTextArea ein jTextField einen jButton und den jEdittorPane. Ich habe einen String definiert, der den Text aus der Area holt z.B. String Text = jTextArea.getText(), als nächstes habe ich das mit dem TextField auch so gemacht z.B. String rot = jTextField.getText().
Jetzt wolte ich replace nutzen also: Text = Text.replace(rot, "<font color=red>" + rot + "</font>") und dann mit dem Klick auf den Button im jEditorPane ausgeben, mit jEditorPane.setText(Text). Das funktioniert auch, solange die Buchstaben, die ich in das TextField reinschreibe im String aneinander liegen oder ich nur einen Buchstaben verwende aber z.B. wenn der String Text = "ASDFGH" heißt und ich möchte nur ADG einfärben funktioniert das nicht mehr. Könnt ihr mir sagen was ich falsch mache?
Ich habs nochmal kopiert, für den Fall, dass mein Text etwas verwirrend ist:

Text = jTextArea.getText();
rot = jTextField.getText();
blau = jTextField1.getText();
Text = Text.replace(rot, "<font color=red>" + rot + "</font>");
Text = Text.replace(blau, "<font color=blue>" + blau + "</font>");

jEditorPane.setText(Text);
 
Zuletzt bearbeitet:
Dann müsstest du mit replaceAll() und RegEx arbeiten *API > java.util.regex.Pattern ... sehr schöne Übersicht und Erklärung*.
Da das ganze aber ziemlich tricky ist und du die Strings des JTextFields erstmal mit einer weiteren RegEx bearbeiten müsstest wäre das ne ganze Menge Code ... leider ... für einen so simplen Effekt.
Was du vor hast wurde ja am Beispiel wunderbar gezeigt ... jedoch ist sowas weit aus komplexer als es aussieht.
 
Hallo, das geht aber auch ohne HTML.

dein Problem hat doch Ähnlichkeit mit dem Highliten von Keywords, oder?

Hier mal nen Code den ich zum Highliten von Batch-Scripten verwendet habe:
Java:
doc = new HighlitedBatchDocument();
text = new JTextPane(doc);
Java:
package batch;

import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class HighlitedBatchDocument extends DefaultStyledDocument {

    private static final String[] keywords = {  "pause", "color ", "cls", "if ", "shutdown ", "mode ", "for ", "do ", "set ", "start ", "copy ", "xcopy ", "mkdir ",
                                                "md ", "taskkill ", "ren ", "ping ", "title ", "goto ", ":"   };

    public void highlightText() {
        // Schutz vor overflow
        Runnable thread = new Runnable() {
            public void run() {
                String text = null;
                try{
                    text = getText(0, getLength());
                }
                catch(BadLocationException ex){
                }
                // erstmal wieder alles in schwartz
                setForeground(0, text.length(), Color.black);
                int index = text.indexOf("@");
                while(index != -1){
                    // "@" in blau
                    setForeground(index, index+1, Color.magenta);
                    index = text.indexOf("@", index+1);
                }
                // andere Schlüsselwörter in Blau
                for(String keyword : keywords){
                    index = text.indexOf(keyword);
                    while(index != -1){
                        setForeground(index, index+keyword.length(), Color.blue);
                        // Rest der Zeile in Schwartz
                        setForeground(index+1+keyword.length(), text.indexOf("\n", index+1+keyword.length()), Color.black);
                        index = text.indexOf(keyword, index+1);
                    }
                }
                index = text.indexOf("echo");
                while(index != -1){
                    // "echo" in blau
                    setForeground(index, index+4, Color.blue);
                    // Text von "echo" in orange
                    setForeground(index+5, text.indexOf("\n", index+5), Color.orange);
                    index = text.indexOf("echo", index+1);
                }
                index = text.indexOf(" on");
                while(index != -1){
                    // "on" in blau
                    setForeground(index+1, index+3, Color.black);
                    index = text.indexOf(" on", index+1);
                }
                index = text.indexOf(" off");
                while(index != -1){
                    // "off" in blau
                    setForeground(index+1, index+4, Color.black);
                    index = text.indexOf(" off", index+1);
                }
                index = 0;
                // Variablen (z.B. %testvar%) in schwartz
                int firstModulo = 0;
                while(index != -1 && firstModulo != -1){
                    if(firstModulo == 0){
                        firstModulo = text.indexOf("%", index+1);
                    }
                    else{
                        index = text.indexOf("%", firstModulo+1);
                        setForeground(firstModulo, index+1, Color.black);
                        firstModulo = 0;
                    }                   
                }
                // Variablen (z.B. %%i) in schwartz
                index = text.indexOf("::");
                while(index != -1){
                    // Kommentare in Hellgrau
                    setForeground(index, text.indexOf("\n", index), Color.gray);
                    index = text.indexOf("::", index+1);
                }
                index = text.indexOf(">>");
                while(index != -1){
                    // ">>" in blau
                    setForeground(index, index+2, Color.blue);
                    // Text nach ">>" in schwartz
                    setForeground(index+2, text.indexOf("\n", index+2), Color.black);
                    index = text.indexOf(">>", index+1);
                }
                index = text.indexOf("::");
                while(index != -1){
                    // Kommentare in Hellgrau
                    setForeground(index, text.indexOf("\n", index), Color.gray);
                    index = text.indexOf("::", index+1);
                }
            };
        };
        EventQueue.invokeLater(thread);
    }

    public void setForeground(int startPosition, int endPosition, Color col) {
        for(int i = startPosition; i < endPosition; i++){
            setForeground(getSimpleAttributeSet(i), i, col);
        }
    }

    private void setForeground(SimpleAttributeSet sas, int pos, Color col) {
        StyleConstants.setForeground(sas, col);
        setCharacterAttributes(pos, 1, sas, true);
    }

    private SimpleAttributeSet getSimpleAttributeSet(int pos) {
        Element ele = getCharacterElement(pos);
        AttributeSet as = ele.getAttributes();
        SimpleAttributeSet sas = new SimpleAttributeSet(as);
        return sas;
    }

}

hoffentlich klappts damit, ist natürlich keine direkte Lösung für dein Problem, aber so siehst du, wie es ohne HTML funktioniert.

Gruß
 
Gut ... mit nem StyledDocument rumspielen ist mir nicht eingefallen ... ich finde es aber gerade für Swing-Komponenten ne gute Lösung.
 
Zurück