JavaFX:如何使我的自定义组件使用父布局中的所有可用空间?

Rod*_*tão 5 java javafx

我正在尝试为javafx创建一个自定义组件,所以我让我的类扩展javafx.scene.control.Control,并在构造函数上绘制它的内容.

我的疑惑是:如何让它"增长"以填充其父布局上的所有可用空间?就像我放置TextArea而不是......

这是我正在做的收缩的一个例子:

@Override
public void start(Stage primarystage) throws Exception {
    BorderPane bpane = new BorderPane();
    mainscene = new Scene(bpane, 800, 600);
    ((BorderPane) this.mainscene.getRoot()).setCenter(t);

    primarystage.setScene(mainscene);
    primarystage.show();
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,TextArea将获得布局为其提供的所有空间.我希望我的组件也一样!

我已经尝试过: - 更改属性setMaxWidth/Height,setPrefWidth/Height,setMinWidth/Height; (当我设置MinValues时,它总是使用这些值绘制但不再更新"width"值) - 尝试使用Double.MAX_VALUE来强制更大的尺寸然后布局privides; 一切都行不通:(我一定是误以为...... - 我也哭了一点,但即使这样也无济于事''(

也许一个线索是,我把这样的听众放在下面,每当​​我调整我的应用程序/阶段时,它都会更新TextArea.但是当我添加这个监听器做我的组件它永远不会得到更新...

TextArea t = new TextArea("teste");
t.widthProperty().addListener(new ChangeListener() {
  public void changed(ObservableValue observable, Object oldValue, Object newValue) {
    System.out.println(oldValue + "|" + newValue);
  }
});
Run Code Online (Sandbox Code Playgroud)

可能是我经过一些房产或忘了什么,我不知道......

我已经尝试了Google,但似乎JavaFX的文档太小而且肤浅,而且很多都是基于JavaFX脚本...

我也接受任何教程,更好的是Oracle提供的教程...

在任何帮助之前感谢...我写的很多东西... = O.

Rod*_*tão 17

我发现了我的错误......

要使组件与其父组件一起增长,您需要做的就是在maxwidth和/或maxheight上定义double的最大值(如下所示),并将minwidth/height和prefwidth/height设置为默认值.

this.setMaxWidth(Double.MAX_VALUE);
this.setMaxHeight(Double.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

使用此配置,当父级更改可用空间时,它将使用最终方法setWidth()/ setHeight()来更新组件可以使用的宽度/高度.因此,由于这些方法是最终的,因此无法在发生更改时将其覆盖为"知道".您需要添加如下所示的changelistener,以便在需要重新绘制组件时收到通知.

t.widthProperty().addListener(new ChangeListener() {
  public void changed(ObservableValue observable, Object oldValue, Object newValue) {
    System.out.println(oldValue + "|" + newValue);
  }
});
Run Code Online (Sandbox Code Playgroud)