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

JavaFX:在不可见的情况下确定节点的边界?

丁沛
2023-03-14

有什么方法可以确定已经附加到场景但设置为不可见的节点的边界(尤其是高度和宽度)吗?

我想仅在其宽度超过100px时才在屏幕上显示标签...但它始终为 0:

@Override
public void start(Stage primaryStage) {
    Group root = new Group();
    Scene scene = new Scene(root, 500, 500, Color.BLACK);
    primaryStage.setScene(scene);
    primaryStage.show();

    Label n = new Label();
    n.setVisible(false);
    n.setStyle("-fx-background-color: red;");
    root.getChildren()
        .addAll(n);
    n.textProperty()
        .addListener((v, ov, nv) -> {
            System.out.println(n.getBoundsInParent());
            n.setVisible(n.getWidth() > 100);
        });
    n.setText("TEST11111111111111111111111");
}    

sysout的结果:(还有n.getWidth()也好不到哪里去)

BoundingBox[minX: 0.0, minY: 0.0, minZ: 0.0,宽度: 0.0,高度: 0.0,深度: 0.0, maxX: 0.0, maxY: 0.0, maxZ: 0.0]

有什么把戏吗?

谢谢大家!

共有1个答案

阎扬
2023-03-14

您的问题是您正在侦听对 text 属性的更改,并期望节点的宽度在那时更新 - 但事实并非如此。节点的宽度仅在渲染过程中计算和设置,渲染阶段由 applyCSS 和布局例程组成(请参阅:在 JavaFX 中获取节点的高度(生成布局通道))。在计算节点的更新大小时,您的代码错误地将节点设置为不可见。

我建议您使用绑定表达式在可见性属性上创建到所需宽度属性的直接绑定,而不是使用文本属性上的侦听器来确定节点的可见性。下面提供了这种方法的示例。您可以看到,标签仅在要显示的文本大于所需宽度(在本例中为100像素)时显示。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class BoundSample extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Pane root = new Pane();
        Scene scene = new Scene(root, 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();

        Label n = new Label();
        n.setVisible(false);
        n.visibleProperty().bind(n.widthProperty().greaterThan(100));

        TextField textField = new TextField("TEST11111111111111111111111");
        n.textProperty().bind(textField.textProperty());
        textField.relocate(0, 50);

        root.getChildren().addAll(n, textField);
    }
}
 类似资料:
  • 我正在使用Scene Builder(V11.0.0)为JavaFX(v12)中的场景创建FXML文件,但是,尽管指示所有容器为首选的宽度和高度,但呈现的场景(正如在Scene Builder中看到的,以及作为加载这些FXML文件的JavaFX应用程序运行时看到的那样)在右侧和底部边缘被裁剪,因此节点位被砍掉。 在Scene Builder中,渲染器似乎必须知道场景不符合允许的边界,因为编辑器显示

  • 我们使用Hazelcast IMDG作为内存网格。我们集群中的节点数是三个,我们有一个同步备份,并且集群是分区感知的。在这种情况下,我希望分布式映射将均匀分布在3个节点上(或多或少)。如果节点发生故障,领导层应转移到健康的节点(该节点具有丢失数据的同步备份)。如果对这个新分配的leader节点有写请求,那么应该将相同的分区同步复制到一个活动节点。这是否意味着在节点故障的情况下,应该复制大约三分之一

  • 问题内容: 单击按钮后,它会更改其位置。 但是当我移动鼠标时,按钮又回到场景的中心,为什么呢? 我有以下代码: 问题答案: 建议的方法 对于您的特定代码段,也许使用Pane而不是StackPane是最好的方法。 为什么您的代码无法满足您的要求 如果要手动设置布局值,请不要使用会自动为您设置布局值的布局窗格(例如StackPane)。如果使用布局窗格,则下次布局窗格执行布局传递时(例如,调整其大小或

  • 我正在尝试接收JavaFX 2.2中一个不可见节点的MouseEvents。可以把它想象成一个互动但不可见的区域,比如当鼠标悬停在它上面时,它会触发一个动作。问题是,这不是一个静态定义的区域,但有多个区域(很多)可以被应用程序移动和调整大小。所以对于我的用例来说,全局监听鼠标移动并手动检测鼠标移动事件会有很大的开销。 目前,我正在试验一个透明矩形(),但实际/最终的应用程序将使用某种窗格,因为它实

  • 我一直在试图确定如何检测点异常给定窗口异常。 更详细地说,我知道每个30天窗口是否包含异常。例如,窗口1从2009年1月1日开始,窗口2从2009年1月2日开始,依此类推。 现在我正试图利用这些知识来确定这些异常发生的日期。如果我在2009年5月1日至2009年8月1日期间出现异常,我的窗口将从2009年1月8日最后一天的窗口发出窗口信号,从2009年5日开始。 我只是不明白如何使用窗口找到出现异

  • 我正在尝试手动对齐JavaFX窗格上的节点,但似乎无法获得节点的实际外部边界。 我不知道如何更好地解释这个问题,而不是展示我创建的以下示例来演示它: 此窗口由以下代码生成: 如何获得节点的实际外部边界?