JavaFX StackPane边界未更新

3
当我运行以下程序时:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Ellipse;
import javafx.stage.Stage;


public class Test1 extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {       
        Pane topPane = new Pane();      
        Scene scene = new Scene(topPane, 600, 400);

        StackPane sp = new StackPane();
        Label l1 = new Label("1 2");
        Ellipse e1 = new Ellipse(100, 50);
        e1.setOpacity(0.5);
        sp.getChildren().addAll(l1, e1);            
        e1.radiusXProperty().bind(l1.widthProperty());
        e1.radiusYProperty().bind(l1.heightProperty());         
        topPane.getChildren().add(sp);
        sp.relocate(200, 100);

        sp.setStyle("-fx-border-color: RED;");              

        Platform.runLater(() -> {
            //l1.setText("123");
            //l1.setText("1 2");
        });             

        stage.setScene(scene);
        stage.show();       
    }
}

我只对文本标签周围的区域进行了红框标记,但当我取消上述Platform.runLater()块内的两行代码时,我将获得一个包围外部椭圆形的红框,这正是我想要的效果。 因此,从模型描述中推断出的堆栈面板的布局边界似乎没有正确设置,因为边界仅由标签控件确定。但是,当我在Platform.runLater()中强制使其失效时,布局边界就会到达应该到达的位置。
为什么会发生这种情况,我该如何防止它?我希望只需指定我的模型/图表,然后在第一次显示时就能正确呈现。
1个回答

3
stage.Show();之后添加sp.requestLayout();

1
这个可以工作,但在我看来,对于这种情况,不应该需要显式的布局请求调用,而且需要这样做是 JavaFX 实现中的一个小错误,原问题提问者可能希望提交错误报告 - jewelsea
谢谢Elltz和jewelsea,sp.requestLayout()有用了。能否解释一下这里发生了什么,也就是说,为什么需要这样做的任何想法?每次在使用这种方式的StackPane上记得要这样做,这不仅仅是一个小麻烦。 - j18434
如果您取消椭圆和标签的绑定,它就可以工作;如果您为StackPane设置一个初始的setPrefSize(50.0,50.0);,它也可以工作。因此,我认为这与它有关,因为它的半径缩小到标签的大小,因此产生了那种效果。那么,这仍然是一个错误吗?@jewelsea 先生,好的J18434,这不应该发生,因为StackPane应该在记录最大子项+填充后自行调整大小,除非受到限制,但您没有这样做,但这并没有发生,这意味着在最后一刻它感到困惑了,所以请求布局将其带回到所需的状态,但边界说得不同,所以我猜这是一个错误。 - Elltz
@j18434只是通知您。就像伟大的jewelsea先生所说,提交一个错误报告并查看进展情况,不要忘记点赞和接受。 - Elltz
1
正如@jewelsea所建议的那样,我已经向Oracle报告了这个问题。该bug id为JDK-8137252,网址为http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8137252。 - j18434

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接