gpt4 book ai didi

JavaFX - 标签大小未初始化

转载 作者:太空宇宙 更新时间:2023-11-04 06:41:51 24 4
gpt4 key购买 nike

我正在开发一个应用程序,使用户能够绘制图形,即边和节点。作为节点,我目前使用普通的 JavaFX 标签元素。绘制边缘时,我需要考虑标签的边界,但是,标签的宽度和高度似乎只有在“绘制”它之后才被初始化。例如,启动应用程序时,标签边界的宽度/高度为 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();

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

最佳答案

您可以尝试将逻辑绑定(bind)到node.boundsInParentProperty()更改

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();
}
}

关于JavaFX - 标签大小未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com