2017-08-16 10 views
0

他のコントロールが追加されたペインを含む、JavaFX 8で基本的で拡張可能なカスタムコントロールを実装しようとしています。ペインに基づいてカスタムJavaFXコントロールを実装する方法

したがって、例えば、それはTextFieldButtonCheckBox保持GridPaneを含んでもよいです。

PaneまたはGridPaneをサブクラス化したくないのは、これらのAPIをユーザーに公開したくないからです。したがって、「グリッド・ペインを拡張するノード」ではなく、「グリッド・ペインで構成されるノード」。

RegionまたはControlの拡張が可能ですが、これはお勧めですか?ペインにサイジングとレイアウトを委任するためには何が必要ですか?

public class BasePaneControl extends Control { 
    private final Pane pane; 

    public BasePaneControl(Pane pane) { 
     this.pane = pane; 
     getChildren().add(pane); 
    } 

    // What do I need to delegate here to the pane to get sizing 
    // to affect and be calculated by the pane? 
} 

public class MyControl extends BasePaneControl { 
    private final GridPane gp = new GridPane(); 
    public MyControl() { 
     super(gp); 
     gp.add(new TextField(), 0, 0); 
     gp.add(new CheckBox(), 0, 1); 
     gp.add(new Button("Whatever"), 0, 2); 
    } 

    // some methods to manage how the control works. 
} 

私は上記のBasePaneControlを実装する際に助けが必要です。

答えて

1

領域を拡張し、layoutChildrenメソッドをオーバーライドします。

BasePaneControlの位置を取得するには、Region.snappedTopInset()メソッド(および下部、左および右)を使用できます。次に、BasePaneControlの一部である可能性のある他のコンポーネントに基づいてペインを配置するように計算します。

ペインの場所がわかったらresizeRelocateに電話してください。

/** 
* Invoked during the layout pass to layout this node and all its content. 
*/ 
@Override protected void layoutChildren() { 
    // dimensions of this region 
    final double width = getWidth(); 
    final double height = getHeight(); 

    // coordinates for placing pane 
    double top = snappedTopInset(); 
    double left = snappedLeftInset(); 
    double bottom = snappedBottomInset(); 
    double right = snappedRightInset(); 

    // adjust dimensions for pane based on any nodes that are part of BasePaneControl 
    top += titleLabel.getHeight(); 
    left += someOtherNode.getWidth(); 

    // layout pane 
    pane.resizeRelocate(left,top,width-left-right,height-top-bottom); 
} 
関連する問題