My Tab block all userinputs on loading
but when i set the Root of a Tree View
a java.lang.ArrayIndexOutOfBoundsException: is thrown:
java.lang.ArrayIndexOutOfBoundsException: 11
at com.sun.javafx.css.StyleHelper.getCacheEntry(StyleHelper.java:384)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:751)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1598)
at com.sun.javafx.scene.control.skin.VirtualFlow.addLeadingCells(VirtualFlow.java:1049)
at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1005)
at com.sun.javafx.scene.control.skin.VirtualFlow.setCellCount(VirtualFlow.java:206)
at com.sun.javafx.scene.control.skin.TreeViewSkin.updateItemCount(TreeViewSkin.java:225)
at com.sun.javafx.scene.control.skin.TreeViewSkin.handleControlPropertyChanged(TreeViewSkin.java:135)
at com.sun.javafx.scene.control.skin.SkinBase$3.changed(SkinBase.java:282)
at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:107)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:196)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.beans.property.IntegerPropertyBase.fireValueChangedEvent(IntegerPropertyBase.java:123)
at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:130)
at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:163)
at javafx.scene.control.TreeView.setTreeItemCount(TreeView.java:515)
at javafx.scene.control.TreeView.access$300(TreeView.java:118)
at javafx.scene.control.TreeView$2.invalidated(TreeView.java:357)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at javafx.scene.control.TreeView.setRoot(TreeView.java:378)
at StyleManagerArrayIndexOutOfBoundsException.StyleManagerArrayIndexOutOfBoundsExceptionMain$Refresh.succeeded(StyleManagerArrayIndexOutOfBoundsExceptionMain.java:166)
/**
* Test for java.lang.ArrayIndexOutOfBoundsException: ?? at
* com.sun.javafx.css.StyleHelper.getCacheEntry(Unknown Source)
*
* @author sst
*/
public class StyleManagerArrayIndexOutOfBoundsExceptionMain extends Application {
/**
* @param args
*/
public static void main(final String[] args) {
launch(StyleManagerArrayIndexOutOfBoundsExceptionMain.class, args);
}
/**
*
*/
@Override
public void start(final Stage stage) throws Exception {
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
/**
* @see javafx.event.EventHandler#handle(javafx.event.Event)
*/
@Override
public void handle(final WindowEvent event) {
System.exit(0);
}
});
// Show Block
final BooleanProperty block = new SimpleBooleanProperty(false);
// root
final BorderPane root = new BorderPane();
// TreeView
final TreeView<String> treeView = new TreeView<>();
treeView.setShowRoot(true);
// TabPane
final TabPane tabPane = new TabPane();
tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
root.setCenter(tabPane);
// Tabs
final Block tab = new Block(block);
tab.setContentImpl(treeView);
tabPane.getTabs().add(tab);
// Button
final Button update = new Button("update");
root.setTop(update);
update.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
new Thread(new Refresh(block, update, treeView, 1_000)).start();
}
});
stage.initStyle(StageStyle.UNDECORATED);
stage.setScene(new Scene(root, 400, 400));
stage.show();
Platform.runLater(new Runnable() {
@Override
public void run() {
// new Thread(new Refresh(block, update, treeView, 1)).start();
}
});
}
/** Refresh TableView */
private final class Refresh extends Task<TreeItem<String>> {
/** Block User Inputs */
private final BooleanProperty block;
/** Deaktivate on run */
private final Button button;
/** {@link TreeView} to add */
private final TreeView<String> treeView;
/** Default EventDispatcher from root */
private EventDispatcher defaultDispatcher = null;
/** runs */
private final int run;
private Refresh(final BooleanProperty block, final Button button, final TreeView<String> treeView, final int run) {
super();
this.block = block;
this.button = button;
this.treeView = treeView;
this.run = run - 1;
}
@Override
protected void running() {
this.button.setText(String.valueOf(this.run));
this.block.set(true);
}
protected void finish() {
this.block.set(false);
if (this.run > 0) {
new Thread(new Refresh(block, button, treeView, this.run)).start();
}
}
@Override
protected void cancelled() {
finish();
}
@Override
protected void failed() {
finish();
}
@Override
protected void succeeded() {
try {
final TreeItem<String> root = get();
treeView.setRoot(root);
root.setExpanded(true);
treeView.getSelectionModel().clearSelection();
} catch (final ArrayIndexOutOfBoundsException ignore) {
ignore.printStackTrace();
} catch (final Throwable throwable) {
throwable.printStackTrace();
} finally {
finish();
}
}
@Override
protected TreeItem<String> call() throws Exception {
final Random random = new Random(System.currentTimeMillis());
final TreeItem<String> root = new TreeItem<String>(null);
add(root, random, 5);
return root;
}
private void add(final TreeItem<String> root, final Random random, final int maxChilds) {
if (maxChilds < 1) {
return;
}
final int count = random.nextInt(maxChilds);
for (int a = 0; a < count; a++) {
final String item = String.valueOf(a);
final TreeItem<String> child = new TreeItem<String>(item);
root.getChildren().add(child);
add(child, random, maxChilds - 1);
}
}
}
/*
* Copyright (c) 2014 iFD AG Chemnitz http://www.ifdag.de
*/
private final class Block extends Tab {
private Node content = null;
private int blocks = 0;
private Block(final BooleanProperty disable) {
final BorderPane header = new BorderPane();
final Label number = new Label("12");
BorderPane.setAlignment(number, Pos.CENTER_LEFT);
header.setLeft(number);
final Label title = new Label();
title.setMaxWidth(Double.MAX_VALUE);
BorderPane.setAlignment(title, Pos.CENTER);
BorderPane.setMargin(title, new Insets(0, 4, 0, 4));
header.setCenter(title);
final Button button = new Button("X");
BorderPane.setAlignment(button, Pos.CENTER);
header.setRight(button);
final ProgressIndicator showBlock = new ProgressIndicator();
BorderPane.setAlignment(showBlock, Pos.CENTER);
setText("");
setGraphic(header);
disable.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean from, Boolean to) {
if (content == null) {
return;
}
if (to != null && to.booleanValue()) {
header.setRight(showBlock);
content.setOpacity(0.5);
blocks++;
} else if (--blocks == 0) {
header.setRight(button);
content.setOpacity(1);
}
show();
}
});
this.disableProperty().bind(disable);
}
private void setContentImpl(final Node node) {
this.content = node;
super.setContent(node);
}
private final void show() {
if (this.blocks > 0) {
final BorderPane pane = new BorderPane();
pane.setEventDispatcher(new EventDispatcher() {
/**
* @see javafx.event.EventDispatcher#dispatchEvent(javafx.event.Event,
* javafx.event.EventDispatchChain)
*/
@Override
public Event dispatchEvent(final Event event, final EventDispatchChain paramEventDispatchChain) {
return null;
}
});
pane.setCenter(this.content);
setContent(pane);
} else {
setContent(content);
}
}
}
}
but when i set the Root of a Tree View
a java.lang.ArrayIndexOutOfBoundsException: is thrown:
java.lang.ArrayIndexOutOfBoundsException: 11
at com.sun.javafx.css.StyleHelper.getCacheEntry(StyleHelper.java:384)
at com.sun.javafx.css.StyleHelper.transitionToState(StyleHelper.java:751)
at javafx.scene.Node.impl_processCSS(Node.java:7418)
at javafx.scene.Parent.impl_processCSS(Parent.java:1146)
at javafx.scene.control.Control.impl_processCSS(Control.java:1154)
at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1598)
at com.sun.javafx.scene.control.skin.VirtualFlow.addLeadingCells(VirtualFlow.java:1049)
at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1005)
at com.sun.javafx.scene.control.skin.VirtualFlow.setCellCount(VirtualFlow.java:206)
at com.sun.javafx.scene.control.skin.TreeViewSkin.updateItemCount(TreeViewSkin.java:225)
at com.sun.javafx.scene.control.skin.TreeViewSkin.handleControlPropertyChanged(TreeViewSkin.java:135)
at com.sun.javafx.scene.control.skin.SkinBase$3.changed(SkinBase.java:282)
at javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:107)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:196)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.beans.property.IntegerPropertyBase.fireValueChangedEvent(IntegerPropertyBase.java:123)
at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:130)
at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:163)
at javafx.scene.control.TreeView.setTreeItemCount(TreeView.java:515)
at javafx.scene.control.TreeView.access$300(TreeView.java:118)
at javafx.scene.control.TreeView$2.invalidated(TreeView.java:357)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:129)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at javafx.scene.control.TreeView.setRoot(TreeView.java:378)
at StyleManagerArrayIndexOutOfBoundsException.StyleManagerArrayIndexOutOfBoundsExceptionMain$Refresh.succeeded(StyleManagerArrayIndexOutOfBoundsExceptionMain.java:166)
/**
* Test for java.lang.ArrayIndexOutOfBoundsException: ?? at
* com.sun.javafx.css.StyleHelper.getCacheEntry(Unknown Source)
*
* @author sst
*/
public class StyleManagerArrayIndexOutOfBoundsExceptionMain extends Application {
/**
* @param args
*/
public static void main(final String[] args) {
launch(StyleManagerArrayIndexOutOfBoundsExceptionMain.class, args);
}
/**
*
*/
@Override
public void start(final Stage stage) throws Exception {
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
/**
* @see javafx.event.EventHandler#handle(javafx.event.Event)
*/
@Override
public void handle(final WindowEvent event) {
System.exit(0);
}
});
// Show Block
final BooleanProperty block = new SimpleBooleanProperty(false);
// root
final BorderPane root = new BorderPane();
// TreeView
final TreeView<String> treeView = new TreeView<>();
treeView.setShowRoot(true);
// TabPane
final TabPane tabPane = new TabPane();
tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
root.setCenter(tabPane);
// Tabs
final Block tab = new Block(block);
tab.setContentImpl(treeView);
tabPane.getTabs().add(tab);
// Button
final Button update = new Button("update");
root.setTop(update);
update.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent event) {
new Thread(new Refresh(block, update, treeView, 1_000)).start();
}
});
stage.initStyle(StageStyle.UNDECORATED);
stage.setScene(new Scene(root, 400, 400));
stage.show();
Platform.runLater(new Runnable() {
@Override
public void run() {
// new Thread(new Refresh(block, update, treeView, 1)).start();
}
});
}
/** Refresh TableView */
private final class Refresh extends Task<TreeItem<String>> {
/** Block User Inputs */
private final BooleanProperty block;
/** Deaktivate on run */
private final Button button;
/** {@link TreeView} to add */
private final TreeView<String> treeView;
/** Default EventDispatcher from root */
private EventDispatcher defaultDispatcher = null;
/** runs */
private final int run;
private Refresh(final BooleanProperty block, final Button button, final TreeView<String> treeView, final int run) {
super();
this.block = block;
this.button = button;
this.treeView = treeView;
this.run = run - 1;
}
@Override
protected void running() {
this.button.setText(String.valueOf(this.run));
this.block.set(true);
}
protected void finish() {
this.block.set(false);
if (this.run > 0) {
new Thread(new Refresh(block, button, treeView, this.run)).start();
}
}
@Override
protected void cancelled() {
finish();
}
@Override
protected void failed() {
finish();
}
@Override
protected void succeeded() {
try {
final TreeItem<String> root = get();
treeView.setRoot(root);
root.setExpanded(true);
treeView.getSelectionModel().clearSelection();
} catch (final ArrayIndexOutOfBoundsException ignore) {
ignore.printStackTrace();
} catch (final Throwable throwable) {
throwable.printStackTrace();
} finally {
finish();
}
}
@Override
protected TreeItem<String> call() throws Exception {
final Random random = new Random(System.currentTimeMillis());
final TreeItem<String> root = new TreeItem<String>(null);
add(root, random, 5);
return root;
}
private void add(final TreeItem<String> root, final Random random, final int maxChilds) {
if (maxChilds < 1) {
return;
}
final int count = random.nextInt(maxChilds);
for (int a = 0; a < count; a++) {
final String item = String.valueOf(a);
final TreeItem<String> child = new TreeItem<String>(item);
root.getChildren().add(child);
add(child, random, maxChilds - 1);
}
}
}
/*
* Copyright (c) 2014 iFD AG Chemnitz http://www.ifdag.de
*/
private final class Block extends Tab {
private Node content = null;
private int blocks = 0;
private Block(final BooleanProperty disable) {
final BorderPane header = new BorderPane();
final Label number = new Label("12");
BorderPane.setAlignment(number, Pos.CENTER_LEFT);
header.setLeft(number);
final Label title = new Label();
title.setMaxWidth(Double.MAX_VALUE);
BorderPane.setAlignment(title, Pos.CENTER);
BorderPane.setMargin(title, new Insets(0, 4, 0, 4));
header.setCenter(title);
final Button button = new Button("X");
BorderPane.setAlignment(button, Pos.CENTER);
header.setRight(button);
final ProgressIndicator showBlock = new ProgressIndicator();
BorderPane.setAlignment(showBlock, Pos.CENTER);
setText("");
setGraphic(header);
disable.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean from, Boolean to) {
if (content == null) {
return;
}
if (to != null && to.booleanValue()) {
header.setRight(showBlock);
content.setOpacity(0.5);
blocks++;
} else if (--blocks == 0) {
header.setRight(button);
content.setOpacity(1);
}
show();
}
});
this.disableProperty().bind(disable);
}
private void setContentImpl(final Node node) {
this.content = node;
super.setContent(node);
}
private final void show() {
if (this.blocks > 0) {
final BorderPane pane = new BorderPane();
pane.setEventDispatcher(new EventDispatcher() {
/**
* @see javafx.event.EventDispatcher#dispatchEvent(javafx.event.Event,
* javafx.event.EventDispatchChain)
*/
@Override
public Event dispatchEvent(final Event event, final EventDispatchChain paramEventDispatchChain) {
return null;
}
});
pane.setCenter(this.content);
setContent(pane);
} else {
setContent(content);
}
}
}
}