Farben in Textpane

Status
Nicht offen für weitere Antworten.

Freeaak

Mitglied
Hallo,
wie kann ich es einfach realisieren, in einem Swing-Textpane mehrfarbigen Text (auch fett/kursiv/usw) darzustellen?

Gruß Freeaak
 

Freeaak

Mitglied
Wie gesagt, ich verstehe nicht, wie man diese Klasse benutzt. Dadurch kann ich sie auch nicht ausprobieren
 

The_S

Top Contributor
Und in 20 Minuten hast du jetzt alles dazu durchgelesen, Tutorials, die du bei Google/Forensuche gefunden hast durchgearbeitet, selbst etwas ausprobiert und dich in Online-Büchern über das Thema schlau gemacht? Respekt, bist ja wahnsinnig schnell!

Ein kleines Beispiel:

Code:
StyledDocument doc = deinTextPane.getStyledDocument();
SimpleAttributeSet color = new SimpleAttributeSet();
StyleConstants.setForeground(color, Color.RED);
doc.setCharacterAttributes(start, end, color, true);
 

Freeaak

Mitglied
Danke für das Beispiel. Google hat nicht viel brauchbares ausgespuckt und im GalileoComputing-Buch habe ich auch nichts dazu gefunden.
 

Freeaak

Mitglied
Ich habe vor, bestimmte Zeichenketten (beispielsweise der Text zwischen den HTML-<>-Klammern) im Textpane hervorzuheben. Jedoch funktioniert das in Java leider nicht so einfach wie in PHP (preg_replace() usw...). Daher habe ich mir diese kleine methode zusammengebastelt.
Code:
public void highlight(JTextPane textPane) {
        StyledDocument doc = textPane.getStyledDocument();
        boolean hl = false;
        String text = textPane.getText();
        for(int i = 0; i < text.length(); i++)
        {
            if(text.substring(i,i+1).equals("<"))
                hl = true;
            if(hl)
                doc.setCharacterAttributes(i,1,color,true);
            if(text.substring(i,i+1).equals(">"))
                hl = false;
        }
    }

Mein Problem: Die methode hat probleme mit zeilenumbrüchen. Wie ich das beheben kann und woran es genau liegt, weiß ich nicht.
Meine Frage: Gibt es eine bessere Methode für ein einfaches Syntax-Highlighting?

Gruß Freeaak

EDIT: Ich habe festgestellt, dass die substring-Methode generell Probleme bei Zeilenumbrüchen macht. Gibt es dafür eine Lösung?
 

The_S

Top Contributor
Warum sollte substring Probleme mit Zeilenumbrüchen haben? Definiere "Probleme". Wenn du zu nem Schuldenberater gehst, sagst du dem ja auch nicht nur, dass du "Probleme" mit der Schufa hast, sondern erklärst wie es dazu gekommen ist, was du dir vorstellst, wie tief du schon in der Scheiße stehst, ... ;) .
 

Freeaak

Mitglied
Hobbit_Im_Blutrausch hat gesagt.:
Warum sollte substring Probleme mit Zeilenumbrüchen haben?
Das Problem sieht folgendermaßen aus:
Bei der ersten Zeile wird der Text korrekt gehighlightet, aber ab der zweiten zeile wird das highlight nach hinten verschoben. Probier es am besten selbst aus.
 

The_S

Top Contributor
Was ist denn bei dir ein Zeilenumbruch? \r\n oder nur \n? Ggf. vorher alle \r\n durch \n ersetzen.
 

Freeaak

Mitglied
Ich bin gerade auf etwas recht interessantes gestoßen:
http://syntax.jedit.org/
Mal schauen, ob ich das was mit hinbekomme.

EDIT: Ich bin gerade dabei den HTMLTokenMarker umzuschreiben, sodass er die Strings vernünftig parst :)
Klappt soweit

EDIT2: Hmm habe es soweit umgebaut bekommen, jedoch lässt es sich nicht in mein Projekt einbauen... =.=
 

Freeaak

Mitglied
So... Ich habe nun selbst eine Highlight-Methode geschrieben. Sie funktioniert hervorragend, nur ist sie extrem langsam. Sieht jemand eine Möglichkeit sie zu beschleunigen, oder brauche ich dafür einen ganz neuen Denkansatz?

Code:
    public void htmlText(JTextPane pane)
    {        
        StyledDocument pDoc = pane.getStyledDocument();
        String text = pane.getText();
        text = text.replaceAll("\r","");
        char[] array = new char[text.length()];
        text.getChars(0,text.length(),array,0);
        int level = 0;
        for(int i = 0; i < text.length(); i++)
        {
            char c = array[i];
            switch(level)
            {
                // Normaler Text
                case 0:
                    pDoc.setCharacterAttributes(i, i, normal, true);
                    if(c == '<')
                    {
                        if(array[i+1] == '!' && array[i+2] == '-' && array[i+3] == '-')
                        {
                            level = 4;
                            pDoc.setCharacterAttributes(i, i, grey, true);
                            break;
                        }
                        level = 1;
                    }
                    break;
                // Innerhalb eines Tags
                case 1:
                    if(c == '>')
                    {
                        level = 0;
                        pDoc.setCharacterAttributes(i, i, normal, true);
                        break;
                    }
                    if(c == ' ')
                    {
                        level = 2;
                        break;
                    }
                    pDoc.setCharacterAttributes(i, i, red, true);
                    break;
                // Attribute des Tags
                case 2:
                    if(c == '>')
                    {
                        pDoc.setCharacterAttributes(i, i, normal, true);
                        level = 0;
                        break;
                    }
                    if(c == '"')
                    {
                        level = 3;
                        pDoc.setCharacterAttributes(i, i, blue, true);
                        break;
                    }
                    pDoc.setCharacterAttributes(i, i, black, true);
                    break;
                // Werte der Attribute in "..."
                case 3:
                    pDoc.setCharacterAttributes(i, i, blue, true);
                    if(c == '"')
                    {
                        level = 2;
                    }
                    break;
                // Kommentare 
                case 4:
                    pDoc.setCharacterAttributes(i, i, grey, true);
                    if(c == '-' && array[i+1] == '-' && array[i+2] == '>')
                    {
                        pDoc.setCharacterAttributes(i+1, i+1, grey, true);
                        pDoc.setCharacterAttributes(i+2, i+2, grey, true);
                        i+=3;
                        level = 0;
                    }
                    break;
            }
        }
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JavaFX Farben dynamisch anpassen AWT, Swing, JavaFX & SWT 4
L JavaFX Fehler beim setzen von Farben AWT, Swing, JavaFX & SWT 16
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
M UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 9
M Swing UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 0
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
M AWT Farben in Bild ersetzen AWT, Swing, JavaFX & SWT 11
B Bild bearbeiten mit Transparenz (spiegeln, Farben austauschen) AWT, Swing, JavaFX & SWT 8
O keine ähnliche Farben durch Random in Java AWT, Swing, JavaFX & SWT 21
E JTable farben ändern AWT, Swing, JavaFX & SWT 2
T Kontrast zweier Farben vergleichen AWT, Swing, JavaFX & SWT 5
J Auf die im Look and Feel eingestellten Farben zugreifen AWT, Swing, JavaFX & SWT 2
M Swing Zweidimensionales Array mit Farben erzeugen AWT, Swing, JavaFX & SWT 16
A AWT HSB-Farben dynamisch berechnen AWT, Swing, JavaFX & SWT 5
C JTable: Mehrere Farben in einer Zelle darstellen AWT, Swing, JavaFX & SWT 10
T bei einem jtextfield Farben benutzen AWT, Swing, JavaFX & SWT 7
K Farben in JMenues AWT, Swing, JavaFX & SWT 2
K Farben bei JMenus AWT, Swing, JavaFX & SWT 5
D Farben JList AWT, Swing, JavaFX & SWT 4
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
D ComboBox mit Farben aus java.awt.color AWT, Swing, JavaFX & SWT 4
T Die Schrift in verschiedenen Farben blinken zu lassen AWT, Swing, JavaFX & SWT 2
G Knoten im Jtree mit unterscheidlichen Farben darstellen AWT, Swing, JavaFX & SWT 5
T verschiedene Farben in einem Text/Editfeld AWT, Swing, JavaFX & SWT 11
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2
V Farben setzen bei einigen Komponenten (JScrollBar, . AWT, Swing, JavaFX & SWT 3
M Farben im TextArea AWT, Swing, JavaFX & SWT 5
T extends JButton übernehmen Farben AWT, Swing, JavaFX & SWT 4
S RGB Farben addieren AWT, Swing, JavaFX & SWT 1
B JList Zeilen in verschiedenen Farben markieren. AWT, Swing, JavaFX & SWT 3
K JTextArea mit verschiedenen Farben betreiben [Chat] AWT, Swing, JavaFX & SWT 3
G JTextArea.append() in verschiedenen Farben AWT, Swing, JavaFX & SWT 2
M Image: Kontrast, Helligkeit und Farben ändern? AWT, Swing, JavaFX & SWT 15
Icewind Verschiedene Farben in einer JTextArea AWT, Swing, JavaFX & SWT 3
W Editor Syntax Farben AWT, Swing, JavaFX & SWT 2
R Farben ändern AWT, Swing, JavaFX & SWT 2
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
S Swing TextPane größe beschränken AWT, Swing, JavaFX & SWT 2
D Swing TextPane Größe AWT, Swing, JavaFX & SWT 12
R TextPane mit variabler Größe AWT, Swing, JavaFX & SWT 8
M DRINGEND HILFE TextPane RECHTSBÜNDIG AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben