当前位置: 首页 > 知识库问答 >
问题:

JavaFX:绑定Hbox间距?

辛可人
2023-03-14

我有一个tableview和一个hBox,在hBox中有三个label,一个包含文本,另一个包含表中两列的总和。我想为HBox设置一个动态的间距,使两个标签正好在它们所属的表中的两列下方对齐。是否有可能将HBox的间距绑定到列的位置。我也接受任何其他将标签固定在相应列下方的解决方案。下面是一个显示我想要的图像:

共有1个答案

杨建章
2023-03-14

将每个标签的minwidthprefwidth属性绑定到相应列的width属性:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class TableWithLabelsBelowColumns extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Void> table = new TableView<>();
        table.getItems().add(null);

        TableColumn<Void, Void> firstNameColumn = new TableColumn<>("First Name");
        TableColumn<Void, Void> lastNameColumn = new TableColumn<>("Last Name");
        TableColumn<Void, Void> emailColumn = new TableColumn<>("Email");
        table.getColumns().add(firstNameColumn);
        table.getColumns().add(lastNameColumn);
        table.getColumns().add(emailColumn);

        Label fnLabel = new Label("FN");
        Label lnLabel = new Label("LN");
        Label emailLabel = new Label("E");

        fnLabel.prefWidthProperty().bind(firstNameColumn.widthProperty());
        fnLabel.minWidthProperty().bind(firstNameColumn.widthProperty());
        lnLabel.prefWidthProperty().bind(lastNameColumn.widthProperty());
        lnLabel.minWidthProperty().bind(lastNameColumn.widthProperty());
        emailLabel.prefWidthProperty().bind(emailColumn.widthProperty());
        emailLabel.minWidthProperty().bind(emailColumn.widthProperty());

        HBox labels = new HBox(fnLabel, lnLabel, emailLabel);

        BorderPane root = new BorderPane(table);
        root.setBottom(labels);

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

另一种方法是子类pane并重写layoutChildren()方法,以便根据列的宽度定位标签。注册侦听器以请求窗格上每列宽度的布局:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class TableWithLabelsBelowColumns extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Void> table = new TableView<>();
        table.getItems().add(null);

        TableColumn<Void, Void> firstNameColumn = new TableColumn<>("First Name");
        TableColumn<Void, Void> lastNameColumn = new TableColumn<>("Last Name");
        TableColumn<Void, Void> emailColumn = new TableColumn<>("Email");
        table.getColumns().add(firstNameColumn);
        table.getColumns().add(lastNameColumn);
        table.getColumns().add(emailColumn);

        Label fnLabel = new Label("FN");
        Label lnLabel = new Label("LN");
        Label emailLabel = new Label("E");

        Pane labelPane = new Pane(fnLabel, lnLabel, emailLabel) {
            @Override
            protected void layoutChildren() {
                double fnWidth = firstNameColumn.getWidth();
                double fnHeight = fnLabel.prefHeight(fnWidth);
                fnLabel.resizeRelocate(0, 0, fnWidth, fnHeight);

                double lnWidth = lastNameColumn.getWidth();
                double lnHeight = lnLabel.prefHeight(lnWidth);
                lnLabel.resizeRelocate(fnWidth, 0, lnWidth, lnHeight);

                double emailWidth = emailColumn.getWidth();
                double emailHeight = emailLabel.prefHeight(emailWidth);
                emailLabel.resizeRelocate(fnWidth+lnWidth, 0, emailWidth, emailHeight);
            }
        };
        ChangeListener<? super Number> listener = (obs, oldValue, newValue) -> labelPane.requestLayout();
        firstNameColumn.widthProperty().addListener(listener);
        lastNameColumn.widthProperty().addListener(listener);
        emailColumn.widthProperty().addListener(listener);

        BorderPane root = new BorderPane(table);
        root.setBottom(labelPane);

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 我在将JavaFX的HBox定位成与Circle类似的方式时遇到了问题。 如果使用圆形形状,则可以手动定位它,使其绑定到不同的节点。这是我到现在为止所做的,通过使用一个窗格作为参考点: 唯一的区别是将HBox替换为圆圈,并使用layoutXProperty(),因为没有centerXProperty()。但这当然失败了,端口看起来粘在包含框架的顶部,行为奇怪。有解决办法吗?我尝试将“家长”窗格更改

  • 主要内容:示例,示例2,在HBox中增长,设置HBox首选宽度,在HBox的控件之间设置空格(空间),HBox设置填充和间距JavaFX API具有将UI控件显示到场景图上的布局类。 HBox布局类将JavaFX子节点放在水平行中。 新的子节点附加到右侧的末尾。默认情况下,HBox布局尊重子节点的首选宽度和高度。 当父节点不可调整大小时,例如节点,的行高度设置为子节点的最大首选高度。 默认情况下,每个子节点与左上()位置对齐。 我们可以通过编程方式改变HBox的布局约束,例如边框,填充,边距,间

  • 我一直在使用JavaFX开发一个软件,遇到了一个愚蠢但令人担忧的问题。 在代码的某些部分中,我有一个,其中有三个项目:、和。

  • 主要内容:绑定选项,双向绑定,高级别绑定,低级别绑定,UI控件和域模型之间的绑定JavaFX绑定同步两个值:当依赖变量更改时,其他变量更改。 要将属性绑定到另一个属性,请调用bind()方法,该方法在一个方向绑定值。 例如,当属性A绑定到属性B时,属性B的更改将更新属性A,但不可以反过来。 绑定选项 JavaFX提供了许多绑定选项,以便在域对象和GUI控件中的属性之间进行同步。 我们可以在JavaFX的Properties API中使用以下三种绑定策略: Java Bean上

  • 问题内容: 如何隐藏HBox中的项目,并使该项目使用的空间可用于其他项目。 在上面的代码中,当图例窗格隐藏时,我希望图表节点使用所有可用空间。 问题答案: 在调用legendPane.setVisible之前,请调用: 所述Node.managed特性防止一个节点在一个场景影响其他场景节点的布局。

  • 我是JAVAfx的新手,我正在尝试编写一个web浏览器。我面临的问题是:-我想把屏幕左下方的按钮放在右下方。 我正在尝试这段代码,但它不起作用。谁来帮帮我