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

时间:2016-10-29 14:40:29

标签: java windows javafx resize scenebuilder

我有以下问题:

我在桌面上用全高清创建了一个JavaFX窗口,我设置了这样的场景:

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

当我在具有1360*760分辨率的笔记本电脑上运行应用程序时,我看不到整个应用程序,我无法调整它的大小。

如何将我的应用程序设置为自动调整桌面/笔记本电脑的功能及其分辨率和尺寸?

5 个答案:

答案 0 :(得分:4)

我相信你正在寻找这个

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

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

答案 1 :(得分:2)

提及:

  1. 你必须在JavaFX布局中使用build(BorderPane,GridPane ......等......)

  2. 无法自动完成。您必须对其进行编程才能完成。

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

  4. 主题

    你问的是Responsive Design。下面是你想要做的一个例子。虽然不是最好的解决方案,但我的意思是它可以修改以获得更好的性能(我还添加了一些代码来移动窗口如果是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);
        }
    
    }
    

答案 2 :(得分:1)

你可以这样做:

   primaryStage.setMaximized(true);

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

2 - 添加一些布局约束

您可以使用场景构建器生成FXML文件并调整屏幕大小以查看正在发生的事情,请参阅本教程中的layout

这就是你告诉程序根据约束绘制组件的方式,这样,它将是响应式设计,它将遵循你的约束并自动调整组件。