Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX自动调整大小&;自动定位_Java_Javafx - Fatal编程技术网

JavaFX自动调整大小&;自动定位

JavaFX自动调整大小&;自动定位,java,javafx,Java,Javafx,我有一个VBox,其中包含窗格s。在VBox上,我想显示另一个元素(目前我使用的是窗格)。此元素必须覆盖VBox中的多个窗格,因此我将此元素与VBox一起放在锚链内。整个结构如下所示: HBox VBox Label <--- "Friday" AnchorPane VBox <--- the VBox with Panes Pane ... Pane <--- the Pane over

我有一个
VBox
,其中包含
窗格
s。在
VBox
上,我想显示另一个元素(目前我使用的是
窗格
)。此元素必须覆盖
VBox
中的多个
窗格
,因此我将此元素与
VBox
一起放在
锚链内
。整个结构如下所示:

HBox
  VBox
    Label   <--- "Friday"
    AnchorPane
      VBox   <--- the VBox with Panes
        Pane
        ...
      Pane   <--- the Pane over the VBox  (red in images)
HBox
VBox

标签如果您只需要一个红色矩形,我建议您使用
矩形
形状而不是窗格。这允许您明确地绑定其宽度和高度。

如果您只需要一个红色矩形,我建议您使用
矩形
形状而不是窗格。这允许您明确地绑定其宽度和高度。

考虑使用
网格窗格来实现类似的功能。可以将多个节点添加到网格中的同一单元格(最后添加的节点将按z顺序显示在顶部)。
GridPane
允许最大限度的布局灵活性。这里有一个例子:请注意,这里有很多样式,我只是为了简洁而硬编码,但在实际应用中,您应该将其移动到外部样式表(您可以对最大尺寸等执行相同的操作):

import java.time.DayOfWeek;
导入java.time.Duration;
导入java.time.LocalTime;
导入java.time.format.DateTimeFormatter;
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.ColumnConstraints;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.Region;
导入javafx.scene.layout.RowConstraints;
导入javafx.stage.stage;
公共类日历示例扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
GridPane日历=新建GridPane();
//标题:

对于(DayOfWeek DayOfWeek=DayOfWeek.MONDAY;DayOfWeek.getValue()请考虑使用
GridPane
实现类似功能。您可以将多个节点添加到网格中的同一单元格中(最后添加的节点将按z顺序显示在顶部).A
GridPane
允许最大限度的灵活性进行布局。下面是一个示例:注意,这里有很多样式我只是为了简洁而硬编码的,但在实际应用中,您应该将其移动到外部样式表(您可以对最大尺寸等执行相同操作):

import java.time.DayOfWeek;
导入java.time.Duration;
导入java.time.LocalTime;
导入java.time.format.DateTimeFormatter;
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.ColumnConstraints;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.Region;
导入javafx.scene.layout.RowConstraints;
导入javafx.stage.stage;
公共类日历示例扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
GridPane日历=新建GridPane();
//标题:

对于(DayOfWeek DayOfWeek=DayOfWeek.MONDAY;DayOfWeek.getValue()
width
height
属性可能是只读的,但您可以指定首选大小并使用
自动调整大小

示例

以下代码使叠加从50%高度开始,高度为
VBox
高度的1/3:

@Override
public void start(Stage primaryStage) {
    Region region1 = new Region();
    VBox.setVgrow(region1, Priority.ALWAYS);
    region1.setStyle("-fx-background-color: blue;");

    Region region2 = new Region();
    VBox.setVgrow(region2, Priority.ALWAYS);
    region2.setStyle("-fx-background-color: lime;");

    Region regionOverlay = new Region();
    regionOverlay.setStyle("-fx-background-color: red;");
    regionOverlay.setManaged(false);

    VBox root = new VBox(region1, region2, regionOverlay);
    root.layoutBoundsProperty().addListener((observable, oldValue, newValue) -> {
        regionOverlay.setPrefSize(newValue.getWidth() - 20, newValue.getHeight() / 3);
        regionOverlay.setLayoutX(10);
        regionOverlay.setLayoutY(newValue.getHeight() / 2);
        regionOverlay.autosize();
    });

    root.setPrefSize(400, 400);

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

width
height
属性可能是只读的,但您可以指定首选的大小并使用
autosize

示例

以下代码使叠加从50%高度开始,高度为
VBox
高度的1/3:

@Override
public void start(Stage primaryStage) {
    Region region1 = new Region();
    VBox.setVgrow(region1, Priority.ALWAYS);
    region1.setStyle("-fx-background-color: blue;");

    Region region2 = new Region();
    VBox.setVgrow(region2, Priority.ALWAYS);
    region2.setStyle("-fx-background-color: lime;");

    Region regionOverlay = new Region();
    regionOverlay.setStyle("-fx-background-color: red;");
    regionOverlay.setManaged(false);

    VBox root = new VBox(region1, region2, regionOverlay);
    root.layoutBoundsProperty().addListener((observable, oldValue, newValue) -> {
        regionOverlay.setPrefSize(newValue.getWidth() - 20, newValue.getHeight() / 3);
        regionOverlay.setLayoutX(10);
        regionOverlay.setLayoutY(newValue.getHeight() / 2);
        regionOverlay.autosize();
    });

    root.setPrefSize(400, 400);

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}


您可以使用绑定实现所需偏移量的逻辑,以保持同步。什么绑定?我在哪里设置它们?键入时未看到您的编辑。请参阅我的答案。您可以使用绑定实现所需偏移量的逻辑,以保持同步。什么绑定?我在哪里设置它们?键入时未看到您的编辑。请参阅我的answ呃.实际上我不太确定我能不能用一个
矩形
,因为在
窗格中
将包含一些文本(一个
标签
或其他东西)。我在父级上使用侦听器解决了这个问题。无论如何,谢谢。@Kyril如果您使用侦听器来管理布局,几乎肯定有更好的方法。使用某种布局窗格可以为您实现这一点。使用哪种布局窗格?我对JavaFX非常陌生,因此非常感谢您的帮助。谢谢。@Kyril给出了一个答案,其中包含一个您可以尝试的示例。
GridPane
可能是您在这里需要的。实际上,我不太确定是否可以使用
矩形,因为在
窗格中
将包含一些文本(标签
或其他内容)。我在父级上使用侦听器解决了这个问题。无论如何,谢谢。@Kyril如果您使用侦听器来管理布局,几乎肯定有更好的方法。使用某种布局窗格可以为您实现这一点。使用哪种布局窗格?我对JavaFX非常陌生,因此非常感谢您的帮助。谢谢。@Kyril给出了一个答案,其中包含一个您可以尝试的示例。
GridPane
可能是您在这里需要的。谢谢,这就是我需要的!另一个您可能知道答案的问题:是否可以通过列(“:”)来证明第一列中的小时数?@Kyril我想不出一个简单的方法。我想到的一个想法是在该列的每个单元格中使用一个
GridPane
,包含一行和三列。使用列约束,使第一列和最后一列的
hgrow
设置为
始终
,中间列设置为
从不
;设置
>halignment
对于第一列到
右侧
和第三列到
左侧
。然后在每个单元格中放置一个标签:小时,然后
:“
,然后是分钟。这样做可以,但有点复杂。@Kyril还有,请标记ans