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顺序显示在顶部).AGridPane
允许最大限度的灵活性进行布局。下面是一个示例:注意,这里有很多样式我只是为了简洁而硬编码的,但在实际应用中,您应该将其移动到外部样式表(您可以对最大尺寸等执行相同操作):
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