对照的首选大小是多少?

时间:2015-05-11 15:54:35

标签: java javafx

我第一次尝试使用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)

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

3 个答案:

答案 0 :(得分:4)

public class ApplicationContext : DbContext { ... protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<FriendRequest>().HasRequired(m => m.User).WithMany(m => m.SentFriendRequests); modelBuilder.Entity<FriendRequest>().HasRequired(m => m.FutureFriendUser).WithMany(m => m.ReceivedFriendRequests); } 默认返回getPrefWidth()标志(-1)。

您可以使用USE_COMPUTED_SIZE获取内部计算的首选宽度。但是,在布局窗格(示例中为HBox)布置节点之前,不会计算首选宽度。这是在第一次显示舞台时发生的。

如果希望最大宽度取决于首选宽度,则有多个选项。一种是在设置最大宽度之前将首选宽度设置为固定值prefWidth(-1)

另一种方法是在节点或布局窗格上实现自定义布局算法。以下是使用自定义按钮的示例。

setPrefWidth()

答案 1 :(得分:3)

-1Region.USE_COMPUTED_SIZE的值,它告诉组件找出它自己的最佳尺寸。这是有效的,因为每个Node都有一个名为prefWidth(double height)的方法,它的双prefHeight(double width)(最小/最大大小相同),布局管理员用它来计算孩子的布局。要获得pref大小,您需要使用

button.prefWidth([-1 or Region.USE_COMPUTED_SIZE])

docs

答案 2 :(得分:1)

getPrefWidth()仅在显示/呈现Node才有效。

您可以先显示Button,也可以尝试使用Node.prefWidth(-1)