JavaFX窗口自适应

在JavaFX中,窗口自适应是一项重要的功能。它使得应用程序能够根据不同的屏幕尺寸和分辨率自动调整窗口的大小和布局,以便用户在不同的设备上获得最佳的体验。

要实现JavaFX窗口的自适应,我们需要考虑以下几个方面:布局管理器、监听器和窗口大小调整。

布局管理器是JavaFX中重要的组件,它负责管理窗口中各个控件的位置和大小。JavaFX提供了多种布局管理器,如VBox、HBox、FlowPane等。我们可以根据需要选择合适的布局管理器来定义窗口中控件的位置和大小。

下面是一个使用VBox布局管理器的示例代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button button = new Button("Click me");
        VBox vbox = new VBox();
        vbox.getChildren().add(button);
        vbox.setPadding(new Insets(10));
        
        Scene scene = new Scene(vbox, 300, 200);
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX Window");
        primaryStage.show();
    }

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

在上面的示例中,我们创建了一个VBox布局管理器,并将一个按钮添加到该布局管理器中。然后,我们创建了一个场景对象,并将VBox作为根节点添加到该场景中。最后,我们设置了窗口的宽度和高度,并将场景设置为主舞台的场景。

监听器是用于监听窗口大小变化的组件。JavaFX提供了ChangeListener接口和InvalidationListener接口,可以用来监听窗口的宽度和高度的变化。我们可以在监听器中实现相应的逻辑,来处理窗口大小变化时需要改变的布局和控件。

下面是一个使用ChangeListener的示例代码:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label();
        
        Scene scene = new Scene(new StackPane(label), 300, 200);
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX Window");
        primaryStage.show();
        
        scene.widthProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                label.setText("Width: " + newValue.intValue());
            }
        });
        
        scene.heightProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                label.setText("Height: " + newValue.intValue());
            }
        });
    }

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

在上面的示例中,我们创建了一个Label控件,并将其添加到一个StackPane布局管理器中。然后,我们创建了一个场景对象,并将StackPane作为根节点添加到该场景中。最后,我们设置了窗口的宽度和高度,并分别为宽度和高度的属性添加了一个ChangeListener,用于监听宽度和高度的变化,并在Label中显示当前的宽度和高度。

窗口大小调整是用户调整窗口大小时窗口应该如何改变的功能。JavaFX提供了Region类和Resizable接口,用于实现窗口的自适应。我们可以通过设置控件的最小宽度、最小高度、最大宽度和最大高度来控制窗口的大小范围。

下面是一个使用Region和Resizable的示例代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button button1 = new Button("Button 1");
        Button button2 = new