Skip to content

InlineCssTextArea.clear() -> IndexOutOfBoundsException + IllegalArgumentException #1249

@PavelTurk

Description

@PavelTurk

Sometimes, when I call InlineCssTextArea.clear() I get the following:

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
        at java.base/java.util.ArrayList.rangeCheckForAdd(ArrayList.java:839)
        at java.base/java.util.ArrayList.add(ArrayList.java:511)
        at javafx.base/com.sun.javafx.collections.ObservableListWrapper.doAdd(ObservableListWrapper.java:101)
        at javafx.base/javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:151)
        at javafx.base/com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:320)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.ParagraphText.lambda$new$1(ParagraphText.java:114)
        at javafx.base/com.sun.javafx.collections.MapListenerHelper$SingleChange.fireValueChangedEvent(MapListenerHelper.java:163)
        at javafx.base/com.sun.javafx.collections.MapListenerHelper.fireValueChangedEvent(MapListenerHelper.java:72)
        at javafx.base/com.sun.javafx.collections.ObservableMapWrapper.callObservers(ObservableMapWrapper.java:115)
        at javafx.base/com.sun.javafx.collections.ObservableMapWrapper.put(ObservableMapWrapper.java:173)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.GenericStyledArea.lambda$createCell$65(GenericStyledArea.java:1983)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$27.tryEmit(EventStreams.java:599)
        at org.reactfx.EventStreams$27.lambda$observeInputs$0(EventStreams.java:592)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$4.lambda$observeInputs$0(EventStreams.java:123)
        at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.value.MappedVal.lambda$connect$0(MappedVal.java:28)
        at org.reactfx.value.InvalidationListenerWrapper.accept(Val.java:765)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.value.SimpleVar.setValue(SimpleVar.java:59)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.SelectionImpl.lambda$new$4(SelectionImpl.java:197)
        at org.reactfx.value.InvalidationListenerWrapper.accept(Val.java:765)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.value.SimpleVar.setValue(SimpleVar.java:59)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.SelectionImpl.lambda$selectRange$8(SelectionImpl.java:304)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.SelectionImpl.selectRange(SelectionImpl.java:306)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.SelectionImpl.selectRange(SelectionImpl.java:300)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.SelectionImpl.lambda$new$7(SelectionImpl.java:264)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.FilterStream.lambda$observeInputs$0(FilterStream.java:20)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.MappedStream.lambda$observeInputs$0(MappedStream.java:25)
        at org.reactfx.util.QueuingStreamNotifications.lambda$head$0(NotificationAccumulator.java:217)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.SuspendableBase.resume(SuspendableBase.java:64)
        at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
        at org.reactfx.MultiGuard.close(Guard.java:83)
        at org.reactfx.Suspendable$1.resumeSource(Suspendable.java:118)
        at org.reactfx.Suspendable$1.suspendSource(Suspendable.java:104)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$3.lambda$observeInputs$0(EventStreams.java:105)
        at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.SuspendableBoolean.release(SuspendableBoolean.java:24)
        at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
        at org.reactfx.Suspendable.suspendWhile(Suspendable.java:49)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.updateMulti(GenericEditableStyledDocumentBase.java:218)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.updateSingle(GenericEditableStyledDocumentBase.java:210)
        at org.reactfx.util.Tuple3.exec(Tuple3.java:43)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.replace(GenericEditableStyledDocumentBase.java:145)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.SimpleEditableStyledDocument.replace(SimpleEditableStyledDocument.java:10)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.GenericStyledArea.replace(GenericStyledArea.java:1562)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.GenericStyledArea.replaceText(GenericStyledArea.java:1548)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.EditActions.clear(EditActions.java:155)
....
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = ParagraphText@639494794(paragraph=Par[; StyledSegment(segment= style=)])
        at javafx.graphics/javafx.scene.Parent$3.onProposedChange(Parent.java:561)
        at javafx.base/com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.ParagraphText.lambda$new$3(ParagraphText.java:136)
        at javafx.base/com.sun.javafx.collections.SetListenerHelper$SingleChange.fireValueChangedEvent(SetListenerHelper.java:163)
        at javafx.base/com.sun.javafx.collections.SetListenerHelper.fireValueChangedEvent(SetListenerHelper.java:72)
        at javafx.base/com.sun.javafx.collections.ObservableSetWrapper.callObservers(ObservableSetWrapper.java:128)
        at javafx.base/com.sun.javafx.collections.ObservableSetWrapper.add(ObservableSetWrapper.java:269)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.GenericStyledArea.lambda$createCell$59(GenericStyledArea.java:1940)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$26.tryEmit(EventStreams.java:571)
        at org.reactfx.EventStreams$26.lambda$observeInputs$0(EventStreams.java:565)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$4.lambda$observeInputs$0(EventStreams.java:123)
        at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.SuspendableBase.resume(SuspendableBase.java:64)
        at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
        at org.reactfx.MultiGuard.close(Guard.java:83)
        at org.reactfx.Suspendable$1.resumeSource(Suspendable.java:118)
        at org.reactfx.Suspendable$1.suspendSource(Suspendable.java:104)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$3.lambda$observeInputs$0(EventStreams.java:105)
        at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.SuspendableBoolean.release(SuspendableBoolean.java:24)
        at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
        at org.reactfx.MultiGuard.close(Guard.java:83)
        at org.reactfx.Suspendable$1.resumeSource(Suspendable.java:118)
        at org.reactfx.Suspendable$1.suspendSource(Suspendable.java:104)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$3.lambda$observeInputs$0(EventStreams.java:105)
        at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.SuspendableBoolean.release(SuspendableBoolean.java:24)
        at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
        at org.reactfx.BiGuard.close(Guard.java:68)
        at org.reactfx.Suspendable$1.resumeSource(Suspendable.java:118)
        at org.reactfx.Suspendable$1.suspendSource(Suspendable.java:104)
        at org.reactfx.util.NonAccumulativeStreamNotifications.lambda$head$0(NotificationAccumulator.java:134)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.ProperEventStream.emit(ProperEventStream.java:18)
        at org.reactfx.EventStreams$3.lambda$observeInputs$0(EventStreams.java:105)
        at org.reactfx.value.ChangeListenerWrapper.accept(Val.java:786)
        at org.reactfx.util.AbstractReducingStreamNotifications.lambda$head$0(NotificationAccumulator.java:248)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:68)
        at org.reactfx.ObservableBase.notifyObservers(ObservableBase.java:57)
        at org.reactfx.value.ValBase.invalidate(ValBase.java:32)
        at org.reactfx.SuspendableBoolean.release(SuspendableBoolean.java:24)
        at org.reactfx.CloseableOnceGuard.close(Guard.java:49)
        at org.reactfx.Suspendable.suspendWhile(Suspendable.java:49)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.updateMulti(GenericEditableStyledDocumentBase.java:218)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.updateSingle(GenericEditableStyledDocumentBase.java:210)
        at org.reactfx.util.Tuple3.exec(Tuple3.java:43)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.GenericEditableStyledDocumentBase.replace(GenericEditableStyledDocumentBase.java:145)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.model.SimpleEditableStyledDocument.replace(SimpleEditableStyledDocument.java:10)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.GenericStyledArea.replace(GenericStyledArea.java:1562)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.GenericStyledArea.replaceText(GenericStyledArea.java:1548)
        at org.fxmisc.richtext@0.11.3/org.fxmisc.richtext.EditActions.clear(EditActions.java:155)

As I understand it is somehow linked to stylesheets - as I clear and add them again. I tried to reproduce the problem, but I couldn't. This is the code that should reproduce the bug, but it doesn't:

public class RichTextFxTest extends Application {

    private final InlineCssTextArea textArea = new InlineCssTextArea();

    @Override
    public void start(Stage stage) throws Exception {
        List<String> rows = IntStream.range(0, 25).boxed().map(i -> "Row" + i).toList();
        ListView<String> listView = new ListView<>(FXCollections.observableList(rows));
        var random = new Random();
        listView.getSelectionModel().selectedIndexProperty().addListener((ov, oldV, newV) -> {
            updateContent(random.nextBoolean());
        });
        var root = new VBox(listView, textArea);
        var scene = new Scene(root, 300, 600);
        stage.setScene(scene);
        stage.show();
    }

    private void updateContent(boolean b) {
        textArea.clear();
        String text = "This is some text\n";
        String defStyle;
        String style;
        if (b) {
            defStyle = "-fx-fill: #000000;-rtfx-background-color: #FFFFFF;";
            style = " -fx-fill: #FFFFFF;-rtfx-background-color: #000000;";
        } else {
            defStyle = "";
            style = "";
        }
        this.textArea.getStylesheets().clear();
        var css = ".text {-fx-font-family:ubuntu;" + defStyle + "-fx-font-size:14px;}";
        String encodedCss = Base64.getEncoder().encodeToString(css.getBytes(StandardCharsets.UTF_8));
        String cssUrl = "data:text/css;base64," + encodedCss;
        this.textArea.getStylesheets().add(cssUrl);

        StringBuilder sb = new StringBuilder();
        StyleSpansBuilder<String> ssb = new StyleSpansBuilder<>();
        sb.append(text);
        ssb.add("", text.length());
        sb.append(text);
        ssb.add(style, text.length());

        textArea.appendText(sb.toString());
        textArea.setStyleSpans(0, ssb.create());
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions