我第一次尝试使用JavaFX,并且试图了解一些有关布局管理的知识。我们如何访问控件的首选大小?

在下面的示例中,我尝试将最大宽度设置为比首选宽度大200个像素。也就是说,我希望按钮随着框架宽度的增加而增大(最大)。

但是,当我运行代码时,首选宽度是-1,因此在首选宽度上加上200会得到最大宽度199。

import javafx.application.Application;
import javafx.event.*;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.geometry.Insets;

public class BorderPaneSSCCE extends Application
{
    @Override
    public void start(Stage primaryStage)
    {
        Button button = new Button( "Button at PreferredSize" );
        button.setMaxWidth( button.getPrefWidth() + 200 );
        System.out.println(button.prefWidth(-1) + " : " + button.getPrefWidth());

        button.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent event)
            {
                System.out.println("Width: " + button.getWidth());
            }
        });

        HBox root = new HBox();
        HBox.setHgrow(button, Priority.ALWAYS);
        root.getChildren().add(button);

        Scene scene = new Scene(root);
        primaryStage.setTitle("Java FX");
        primaryStage.setScene(scene);
        primaryStage.show();
        System.out.println(button.prefWidth(-1) + " : " + button.getPrefWidth());
    }

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

当我运行代码并单击按钮时,我看到:Width: 139.0
在我调整了框架的宽度大小之后,使按钮尽可能的大,然后单击按钮,我看到:Width: 199.0
我希望看到Width: 339.0(即139 + 200)

那么,我们如何访问控件的首选大小/宽度?

最佳答案

getPrefWidth()默认情况下返回USE_COMPUTED_SIZE标志(为-1)。

您可以使用prefWidth(-1)来获取内部计算的首选宽度。但是,直到通过布局 Pane (在您的示例中为HBox)对节点进行布局后,才会计算出首选宽度。这是第一次在显示舞台时发生。

如果希望最大宽度取决于首选宽度,则可以有多个选择。一种是在设置最大宽度之前,使用setPrefWidth()将首选宽度设置为固定值。

另一个是在节点上或在布局 Pane 上实现自定义布局算法。这是使用自定义按钮的示例。

// button whose maxWidth is always prefWidth + 200
Button button = new Button() {
    @Override
    protected double computeMaxWidth(double height)
    {
        return this.prefWidth(height) + 200.0;
    }
};

关于java - 控件的首选大小是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30172252/

10-10 11:11