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());
}
}
Sometimes, when I call InlineCssTextArea.clear() I get the following:
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
shouldreproduce the bug, but it doesn't: