JavaFX获取窗格的首选大小

时间:2014-08-30 20:52:26

标签: java javafx preferredsize

我需要一个Pane的真正首选尺寸(儿童的结果),但我只得到-1。有没有可能找到它?

好的,这是一个示例代码: 输出为-1.0,0.0,-1.0,-1.0但显然带有按钮的窗格有一个"首选"尺寸!?只有新的Thread有输出" real"窗格的大小,但不是首选的窗格,因为如果我在3秒钟内调整窗口大小,它会显示"真正的"尺寸而不是开头的首选尺寸......

public class ButtonTest extends Application
{
    public static void main(String [] a)
    {
        Application.launch(a);
    }

    @Override
    public void start(Stage stage) throws Exception
    {
        BorderPane root = new BorderPane();

        StackPane pane = new StackPane();


        Button b = new Button("Testbutton");


        pane.getChildren().add(b);
        pane.setStyle("-fx-background-color: red;");

        System.out.println(pane.getPrefWidth());
        System.out.println(pane.getWidth());
        System.out.println(pane.getMinWidth());
        System.out.println(pane.getMaxWidth());

        root.setCenter(pane);
        Scene scene  = new Scene(root);

        Thread t = new Thread(new Runnable()
        {           
            @Override
            public void run()
            {
                try
                {
                    Thread.sleep(3000);
                } catch (InterruptedException e)
                {
                    // TODO: Handle Exception
                    e.printStackTrace();
                }
                System.out.println(pane.getPrefWidth());
                System.out.println(pane.getWidth());
                System.out.println(pane.getMinWidth());
                System.out.println(pane.getMaxWidth());
            }
        });
        t.setDaemon(true);
        t.start();
    }
}

2 个答案:

答案 0 :(得分:0)

默认情况下,StackPane具有由继承约束设置的PrefWidth和PrefHeight" USE_COMPUTED_SIZE" (女巫值等于-1)在父类" Region"。

中定义

这个定义意味着将在布局过程中计算出更好的尺寸。

也许你的概念错过了。 Pref值用于布局过程,知道它应该如何在画布中排列对象。要知道组件的实际大小,您可以使用我之前提到的方法' getBoundsInParent()'或者' getBoundsInLocal()' (在javadoc中解释了thoose之间的差异)。

但是,了解组件在布局过程中计算出的大小非常重要。通常,布局过程发生在分离的线程上,而不是事件或main()线程。这就是为什么睡了3秒后让你做的伎俩。您可以尝试使用以下代码来让代码在JavaFX GUI线程中执行(从最后一行代码开始):

Platform.runLater(new Runnable() {
    @Override public void run() {
        <Your code in GUI Thread>
    }
});

希望它可以提供一些帮助。很抱歉没有提供示例代码,但我没有安装环境的机器。我会尽力改善我的回答。

祝你好运。 (请任何人,随时纠正我的英语,我知道它很可怕)

答案 1 :(得分:0)

好的,非常感谢您的探索。但是其他方法也没有返回正确的结果......

也许这个案例有助于理解我的目标是什么: 一个相关的问题是我有一个SplitPane,两个部分,现在我隐藏第二部分(分隔符位置= 1.0)并且仅显示第一部分,有时我也想显示第二部分。我这样做是为了重新划分分隔线。但在任何时候都可能发生,第二部分可以用新元素更新(=>更新必要的大小)。现在,要重新定位分隔符(带动画),我需要(隐藏)第二部分的首选大小?!如果没有真正的代码,您是否知道如何解决问题?

更新: 我用“实际大小”解决了问题,在窗格中添加了一个公共doubleproperty并将其绑定到窗格的widthproperty。现在我可以在splitpane中为这个doubleproperty添加一个changelistener。在第一次看到后,我得到了正确的像素大小。

public DoubleProperty realWidth;

    pane.setPrefWidth(USE_PREF_SIZE);
    pane.setMaxWidth(USE_PREF_SIZE);

    realWidth = new SimpleDoubleProperty(0.0);
    realWidth.bind(this.widthProperty());

=&GT;从其他地方添加更改侦听器

但是我知道如果我向窗格添加一个按钮(3秒后),则不会通知splitpane(此realWidth属性上的changelistener)......

更新:通知:D但是没有添加按钮而是添加了e。 G。堆栈窗格按预期工作。非常感谢您帮助了解它是如何工作的!