tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von peter_mueller
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
5225
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    peter_mueller peter_mueller ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    73
    Hallo alle,

    Ich schreibe einen XML-Editor, der die Tatsache, dass XML verwendet wird, vor dem Benutzer versteckt. Die Elemente werden nur über Element-Zeichen dargestellt.

    Das Problem:
    Wenn der Benutzer nur ein Tag entfernt, muss sicher gestellt werden, dass das zugehörige öffnende oder schließende Tag auch gelöscht wird. Ich teste nun im DocumentListener, ob es sich bei dem gelöschten Zeichen um ein Element-Zeichen handelt. Wenn ja, versuche ich, das zugeörige Element-Zeichen zu löschen.
    Nur leider kommt dann die Fehlermeldung:

    Exception in thread "AWT-EventQueue-1" java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
    at javax.swing.text.AbstractDocument.remove(Unknown Source)
    at myApplet.MyDocumentListener.updateElemPositionsAfterRemove(MyDocumentListener.java:156)

    Das Problem scheint mir zu sein, dass durch das Löschen des Zeichens der DocumentListener wieder aufgerufen wird, was offenbar nicht erlaubt / möglich ist.

    Nun habe ich versucht, ein globales Flag zu setzen und auf dieses dann im CaretListener zu reagieren, aber das war natürlich auch Quatsch, weil CaretListener und DocumentListener so eng zusammen hängen, dass das selbe Problem wie oben auftaucht.

    Nur wie kann ich das Problem sonst lösen?

    Habe an einen Thread gedacht, der alle paar Milisekunden nachschaut, ob das globale Flag auf "es_wurde_gerade_ein_einzelnes_Element-Zeichen_gelöscht" == true gesetzt ist. Nur habe ich überhaupt keine Erfahrung mit Threads und habe gelesen, dass Swing nicht thread-sicher sei. Heißt das, ich kann Threads mit Swing nicht verwenden?

    Vielleicht gibt es ja auch noch eine andere Lösung, auf die ich noch gar nicht gekommen bin? Ich weiß nicht mehr weiter!

    Vielen Dank für Eure Hilfe,
    Peter
     

  2. #2
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Peter,

    du könntest vor dem löschen einfach den Documentlistener abmelden und dann wieder gleich anmelden.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    JTextField text = new JTextField();
     
    text.getDocument().addDocumentListener(testlistener);
     
    DocumentListener testlistener = new DocumentListener() {
        public void insertUpdate(DocumentEvent e) {
            text.removeDocumentListener(testlistener);
     
            // hier Löschvorgang
     
            text.addDocumentListener(testlistener);
        }
        public void removeUpdate(DocumentEvent e) {
        ..
        }
        public void changedUpdate(DocumentEvent e) {
        ...
        }
    };

    Vg Erdal
     

  3. #3
    peter_mueller peter_mueller ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    73
    Hallo,

    sorry, ich vergaß zu erwähnen, dass ich das auch schon ausprobiert habe, aber die selbe Fehermeldung erfolgt ist... (was ich ehrlich gesagt auch nicht verstehe ...)

    Hat jemand noch andere Ideen? Was haltet Ihr von der Thread-Idee?

    Gruß,
    Peter
     

  4. #4
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Peter,

    Ein Codeausschnitt der dein Vorgehen konkret zeigt wäre schon von Vorteil!

    Vg Erdal
     

  5. #5
    peter_mueller peter_mueller ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    73
    Alles klar! Hier kommt ein Code-Ausschnitt aus meinem DocumentListener:

    Code :
    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
    
     
    public void removeUpdate(DocumentEvent e){
            int pos = e.getOffset();
            int length = e.getLength();
            updateElemPositionsAfterRemove(pos,length);
        }
     
     
    private void updateElemPositionsAfterRemove(int pos,int length){
     
            //Test! CaretListener von TextPane entfernen (unten wieder dran!)
            MyCaretListener caret_listener = my_applet.getCaretListener();
            JTextPane textPane = my_applet.getTextPane();       
            textPane.removeCaretListener(caret_listener);
            
            //Test! DocumentListener entfernen (unten wieder dran!)
            StyledDocument doc = mother_applet.getDocument();
            MyDocumentListener doc_listener = mother_applet.getDocumentListener();
            doc.removeDocumentListener(doc_listener);
      
                    ...
                        
        //z.B. nur Starttag eines Elementes gelöscht
        if(pos < start_pos_of_elem_to_update && dot < stop_pos_of_elem_to_update){
            
         //HIER ERFOLGT DER FEHLER!!  
                   try{
                         doc.remove(elem_to_update.getTextStop_Pos(),1); 
                               }
                       catch(BadLocationException e){
                     e.printStackTrace();
                       }
     
                    ...         
     
        //Hinzufügen der beiden Listener
            textPane.addCaretListener(caret_listener);
            doc.addDocumentListener(this);
            }   
     
        }

    Gruß,
    Peter
     

  6. #6
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Peter,

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    //Test! CaretListener von TextPane entfernen (unten wieder dran!)
            MyCaretListener caret_listener = my_applet.getCaretListener();
            JTextPane textPane = my_applet.getTextPane();       
            textPane.removeCaretListener(caret_listener);
            
            //Test! DocumentListener entfernen (unten wieder dran!)
            StyledDocument doc = mother_applet.getDocument();
            MyDocumentListener doc_listener = mother_applet.getDocumentListener();
            doc.removeDocumentListener(doc_listener);

    Das versteh ich nicht so ganz. Warum tust du hier nicht einfach folgendes schreiben.

    textPane.removeCaretListener(caret_listener);
    doc.removeDocumentListener(doc_listener);

    Bis auf das du die Listener zuerst referenzierst bevor du sie abmeldest scheint alles in Ordnung zu sein. Also ich habe ein einfachen Texteditor geschrieben. Darin habe ich auch einen Fontchooser ähnlich wie das von Microsoft Notepad implementiert. Da sind für Schriftart, Schriftschnitt und Schriftgrad je ein JList und ein JTextField implementiert. Die Textfelder haben Documentlistener, die Listen Listselectionlistener. Ändert der User etwas in den Textfeldern wird es sofort in den Listen aktualisiert und umgekehrt. Ich habe einfach wie schon vorher gesagt die jeweiligen Listener abgemeldet und dann wieder angemeldet. Es funktioniert ohne Probleme. Deswegen glaube ich kaum, dass der Fehler bei dir irgendetwas mit Threadsicherheit zu tun hat.

    Das hier ist die Klasse aus meinem Editor in welchem der Fontchooser implementiert ist, welcher drei Paare sich gegenseitig beeinflussende Listener enthält. Ich weiß nicht ob dir das weiterhilft, aber werf mal ein Auge drauf, vielleicht siehst du ja was du bei dir eventuell anders gemacht hast.

    Code :
    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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.GraphicsEnvironment;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.Arrays;
     
    import javax.swing.JButton;
    import javax.swing.JCheckBoxMenuItem;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.text.Position;
     
    public class Format {
     
        // Referenz //
        
        static JFrame mainframe = Editor.mainframe;
        
        static JTextArea textarea = Editor.textarea;
     
        static JMenuItem b9 = Editor.b9;
     
        static JCheckBoxMenuItem f1 = Editor.f1;
     
        static JCheckBoxMenuItem a1 = Editor.a6;
     
        // Singleton //
     
        private static Format instance = null;
     
        public static Format getInstance() {
            if (instance == null) {
                instance = new Format();
            }
            return instance;
        }
     
        // Initialisierung - FontChooser //
     
        static String art_akt;
     
        static int schnitt_akt;
     
        static int grad_akt;
     
        static String schnittstring;
     
        static String gradstring;
     
        static String schriftgrad[] = { "8", "9", "10", "11", "12", "14", "16",
                "18", "20", "22", "24", "26", "28", "36", "48", "72" };
     
        static String schriftschnitt[] = { "Standard", "Kursiv", "Fett",
                "Fett Kursiv" };
     
        // GUI //
     
        static JDialog fontframe = new JDialog(mainframe,true);
     
        static JLabel l1 = new JLabel("Schrifart:");
     
        static JLabel l2 = new JLabel("Schriftschnitt:");
     
        static JLabel l3 = new JLabel("Schriftgrad:");
     
        static JLabel l5 = new JLabel("Skript:");
     
        static JTextField t1 = new JTextField();
     
        static JTextField t2 = new JTextField();
     
        static JTextField t3 = new JTextField();
     
        static JTextField t4 = new JTextField();
     
        static JList li1 = new JList();
     
        static JList li2 = new JList(schriftschnitt);
     
        static JList li3 = new JList(schriftgrad);
     
        static JScrollPane s1 = new JScrollPane(li1);
     
        static JScrollPane s2 = new JScrollPane(li2);
     
        static JScrollPane s3 = new JScrollPane(li3);
     
        static JPanel p1 = new JPanel();
     
        static JButton b1 = new JButton("OK");
     
        static JButton b2 = new JButton("Abbrechen");
     
        static Dimension d = new Dimension(364, 54);
     
        // Listener //
     
        static DocumentListener art_t = null;
     
        static DocumentListener schnitt_t = null;
     
        static DocumentListener grad_t = null;
     
        static ListSelectionListener art_l = null;
     
        static ListSelectionListener schnitt_l = null;
     
        static ListSelectionListener grad_l = null;
     
        public static void changepreview() {
            try {
                if (!li1.isSelectionEmpty())
                    art_akt = li1.getSelectedValue().toString();
                if (!li2.isSelectionEmpty())
                    schnittstring = li2.getSelectedValue().toString();
                if (!li3.isSelectionEmpty())
                    gradstring = li3.getSelectedValue().toString();
                else if (t3.getText().length() > 0)
                    gradstring = t3.getText().toString();
                switch (schnittstring.length()) {
                case 8:
                    schnitt_akt = Font.PLAIN;
                    break;
                case 6:
                    schnitt_akt = Font.ITALIC;
                    break;
                case 4:
                    schnitt_akt = Font.BOLD;
                    break;
                default:
                    schnitt_akt = Font.ITALIC + Font.BOLD;
                }
                grad_akt = Integer.parseInt(gradstring);
                t4.setFont(new Font(art_akt, schnitt_akt, grad_akt));
            } catch (NumberFormatException e) {
            }
        }
     
        protected Format() {
     
            // Einstellungen //
     
            fontframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            fontframe.setLocationByPlatform(true);
            fontframe.setSize(500, 330);
            fontframe.setResizable(false);
            fontframe.setAlwaysOnTop(true);
     
            t4.setText("AaBbYyZz");
            t4.setPreferredSize(d);
            t4.putClientProperty(
                    com.sun.java.swing.SwingUtilities2.AA_TEXT_PROPERTY_KEY,
                    Boolean.TRUE );
     
            String f = "";
            for (String fonts : GraphicsEnvironment.getLocalGraphicsEnvironment()
                    .getAvailableFontFamilyNames())
                f = f + "#" + fonts;
            final String fonts[] = f.substring(1).split("#");
            li1.setListData(fonts);
     
            // Listener //
     
            art_l = new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent e) {
                    t1.getDocument().removeDocumentListener(art_t);
                    if (!li1.isSelectionEmpty()) {
                        t1.setText(li1.getSelectedValue().toString());
                        changepreview();
                    }
                    t1.getDocument().addDocumentListener(art_t);
                }
            };
            schnitt_l = new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent e) {
                    t2.getDocument().removeDocumentListener(art_t);
                    if (!li2.isSelectionEmpty()) {
                        t2.setText(li2.getSelectedValue().toString());
                        changepreview();
                    }
                    t2.getDocument().addDocumentListener(art_t);
                }
            };
            grad_l = new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent e) {
                    t3.getDocument().removeDocumentListener(art_t);
                    if (!li3.isSelectionEmpty()) {
                        t3.setText(li3.getSelectedValue().toString());
                        changepreview();
                    }
                    t3.getDocument().addDocumentListener(art_t);
                }
            };
            art_t = new DocumentListener() {
     
                public void insertUpdate(DocumentEvent e) {
                    li1.removeListSelectionListener(art_l);
                    changedUpdate(e);
                    li1.addListSelectionListener(art_l);
                }
     
                public void removeUpdate(DocumentEvent e) {
                    li1.removeListSelectionListener(art_l);
                    changedUpdate(e);
                    li1.addListSelectionListener(art_l);
                }
     
                public void changedUpdate(DocumentEvent e) {
                    int i = li1
                            .getNextMatch(t1.getText(), 0, Position.Bias.Forward);
                    if (i != -1)
                        li1.setSelectedValue(fonts[i], true);
                    changepreview();
                }
            };
            schnitt_t = new DocumentListener() {
     
                public void insertUpdate(DocumentEvent e) {
                    li2.removeListSelectionListener(schnitt_l);
                    changedUpdate(e);
                    li2.addListSelectionListener(schnitt_l);
                }
     
                public void removeUpdate(DocumentEvent e) {
                    li2.removeListSelectionListener(schnitt_l);
                    changedUpdate(e);
                    li2.addListSelectionListener(schnitt_l);
                }
     
                public void changedUpdate(DocumentEvent e) {
                    int i = li2
                            .getNextMatch(t2.getText(), 0, Position.Bias.Forward);
                    if (i != -1)
                        li2.setSelectedValue(schriftschnitt[i], true);
                    changepreview();
                }
            };
            grad_t = new DocumentListener() {
     
                public void insertUpdate(DocumentEvent e) {
                    li3.removeListSelectionListener(grad_l);
                    changedUpdate(e);
                    li3.addListSelectionListener(grad_l);
                }
     
                public void removeUpdate(DocumentEvent e) {
                    li3.removeListSelectionListener(grad_l);
                    changedUpdate(e);
                    li3.addListSelectionListener(grad_l);
                }
     
                public void changedUpdate(DocumentEvent e) {
                    if (Arrays.asList(schriftgrad).contains(t3.getText()))
                        li3.setSelectedValue(t3.getText(), true);
                    else
                        li3.clearSelection();
                    changepreview();
                }
     
            };
            li1.addListSelectionListener(art_l);
            li2.addListSelectionListener(schnitt_l);
            li3.addListSelectionListener(grad_l);
            t1.getDocument().addDocumentListener(art_t);
            t2.getDocument().addDocumentListener(schnitt_t);
            t3.getDocument().addDocumentListener(grad_t);
     
            ActionListener ok = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    textarea.setFont(new Font(art_akt, schnitt_akt, grad_akt));
                    fontframe.dispose();
                }
            };
            ActionListener cancel = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fontframe.dispose();
                }
            };
            b1.addActionListener(ok);
            b2.addActionListener(cancel);
     
            // Layout //
     
            fontframe.setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.fill = GridBagConstraints.BOTH;
            c.anchor = GridBagConstraints.FIRST_LINE_START;
            c.insets = new Insets(5, 5, 0, 0);
            c.weightx = 3;
            c.weighty = 1;
            c.gridwidth = 3;
            c.gridheight = 1;
            fontframe.add(l1, c);
     
            c.gridy = 1;
            fontframe.add(t1, c);
     
            c.gridy = 2;
            fontframe.add(s1, c);
     
            c.weightx = 2;
            c.gridy = 0;
            c.gridx = 3;
            c.gridwidth = 2;
            fontframe.add(l2, c);
     
            c.gridy = 1;
            fontframe.add(t2, c);
     
            c.gridy = 2;
            fontframe.add(s2, c);
     
            c.insets = new Insets(5, 5, 0, 5);
            c.weightx = 1;
            c.gridy = 0;
            c.gridx = 5;
            c.gridwidth = 1;
            fontframe.add(l3, c);
     
            c.gridy = 1;
            fontframe.add(t3, c);
     
            c.gridy = 2;
            fontframe.add(s3, c);
     
            c.insets = new Insets(5, 5, 5, 0);
            c.fill = GridBagConstraints.HORIZONTAL;
            c.gridheight = 2;
            c.gridwidth = 5;
            c.weighty = 0;
            c.gridx = 0;
            c.gridy = 3;
            fontframe.add(t4, c);
     
            c.anchor = GridBagConstraints.CENTER;
            c.insets = new Insets(5, 5, 0, 5);
            c.gridwidth = 1;
            c.gridheight = 1;
            c.gridx = 5;
            fontframe.add(b1, c);
     
            c.insets = new Insets(5, 5, 5, 5);
            c.gridy = 4;
            fontframe.add(b2, c);
     
            KeyListener text = new KeyListener() {
                public void keyTyped(KeyEvent e) {
                    if (!Character.isDigit(e.getKeyChar()))
                        e.consume();
                }
     
                public void keyReleased(KeyEvent e) {
                }
     
                public void keyPressed(KeyEvent e) {
                }
            };
            t3.addKeyListener(text);
        }
     
        public void schriftarten() {
            // Initialisieren //
            switch (textarea.getFont().getStyle()) {
            case 0:
                schnittstring = "Standard";
                break;
            case 1:
                schnittstring = "Fett";
                break;
            case 2:
                schnittstring = "Kursiv";
                break;
            default:
                schnittstring = "Fett Kursiv";
            }
     
            t1.setText(textarea.getFont().getFamily());
            t2.setText(schnittstring);
            t3.setText("" + textarea.getFont().getSize());
     
            t4.setFont(new Font(textarea.getFont().getFamily(), textarea.getFont()
                    .getStyle(), textarea.getFont().getSize()));
     
            // Anzeigen //
            fontframe.setVisible(true);
        }
     
        public static void zeilenumbruch() {
            if (f1.isSelected()) {
                textarea.setLineWrap(true);
                textarea.setWrapStyleWord(true);
                b9.setEnabled(false);
                a1.setEnabled(false);
            } else {
                textarea.setLineWrap(false);
                textarea.setWrapStyleWord(false);
                b9.setEnabled(true);
                a1.setEnabled(true);
            }
        }
    }

    Vg Erdal
     

  7. #7
    peter_mueller peter_mueller ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    73
    Hallo zusammen,

    sorry, dass ich mich jetzt erst melde, hatte einfach keine Zeit!

    @Erdal:
    Vielen Dank für deinen Code, aber ich fürchte, er hilft mir nicht weiter. Ich glaube, ich habe hier ein spezifisches Problem mit dem writeLock des AbstractDocument, das man auch im StackTrace sehen kann.

    StackTrace:
    Exception in thread "AWT-EventQueue-1" java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
    at javax.swing.text.AbstractDocument.remove(Unknown Source)

    Es sieht wohl einfach so aus, dass wenn ich mich innerhalb des DocumentListeners befinde, das Document vor weiteren Veränderungen schreibgeschützt wird.

    Also bleibt die Frage: Wie kann ich trotzdem das zugehörige Element löschen? (s.o.)
    Können Threads helfen? (obwohl es sich um Swing handelt, das nicht thread-safe sein soll ...?)

    Oder sollte ich die Klasse AbstractDocument ableiten und den Schreibschutz entfernen? Scheint mir allerdings etwas riskant zu sein, oder was meint ihr?

    Viele Grüße,
    Peter
    Geändert von peter_mueller (09.03.06 um 11:17 Uhr)
     

  8. #8
    peter_mueller peter_mueller ist offline Mitglied Silber
    Registriert seit
    Aug 2004
    Beiträge
    73
    Hallo,

    SwingUtilities.invokeLater(Runnable) hat - wie es aussieht - geholfen!

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    setDelPos(elem_to_update.getTextStop_Pos());
                        
    Runnable deleteOtherTag = new Runnable() {
        public void run() {
            try{
                styledDoc.remove(getDelPos(),1); 
            }
            catch(BadLocationException e){
                e.printStackTrace();
            }
        }
    };
     
    SwingUtilities.invokeLater(deleteOtherTag);
    Gruß,
    Peter
    javaDeveloper2011 bedankt sich. 

  9. #9
    Avatar von javaDeveloper2011
    javaDeveloper2011 javaDeveloper2011 ist offline Mitglied Brokat
    Registriert seit
    Feb 2011
    Beiträge
    445
    Blog-Einträge
    5
    Hi,

    sowas braucht man auch bei StyledDocument-Veränderungen, sonst kommt er gleiche Fehler.
    Vielen Dank, dass du selber hier deine Lösung gepostet hast, hat mir sehr geholfen.

    Gruß javaDeveloper2011
     

Ähnliche Themen

  1. eigene Swing-Klasse aus Swing-Elementen
    Von simonu im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 21.02.08, 18:22
  2. javax.swing.plaf.FontUIResource: Woher lädt Swing den Font
    Von Deficiency im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 17.01.08, 08:38
  3. Alternativen zu AWT, Swing und SWT ?
    Von Stigma im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 04.12.07, 11:45
  4. Thread-Problem in Swing: Fenster wird nur unvollständig angezeigt
    Von henning-malaysia im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 07.11.06, 14:45
  5. Swing GUI und weiter Thread gibt Problem
    Von Niles im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 21
    Letzter Beitrag: 11.02.05, 10:05