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

JavaFX-标签大小未初始化

仲涵亮
2023-03-14

我正在开发一个应用程序,使用户能够绘制图形,即边和节点。作为节点,我目前正在使用普通的JavaFX标签元素。在绘制边时,我需要考虑标签的边界,然而,标签的宽度和高度似乎只有在“绘制”它之后才初始化。E、 例如,启动应用程序时,标签边界的宽度/高度为0,但如果用户重新定位标签,则宽度/高度是正确的。

是否有可能强制JavaFX绘制当前元素?代码相当复杂,但下面给出了我想做的事情:

stackpane = new StackPane();
text = new Label("Test");
text.setStyle("-fx-border-color:black; -fx-padding:3px;");
stackpane.getChildren().addAll(text);
...
// is it possible to force JavaFX to draw the text here?
...
// some calculations with the bounds of the label
Node node = getLabel();
Bounds bounds = node.getBoundsInParent();
double height = bounds.getHeight();
double width = bounds.getWidth();

我还尝试将文本包装成矩形,然后手动设置矩形的宽度/高度。这是可行的,但节点具有不同长度的标签,因此手动设置并不总是合适的。

共有1个答案

魏楷
2023-03-14

您可以尝试将您的逻辑绑定到node.boundsIn家长属性()更改

public class SmartBorder extends Application {

    @Override
    public void start(Stage primaryStage) {

        final Label txt = new Label("Example");
        txt.relocate(100, 100);

        Pane root = new Pane();

        final Rectangle border = new Rectangle();
        border.setFill(Color.TRANSPARENT);
        border.setStroke(Color.RED);

        // here we autoupdate border 
        txt.boundsInParentProperty().addListener(new ChangeListener<Bounds>() {

            @Override
            public void changed(ObservableValue<? extends Bounds> ov, Bounds old, Bounds b) {
                border.setX(b.getMinX() - 1);
                border.setY(b.getMinY() - 1);
                border.setWidth(b.getWidth()+2);
                border.setHeight(b.getHeight()+2);
            }
        });

        root.getChildren().addAll(txt, border);

        // click to see automatic border reaction
        root.setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {
                txt.relocate(Math.random()*200, Math.random()*200);
                txt.setText(Math.random() + "");
            }
        });
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
 类似资料:
  • 问题内容: 你可以通过执行以下操作来设置ArrayList的初始大小: 但是,你做不到 因为它会导致超出范围的异常。 如果无法访问分配的空间,设置初始大小有什么用? add函数的定义是,所以我不添加索引10。 问题答案: 你将数组列表的大小与其容量混淆了: 的大小是在列表中的元素的数目; 的容量是多少元素列表可以潜在地容纳而不重新分配其内部结构。 呼叫时,你是在设置列表的初始容量,而不是列表的大小

  • 我使用javafx绘制条形图和饼图。我需要: 更改条形图中x轴标签的字体大小 更改条形图标题的字体大小 更改饼图标题的字体大小 我正在使用的条形图 它仅更改xaxis上文本(单位)的字体大小,但不更改x轴标签 同样地,我正在使用 更改饼图中馅饼的标签。它确实会改变饼图标题的大小,但比例不一样。

  • 每当创建一个新实例时,我希望用字符串值填充构造函数中的数组。当我试图创建一个实例时,我的代码中出现了以下错误。 主类 活动课

  • 问题内容: 我试图从一个简单的ArrayList的内容填充ListView。这是我的 Controller.java文件: 这是我的Style.fxml文件: 该程序运行,但是我输入的歌曲没有出现在ListView中(并且Song类确实具有toString方法)。 我能做什么? 问题答案: 问题是没有将控制器的初始化为预期问题的质询者。 Java 8中FXMLLoader的操作有点奇怪。 如果您在

  • 主要内容:创建标签,标签内容,标签字体,包装文本,应用效果,标签鼠标事件,更新标签JavaFX API的包中的类可用于显示一个文本元素。 我们可以包装文本元素以适应特定空间,添加图形图像或使用JavaFX 控件应用视觉效果。 以下代码显示如何使用显示文本。 创建标签 JavaFX API提供了类的三个构造函数来创建标签。 标签内容 创建标签后,我们可以使用类中的以下方法添加文本和图形内容。 - 设置标签的文本标题 - 设置图形图标 方法设置文本和图标之间的间距。方法设置标签文本

  • 我刚开始使用JavaFX,问题是,在更改场景后,并非所有组件都被显示。例如,我有一个GridPane,它将被添加到边框中心,一个标签将被添加到边框底部。但是在我更改场景后,这个标签不会显示,只有在调整大小后才有效。 以下是一个简单的最小、完整和可验证的示例: