2017-10-20 18 views
0

ノードのレイアウト:のJavaFX:行のレイアウト以下考える

enter image description here

いくつかの場合においてフィールド2(上記対応Label)は4不可視であり、フィールド3フィールドそれに応じて左に移動しなければならない。

最初の試みでは、Paneに要素を配置していました(この例のスクリーンショットでも同様でした)。すべての要素の正確な位置が不可視に設定されている場合は、正確な位置を再計算しました。このソリューションは機能していますが、要素、サイズ、または順序が変更されると、多くのメンテナンスが必要です。

別の問題について議論する中で、HBoxを使用してフィールドを配置するというアイデアが得られました。このフィールドは自動的にスペーシングされます。

しかしHBoxを使用しているため、トリックを行いません。

  1. 私の知る限りは、ラベルが要素の上に設定することはできませんHBoxに見るように。
  2. 要素を非表示に設定すると、他の要素は左に移動しません。

希望の動作をアーカイブする方法はありますか?

答えて

2

LabelComboBox/Labelにそれぞれ入れます。VBoxに入力してください。次に、要件に応じてHBoxから追加/削除します。もう1つの解決策は、すべてをGridPaneに入れて列を追加/削除することです。

+2

あなたは 'のsetVisibleを(使用する場合)'の代わりに 'VBox'の追加と削除の、ちょうど' VBox'」をバインドします'managedProperty()'を 'visibleProperty()'に返します。 –

2

Nodeを非表示にしてもレイアウトから削除されません。親のレイアウトからノードを削除するにはfalseにノードのmanagedプロパティを設定する親の子リストからNodeまたは

  • を取り除く

    1. によって行われます。

    managedプロパティを使用してノードを表示/非表示例:

    public static void toggleVisibility(Node node) { 
        boolean newValue = !node.isVisible(); 
        node.setVisible(newValue); 
    
        // invisible nodes should not be taken into account for HBox layout 
        node.setManaged(newValue); 
    } 
    
    @Override 
    public void start(Stage primaryStage) { 
        Rectangle rect1 = new Rectangle(100, 100, Color.RED.deriveColor(0, 1, 1, 0.5)); 
        Rectangle rect2 = new Rectangle(100, 100, Color.GREEN.deriveColor(0, 1, 1, 0.5)); 
        Rectangle rect3 = new Rectangle(100, 100, Color.BLUE.deriveColor(0, 1, 1, 0.5)); 
        HBox hbox = new HBox(rect1, rect2, rect3); 
    
        Scene scene = new Scene(hbox); 
        scene.setOnMouseClicked(evt -> { 
         toggleVisibility(rect2); 
        }); 
    
        primaryStage.setScene(scene); 
        primaryStage.show(); 
    } 
    
  • 関連する問題