如何在JavaFx中自动调整窗口大小以适应不同的分辨率?

6

我有以下问题:

我在分辨率为 Full HD 的桌面上创建了一个 JavaFX 窗口,并设置场景如下:

Scene scene = new Scene(root,1475,1015);

当我在分辨率为 1360*760 的笔记本电脑上运行应用程序时,我无法看到整个应用程序,也无法调整大小。
如何设置我的应用程序根据桌面/笔记本电脑的分辨率和尺寸自动调整大小?
5个回答

6

我相信您正在寻找这个

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int width = gd.getDisplayMode().getWidth();
int height = gd.getDisplayMode().getHeight();

这将允许您使用设备的屏幕尺寸,调整大小只需要使程序中对象的长度/宽度与屏幕的宽度和高度成比例。


但是如果我在父级根节点内部有另一个Pane、TabPane和TableView,并且它们都设置了这些尺寸,那么应用程序将如何调整大小?它们会自动全部调整大小吗? - Dina Bogdan
你需要根据我记得的比例来调整屏幕大小。 - Politic Revolutionnaire

3

请注意:

  1. 您必须使用JavaFX中内置的布局(BorderPane、GridPane等)

  2. 这不能自动完成。您必须编写程序来实现它。

  3. 例如,通常情况下您想要知道不包含任务栏的屏幕宽度或高度(在Windows、Linux、Mac、Solaris中)。在这种情况下,您可以使用 getVisualBounds()...

主题


您正在询问响应式设计。以下是一个示例,展示了您想要创建的内容。虽然这不是最佳解决方案,但我意思是它可以修改以提高性能(如果是StageStyle.UNDECORATED,我还添加了一些代码以移动窗口,请拖动窗口查看此效果):

enter image description here

import javafx.application.Application;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class FX extends Application {

    int screenWidth = (int) Screen.getPrimary().getBounds().getWidth();
    int screenHeight = (int) Screen.getPrimary().getBounds().getHeight();

    Stage stage;
    Scene scene;

    int initialX;
    int initialY;

    @Override
    public void start(Stage s) throws Exception {

        // root
        BorderPane root = new BorderPane();
        root.setStyle("-fx-background-color:rgb(186,153,122,0.7); -fx-background-radius:30;");

        // Responsive Design
        int sceneWidth = 0;
        int sceneHeight = 0;
        if (screenWidth <= 800 && screenHeight <= 600) {
            sceneWidth = 600;
            sceneHeight = 350;
        } else if (screenWidth <= 1280 && screenHeight <= 768) {
            sceneWidth = 800;
            sceneHeight = 450;
        } else if (screenWidth <= 1920 && screenHeight <= 1080) {
            sceneWidth = 1000;
            sceneHeight = 650;
        }

        // Scene
        stage = new Stage();
        stage.initStyle(StageStyle.TRANSPARENT);
        scene = new Scene(root, sceneWidth, sceneHeight, Color.TRANSPARENT);

        // Moving
        scene.setOnMousePressed(m -> {
            if (m.getButton() == MouseButton.PRIMARY) {
                scene.setCursor(Cursor.MOVE);
                initialX = (int) (stage.getX() - m.getScreenX());
                initialY = (int) (stage.getY() - m.getScreenY());
            }
        });

        scene.setOnMouseDragged(m -> {
            if (m.getButton() == MouseButton.PRIMARY) {
                stage.setX(m.getScreenX() + initialX);
                stage.setY(m.getScreenY() + initialY);
            }
        });

        scene.setOnMouseReleased(m -> {
            scene.setCursor(Cursor.DEFAULT);
        });

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

    /**
     * Main Method
     * 
     * @param args
     */
    public static void main(String[] args) {
        launch(args);
    }

}

但是根元素内部的其他组件将如何调整大小? - Dina Bogdan
@Dina Bogdan 这就是为什么你要使用布局的原因。它会自动完成,但你必须定义逻辑。我的意思是,在全高清下,窗口上显示3个容器。在1200*分辨率下,也许不能显示3个容器。所以你只会显示2个或者用不同的布局来显示它们。你需要读一本相关的书籍。这不是一个问题可以回答的...就像你正在制作一款电脑应用程序,你希望它能在手机上显示一样... - GOXR3PLUS
我理解你的意思... 我在考虑使用相对位置或类似的东西。我想在各种计算机上运行我的应用程序,但是GUI方面存在问题... - Dina Bogdan

2
你可以这样做:
   primaryStage.setMaximized(true);

2
Scene scene = new Scene(root, Double.MAX_VALUE, Double.MAX_VALUE);

对我来说,这并没有让应用程序覆盖可用屏幕区域,但它确实启动了一个与我的屏幕大小成比例的应用程序窗口。使用另一个答案中提到的 stage.SetMaximized(true) 将其设置为可用屏幕大小,尽管同时使用这两个答案可以使最小化时的应用程序看起来更整洁。 - Matt

0

1-使用JavaFX布局(BorderPane、GridPane等等...)

2-添加一些布局限制

您可以使用Scene Builder生成FXML文件,并调整屏幕大小以查看发生了什么,请参见此教程layout

这是您告诉程序根据限制绘制组件的方法,因此,以这种方式它将是响应式设计,它会遵循您的约束并自动调整组件。


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