2014-12-13 108 views
2

简而言之,我可以管理:鉴于我需要节点的布局信息(渲染节点的实际高度/宽度)来计算我的动画,我怎样才能获得该信息在javafx绘制一个框架之前?在不知道布局的情况下计算JavaFX动画值

长一点的解释:

我有一个具有出现在它(在前面)子项的TreeItem。我想要的是一个动画,可以让所有现有的孩子滑下来,为可能滑入的新项目腾出空间。每个子项目内容都是不同的,只有在运行时才知道,这意味着每个子树项目不能表示为常量。

这让我沿着这些线路编写代码:

groupController.groupTreeItem.getChildren().addListener(
     new ListChangeListener<TreeItem<Node>>() { 
      @Override public void onChanged(Change<? extends TreeItem<Node>> c) { 
       while(c.next()){ 
        if (! c.wasAdded()){ 
         continue; 
        } 

        TreeItem newItem = c.getAddedSublist().get(0) 

        new Timeline(
         new KeyFrame(
          seconds(0), 
          new KeyValue(view.translateYProperty(), -1 * newItem.getHeight()) 
         ), 
         new KeyFrame(
          seconds(1), 
          new KeyValue(view.translateYProperty(), 0) 
         ) 
        ); 
       } 
      } 
     } 
); 

这里的问题是,作为当treeItem添加到另一个,它的成分不被时间奠定了失效事件被激发,意思newItem.view.getHeight()返回0.

我的下一个想法是,然后动画执行作为对列表内容的变化和高度属性的顺序变化的反应(这让我写了一些非常可怕的代码,我宁愿不分享 - 听众加入听众是不是我真的想写的东西)。这几乎可以工作,除了javaFX将绘制一个高度属性设置的框架,但没有应用动画翻译。我可以进一步破解这条路,并尝试解决不透明的问题,并在稍后将工作排入队伍,但我认为这将成为疯狂的道路。

我想知道是否有一些伪类foo或一些布局属性的巧妙使用,我可以用它来帮助我。我一直在各种各样的财产的各种组合,并没有得到任何地方。看起来只要组件具有高度,就会呈现该组件,而不管您放入或围绕该高度分配的任何听众。

任何帮助非常感谢!

+1

有一件事我通常在这种情况下是“悄悄地”渲染对象的地方,用户无法看到,而一旦它完成渲染,然后我得到属性,从而允许继续进行适当的动画。你也许可以将一个监听器附加到你的舞台'.setOnShown()'上,我相信,然后在那个监听器中处理你的动画,因为它会被显示出来。但是,您可能会发现一些奇怪的构造类型的事情。虽然我怀疑它 – WillBD 2014-12-17 15:48:23

+0

啊这很聪明。它有点破解,但我不知道它会如何引起问题,除非隐藏的组件以某种方式以不同于实际屏幕的方式布置节点,并且这应该不太难以避免。我会试试这个。非常感谢! – Groostav 2014-12-17 19:19:02

+0

与Will类似,有时我会向节点添加一个sceneProperty失效侦听器,在接口中使用默认方法时,主要运行检查if(getScene()!= null){logic}。我认为你的情况可能会受益于一些默认值,以及... – jdub1581 2014-12-19 04:49:41

回答

0

你尝试过,覆盖这个

@Override 
protected void updateBounds() { 
    super.updateBounds(); 
} 
+0

那么有趣的是,在'Node'基类这是一个内部方法,这意味着我不会覆盖它,但节点的公共子类窗格,区域等)都将其可见性提高到受保护状态,这意味着我们可以覆盖它。我给了这一枪。 – Groostav 2015-07-08 16:52:07

相关问题