tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
485
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Steppo110 Steppo110 ist offline Grünschnabel
    Registriert seit
    Sep 2011
    Beiträge
    2
    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/protein...einColourer.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
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    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.
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Es geht auf jeden Fall mit HTML und JEditorPane! Beispiel:
    Code java:
    1
    
    JEditorPane editor = new JEditorPane("text/html","<P><FONT COLOR=blue>blue</FONT></P>");
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  4. #4
    sebastianb sebastianb ist offline Mitglied Gold
    Registriert seit
    Dec 2009
    Beiträge
    125
    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
     

  5. #5
    Steppo110 Steppo110 ist offline Grünschnabel
    Registriert seit
    Sep 2011
    Beiträge
    2
    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);
    Geändert von Steppo110 (14.09.11 um 13:30 Uhr)
     

  6. #6
    SE Tutorials.de Gastzugang
    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.
     

  7. #7
    Avatar von javaDeveloper2011
    javaDeveloper2011 javaDeveloper2011 ist offline Mitglied Brokat
    Registriert seit
    Feb 2011
    Beiträge
    445
    Blog-Einträge
    5
    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:
    Code java:
    1
    2
    
    doc = new HighlitedBatchDocument();
    text = new JTextPane(doc);
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    
    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ß
     

  8. #8
    SE Tutorials.de Gastzugang
    Gut ... mit nem StyledDocument rumspielen ist mir nicht eingefallen ... ich finde es aber gerade für Swing-Komponenten ne gute Lösung.
     

Ähnliche Themen

  1. letztes Zeichen eines Strings auslesen
    Von supercat1510 im Forum PHP
    Antworten: 8
    Letzter Beitrag: 10.07.09, 23:29
  2. Bestimmte Teile eines Strings auslesen
    Von ShOrtYk im Forum PHP
    Antworten: 6
    Letzter Beitrag: 01.09.07, 17:01
  3. Antworten: 2
    Letzter Beitrag: 12.10.04, 16:07
  4. Erste x Zeichen eines Strings formatieren
    Von raspunicum im Forum PHP
    Antworten: 4
    Letzter Beitrag: 06.09.04, 16:50
  5. Antworten: 2
    Letzter Beitrag: 29.10.03, 13:05