2016-10-23 9 views
0

BorderPaneのFXMLの再読み込み後に問題があります。BorderPaneの再読み込み中心FXMLの後に影が表示される

この操作後に、topbottomのドロップシャドウが消えます。 まずセンターFXMLを常にロードしなければならないと述べました。

メソッド。 toFront()またはtoBack()NullPointerExceptionをスローします。

要素の1つを再読み込みし、他の要素から影を保護するにはどうすればよいですか?

答えて

0

ドロップシャドウはtopbottom要素から削除されません。代わりに新しいcenterが子リストの最後に追加されるため、ドロップシャドウを隠す他の子の上に描画されます。順序を保持するには、正しい順序で子を再度追加する必要があります。これは、この小さなヘルパークラスを使用して行うことができます

public class BorderPaneReloadHelper { 

    private List<ObjectProperty<Node>> permutation; 

    public void before(BorderPane pane) { 
     // get pane properties sorted by 
     final List<Node> children = pane.getChildren(); 
     permutation = Arrays.asList(pane.topProperty(), pane.leftProperty(), pane.bottomProperty(), pane.rightProperty(), pane.centerProperty()); 
     permutation.sort(Comparator.comparingInt(p -> children.indexOf(p.get()))); 
    } 

    public void after(BorderPane pane) { 
     // before and after have to be called with the same argument 
     if (permutation == null || permutation.get(0).getBean() != pane) { 
      throw new IllegalStateException("no corresponding before call"); 
     } 

     Node[] nodes = permutation.stream().map(ObjectProperty::get).toArray(Node[]::new); 
     pane.getChildren().removeAll(nodes); 
     for (int i = 0; i < nodes.length; i++) { 
      Node node = nodes[i]; 
      if (node != null) { 
       permutation.get(i).set(node); 
      } 
     } 

     // restore initial state to allow reuse of class 
     permutation = null; 
    } 

} 

それは次のように使用することができます:

BorderPaneReloadHelper helper = new BorderPaneReloadHelper(); 
helper.before(container); 

... replace center... 

helper.after(container); 
関連する問題