我正在尝试为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时,它总是使用此值绘制但不再更新“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);
}
});
可能我经过某些房产或遗忘了某些东西,我不知道......
我已经尝试了谷歌,但似乎JavaFX的文档太小而且肤浅,而且其中很多是基于JavaFX脚本......
我也接受任何教程,比甲骨文提供的更好......
在任何帮助之前感谢...我写的东西很多...... = O
答案 0 :(得分:16)
我发现了我的错误......
要使组件与其父组成长,您需要做的就是在maxwidth和/或maxheight上定义double的最大值(如下所示),并让minwidth / height和prefwidth / height与它一起使用默认值。
this.setMaxWidth(Double.MAX_VALUE);
this.setMaxHeight(Double.MAX_VALUE);
使用此配置,当父级更改可用空间时,它将使用最终方法setWidth()/ setHeight()来更新组件可以使用的宽度/高度。因此,由于这些方法是最终的,因此无法在发生更改时将其覆盖为“知道”。您需要添加如下所示的changelistener,以便在需要重新绘制组件时收到通知。
t.widthProperty().addListener(new ChangeListener() {
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
System.out.println(oldValue + "|" + newValue);
}
});
答案 1 :(得分:4)
我发现(对于Java 8) - 自定义控件只在父节点内属于GridPane,HBox,VBox或者最好是StackPane时才能正确调整大小。 Oracle CustomControl示例使用VBox。我无法调整大小以使用AnchorPane作为我的自定义控件的顶级节点,即使在明确设置maxWidth& maxHeight
所以修改后的CustomControl.fxml是这样的:
?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -->
<?import java.lang.*?>
<?import javafx.collections.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<fx:root type="javafx.scene.layout.StackPane" xmlns:fx="http://javafx.com/fxml">
(and here inside the StackPane one can place the actual control, e.g. the
Anchor Pane with child nodes from ScreenBuilder -
works without maxWidth or maxHeight)
</fx:root>
和CustomControl.java扩展了StackPane(而不是VBox)