tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
380
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von zer0
    zer0 zer0 ist offline Mitglied Brokat
    Registriert seit
    Oct 2009
    Beiträge
    323
    Hallo,

    ich bastel an einem Editor mit Syntaxhighlightning und Undo/Redo Operation. Ihc benutze das JTextPane und für Undo & Redo benutze ich den UndoManager von Swing. Das ganze funktioniert eigentlich auch. Nach jeder Eingabe wird der Text geparst und mittels setCharacterAttributes vom DefaulStyledDocument der Text farbig formatiert.

    Das stellt auch das Problem dar, dadurch das ich setCharacterAttributes aufrufe wird auch dieses UndoEvent, also die Formatänderung, in der Undo Historie abgelegt. Dazu habe ich mir eine kleine abhilfe gemacht die auch funktioniert ABER wenn das JTextPane ganz leer ist, also z.B. alle Undo's gemacht wurden UND dann wird ein Redo gemacht hängt sich das Programm auf. Nach ca. 2min's geht es wieder.

    Meine Abhilfe ist das einafch vor dem Formatieren des Textes wird eine Variable im UndoManager auf false gesetzt, und ab da an werden keine UndoEvent's mehr gespeichert.

    Hier mal ein Ausschnit aus meiner ContentPanel Datei, in der auch das JTextPane etc. ist.

    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
    
    public ContentPanel() {
            initialize();
            initializeComponents();
            textPane.getDocument().addUndoableEditListener(undoableEditListener = new MyUndoableEditListener());
        }
     
    public void redo() {
            try {
                undo.redo();
            } catch (CannotRedoException ex) {
                System.out.println("Unable to redo: " + ex);
                ex.printStackTrace();
            }
            updateRedoState();
            updateUndoState();
        }
        
        public void undo() {
            try {
                undo.undo();
            } catch (CannotUndoException ex) {
                System.out.println("Unable to undo: " + ex);
                ex.printStackTrace();
            }
            updateUndoState();
            updateRedoState();
        }
        
        public void highlightDocument() {
            undoableEditListener.setHighlightMode(true);
            
                    // Code...
                    // ...
            
                    attr = highlighter.getAttributeSet(word);
                    // Hier passiert die Formatänderung
                    document.setCharacterAttributes(offset, length, attr, true);
                    
                    
                }
            } catch (BadLocationException ble) {
                System.err.println("Couldn't insert initial text.");
            }
            
            undoableEditListener.setHighlightMode(false);
        }
        
        public void updateUndoState() {
            if(undo.canUndo()) {
                UndoAction.getInstance().setEnabled(true);
                //System.out.println(undo.getUndoPresentationName());
            } else {
                UndoAction.getInstance().setEnabled(false);
            }
        }
        
        public void updateRedoState() {
            if (undo.canRedo()) {
                RedoAction.getInstance().setEnabled(true);
                //System.out.println(undo.getRedoPresentationName());
            } else {
                RedoAction.getInstance().setEnabled(false);
            }
        }
        
        class MyUndoableEditListener implements UndoableEditListener {
            
            private boolean highlightMode = false;
            
            public boolean isHighlightMode() {
                return highlightMode;
            }
     
            public void setHighlightMode(boolean highlightMode) {
                this.highlightMode = highlightMode;
            }
     
            public void undoableEditHappened(UndoableEditEvent e) {
                // Hier wenn der HighlightMode aus ist (=false) dann werden die UndoEvent's gespeichert
                            if(isHighlightMode() == false) {
                    undo.addEdit(e.getEdit());
                                    updateUndoState();
                                    updateRedoState();
                }
            }
        }

    Und hier noch eine Action, die ausgeführt wird wenn STRG-Z gedrückt wird:
    Code JAVA:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    private UndoAction(String name, Icon icon) {
            super(name, icon);
            putValue(Action.SHORT_DESCRIPTION, name);
            setEnabled(false);
        }
        
        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println(getValue(NAME));
            MainFrame.getContentPanel().undo();
        }

    Ich hoffe mir kann jemand bei diesem Problem helfen! :$
    Geändert von zer0 (02.02.11 um 09:04 Uhr)
     
    Wenn dir mein Beitrag hilfreich war darfst du gerne Danke klicken! :)

    watch my blog @ websocialist.blogspot.com

Ähnliche Themen

  1. Max hängt sich beim Rendern auf
    Von devian82 im Forum 3D Studio Max
    Antworten: 3
    Letzter Beitrag: 04.12.09, 17:52
  2. XML Ladeschnittstelle hängt beim auslesen
    Von nightcrawler86 im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 23.08.08, 05:00
  3. C4D R10 hängt sich beim booten auf...
    Von Hydrogencarbonat im Forum Cinema 4D
    Antworten: 4
    Letzter Beitrag: 17.06.07, 08:54
  4. Rechner hängt beim Start
    Von Onkel Schuppig im Forum Hardware
    Antworten: 1
    Letzter Beitrag: 17.09.06, 13:37
  5. PS hängt sich beim Start auf!
    Von Ttobi im Forum Photoshop
    Antworten: 3
    Letzter Beitrag: 29.05.05, 20:12