JTextPane, StyledDocument & UndoManager

Status
Nicht offen für weitere Antworten.
U

ugh_bough_

Gast
Hi.
Ich habe ein Problem und weiss nicht weiter. Kann mir jemand helfen?

1. Ich habe ein JTextPane.
2. Dieses JTextPane kommuniziert bei Textänderungen mit einem UndoManager.
3. Alles funktioniert prima.
4. Wenn ich aber anfange Teile des Texts zu highlighten (mit Hilfe von textPane.getStyledDocument().setCharacterAttributes(...) und einem Style, den ich vorher vom JTextPane bekommen und mit StyleConstants angepasst habe), so tun sich Probleme auf. Wenn ich direkt hinter einer gehighlighteten Stelle eine Zeile umbreche und dann "Undo" betätige, so ist auf einmal aller Text nach dem Umbruch verschwunden. Nur der Text, der vor dem Umbruch stand ist noch da.
5. Komischerweise kann man den Text mit einer neuen Betätigung von "Redo" wieder ins JTextPane reinholen und zwar so wie man es denken würde --- nämlich in dem Zustand genau nach dem Umbruch.

Ich denke mal dass es ziemlich aussichtslos ist, aber wenn doch jemand ne spontane Idee hat... :cry:
ugh_bough
 
R

Roar

Gast
1. das is gut :eek:)
2. besser :eek:)
3. schönschön :eek:)
4. whoa???
5. whoa?

also ich arbeite auch grad mit JTextPane, UndoManager und StyledDocuments und STyles zusammen ;) ;)
ein problem was ich da festgestellt hab, war, dass veränderungen der styles am styleddocument auch ein undo event auslösen. vielleicht ist das, was bei dir stört. ich hab das einfach so gelöst:
Code:
	        if(!"style change".equals(evt.getEdit().getPresentationName()))
					undo.addEdit(evt.getEdit());

das steht in der undoableEventHappened() ... das geht noch schöner,. bin aber im moment zu faul das zu implementieren. ich glaub auch, dass das nur geht wenn Locale auf EN ist. probiers mal zum testen ob das problem daran liegt, denn ich kann mir dein prob auch nich wirklich erklären ;)
 
U

ugh_bough_

Gast
danke für den tip. hatte vergessen zu erwähnen, dass ich das schon erledigt habe. In undoableEventHappened() werden nur die Events verarbeitet, die auch verarbeitet werden dürfen. Kommt auch ein bisschen auf die Knöpfe an, die man drückt --- da sind nicht alle erlaubt. Da ist der Haken aber auch nicht. Alles schon gecheckt. Das liegt echt an dem Sch*@!# Highlighting... naja... eigentlich ists ja ne schöne Sache, wenns funzt... :(
 
R

Roar

Gast
hmm...

kansnt du mir das prog ma schicken oder nen bisschen source posten? ich kann das prob wie gesagt nich nachvollziehen....
 

ugh_bough

Mitglied
Konstruktor des Panels, in dem sich alles abpielt:
Code:
    private PanelAnalysis()
    {
        initComponents();
        
        // set up styles for highlighting in the JTextPane
        styleNormal = jtpEditPane.addStyle("normal", null);
        styleNeedle = jtpEditPane.addStyle("needle", null);
        styleVector = jtpEditPane.addStyle("vector", null);
        
        StyleConstants.setBold(styleNeedle, true);
        StyleConstants.setBold(styleVector, true);
        StyleConstants.setForeground(styleVector, Color.BLUE);
        
        // important, because the undoableEditListener should not react to
        // eventType == CHANGE which is for example invoked on syntax highlighting
        jtpEditPane.getDocument().addDocumentListener(new DocumentListener()
        {
            public void changedUpdate(DocumentEvent e)  { eventType = e.getType(); }
            public void removeUpdate(DocumentEvent e)   { eventType = e.getType(); }
            public void insertUpdate(DocumentEvent e)   { eventType = e.getType(); }
        });
        
        // this listener takes care of undohandling
        // also updates the gui if user chanaged the text
        jtpEditPane.getDocument().addUndoableEditListener(new UndoableEditListener()
        {
            public void undoableEditHappened(UndoableEditEvent e)
            {
                if (eventType == DocumentEvent.EventType.CHANGE)
                    return;

                if (eventConsumed)
                    return;
                
                // save
                undoManager.addEdit(e.getEdit());
            }
        });
    }
das Panel hat die Members "eventType" und "eventConsumed", welche beschreiben, welche Art von Event auftrat und ob ein Event gültig ist.

diese Methode highlightet drei unterschiedliche Arten von Schlüsselwörtern. vorher reinigt sie alle bisherigen highlights. die wird immer beim gültigen input in das JTextPane aufgerufen und highlightet natürlich nur das richtige. ;)
Code:
    private void highlightSequence()
    {
        int index;
        String sequence = jtpEditPane.getText();
        
        // clear style
        jtpEditPane.getStyledDocument().setCharacterAttributes(0, sequence.length(), styleNormal, true);

        // add needle style
        int offset = 0;
        while ((index = sequence.indexOf(settings.needle, offset)) != -1)
        {
            jtpEditPane.getStyledDocument().setCharacterAttributes(index, settings.needle.length(), styleNeedle, true);
            offset = index + settings.needle.length();
        }
        
        // left vector
        index = sequence.indexOf(settings.vectLeft);
        if (index != -1)
            jtpEditPane.getStyledDocument().setCharacterAttributes(index, settings.vectLeft.length(), styleVector, true);
        
        // right vector
        index = sequence.indexOf(settings.vectRight);
        if (index != -1)
            jtpEditPane.getStyledDocument().setCharacterAttributes(index, settings.vectRight.length(), styleVector, true);
    }

und natürlich noch
Code:
    private void jbUndoActionPerformed(java.awt.event.ActionEvent evt) {                                       
        undoManager.undo();
        
        jbUndo.setEnabled(undoManager.canUndo());
        jbRedo.setEnabled(undoManager.canRedo());
        
        highlightSequence();
        jtpEditPane.requestFocus();
        
        jbReload.setEnabled(undoManager.canUndo());
    }
redoActionPerformed() ist analog aufgebaut.

*kopfkratz*
 

ugh_bough

Mitglied
streich zeile 25 im ersten code.
da hatte ich den fehler vermutet. hab das jetzt schon entfernt...
ist ja auch designmäßig klüger finde ich
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
T Swing xml in JTextPane mit EditorKit, StyledDocument & co. AWT, Swing, JavaFX & SWT 3
P JTextPane und StyledDocument AWT, Swing, JavaFX & SWT 5
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J Swing JTextpane aktuallisiert nicht den setText? AWT, Swing, JavaFX & SWT 9
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
S Swing Style Attribute aus JTextPane kopieren AWT, Swing, JavaFX & SWT 1
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
TheJavaKid JTextPane: komplexe Formatierung (links) AWT, Swing, JavaFX & SWT 2
B Swing JTextPane - Einfärbungen auf "default" AWT, Swing, JavaFX & SWT 2
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
T Hintergrundbild in JTextPane fixieren AWT, Swing, JavaFX & SWT 2
M Swing JTextPane frisst Anführungszeichen AWT, Swing, JavaFX & SWT 2
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
H Swing JTextPane hat unästhetisches Scrollbar AWT, Swing, JavaFX & SWT 3
R Swing Renderproblem bei HTML in einer JTextPane AWT, Swing, JavaFX & SWT 12
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
Tobse Swing [JTextPane] Farbliche Hervorhebung AWT, Swing, JavaFX & SWT 9
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
T Swing JTextPane Tastatureingabe abfangen AWT, Swing, JavaFX & SWT 4
B Durchsichtiges JScroll und JTextPane AWT, Swing, JavaFX & SWT 4
xehpuk Swing JTextPane in JScrollPane wird nicht ordentlich neugezeichnet AWT, Swing, JavaFX & SWT 3
S Swing JTextPane append formatprobleme AWT, Swing, JavaFX & SWT 5
C JTextPane / JEditorPane ohne Keywords farbig machen AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
S JEditorPane oder JTextPane? AWT, Swing, JavaFX & SWT 2
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
T Text in JTextPane vertikal (!) zentrieren AWT, Swing, JavaFX & SWT 4
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M JTextPane - bewegungsloses Hintergrundsbild (Duplikat) AWT, Swing, JavaFX & SWT 2
B JTextPane formatierten Inhalt speichern AWT, Swing, JavaFX & SWT 2
E JTextPane setText ignoriert \n AWT, Swing, JavaFX & SWT 6
P Swing Sichtbaren teil eines JTextPane herausbekommen (mit JScrollPane) AWT, Swing, JavaFX & SWT 2
C Swing JTextPane zeigt HTML-Text aus Variable nicht an :( AWT, Swing, JavaFX & SWT 3
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
K Swing JTextPane Formatierungen SyntaxHighlighting AWT, Swing, JavaFX & SWT 11
F Mit TAB JTextPane wechseln AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
S Buchstabenpositionen in JTextPane erhalten..? AWT, Swing, JavaFX & SWT 5
I JTextPane und Hyperlink (ohne JEditorPane) AWT, Swing, JavaFX & SWT 5
T Swing JTextArea, JTextPane, JEditorPane...Unterschied?! AWT, Swing, JavaFX & SWT 3
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
P Drucken von Jtextpane mit Seitenangabe AWT, Swing, JavaFX & SWT 1
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
A JTextPane: Text hinzufügen AWT, Swing, JavaFX & SWT 9
E Swing JTextPane Inhalt(Text und Bilder) als HTML text bekommen AWT, Swing, JavaFX & SWT 3
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
E Swing JTextPane linewrap AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
M Formatierungsfehler JTextPane WARUM ?? AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
E JTextPane Bold Italic und Co AWT, Swing, JavaFX & SWT 6
M JTextPane Ende des Feldes AWT, Swing, JavaFX & SWT 4
D JTextPane - Text andersfarbig unterstreichen AWT, Swing, JavaFX & SWT 7
P Probleme mit JTextpane AWT, Swing, JavaFX & SWT 7
M Größe von JTextPane manuell bei Bedarf anpassen AWT, Swing, JavaFX & SWT 6
bugmenot JTextPane String stimmt nicht mit übergebenem String überein AWT, Swing, JavaFX & SWT 9
C JTextPane <br oder <p> statt \n AWT, Swing, JavaFX & SWT 2
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
G JTextPane durchsichtig? AWT, Swing, JavaFX & SWT 6
GilbertGrape Fehler bei HTML in JTextPane AWT, Swing, JavaFX & SWT 2
S JTextPane: Probem mit AlignmentAction AWT, Swing, JavaFX & SWT 3
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
B JTextPane und Image importieren in HTML String. AWT, Swing, JavaFX & SWT 2
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J Html in JTextPane anzeigen? AWT, Swing, JavaFX & SWT 2
Steev JTextPane mit Textformatierung funktioniert nicht AWT, Swing, JavaFX & SWT 5
S JTextPane - markierten Text Formatieren AWT, Swing, JavaFX & SWT 11
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
M Makierten Text in JTextPane zentrieren AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
G insert & JTextPane AWT, Swing, JavaFX & SWT 4
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
R JTextPane scrollen vermeiden AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
A JScrollPane in JTextPane AWT, Swing, JavaFX & SWT 2
B Swing Logging: Ein/Ausblenden eines scrollenden JTextPane AWT, Swing, JavaFX & SWT 2
F Java JTextPane AWT, Swing, JavaFX & SWT 13
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
TheJavaKid LineWrap & WrapStyleWord in JTextPane AWT, Swing, JavaFX & SWT 3
G Zeilenabstand bei HTML-Texten in JLabel/JTextPane AWT, Swing, JavaFX & SWT 7
O Swing Xml highlightning mit JTextPane und Regular expressions AWT, Swing, JavaFX & SWT 5
J JTextPane Alignment AWT, Swing, JavaFX & SWT 6
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben