我正在尝试为 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();
}
在此示例中,TextArea 将获得布局为其提供的所有空间。我希望我的组件也这样做!
所有我已经尝试过的事情: - 更改属性setMaxWidth/Height、setPrefWidth/Height、setMinWidth/Height; (当我设置 MinValues 时,它总是使用这个值来绘制但不再更新“宽度”值) - 尝试使用 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);
}
});
可能我路过一些属性或忘记了一些东西,我不知道...
我已经尝试谷歌了,但似乎 JavaFX 的文档太少和肤浅,而且很多都是基于 JavaFX 脚本的...
我也接受任何比 Oracle 提供的教程更好的教程...
在此先感谢您的帮助...我写了很多... =O
最佳答案
我发现我错了......
要使组件随其父组件一起增长,您需要做的就是在 maxwidth 和/或 maxheight 上定义它的最大值为 double(如下所示),并让 minwidth/height 和 prefwidth/height 与它一起增长默认值。
this.setMaxWidth(Double.MAX_VALUE);
this.setMaxHeight(Double.MAX_VALUE);
使用此配置,当父级更改可用空间时,它将使用 final方法 setWidth()/setHeight() 来更新您的组件可以使用的宽度/高度。因此,由于这些方法是最终的,您不能覆盖它以“知道”何时发生更改。您需要添加如下所示的变更监听器,以便在您需要重新绘制组件时收到通知。
t.widthProperty().addListener(new ChangeListener() {
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
System.out.println(oldValue + "|" + newValue);
}
});
关于JavaFX:如何让我的自定义组件使用父布局中的所有可用空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9816099/