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

时间:2012-03-22 03:35:19

标签: 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();
}

在此示例中,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

2 个答案:

答案 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)