Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8095729

java.lang.ArrayIndexOutOfBoundsException in StyleHelper

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Fix
    • Icon: P3 P3
    • None
    • 7u67
    • javafx
    • Win 8.1 x64
      java 1.7
      java 1.8 works

      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);
                  }
              }
          }
      }

            alexp Alexander Potochkin (Inactive)
            sdazujfx Senf Dazu (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: