On Windows the minimum & maximum size properties of Stage don't scale to the current DPI settings, unlike all other drawing coordinates. The explicit size properties (setWidth/setHeight) do scale but setMinWidth, setMaxWidth, setMinHeight & setMaxHeight were apparently overlooked. Any values passed to them are interpreted as unscaled pixels.

Below I've added a short sample program to demonstrate the issue. Minimum size should just cover the drawn rectangle plus margins, and maximum size should be twice as big. But running at 200% DPI the *maximum* size will just cover the rectangle whereas the minimum size will show only a fraction of the rectangle.

(I'd file a bug report but my JIRA account didn't transition to the new bug tracking system, probably because I'm not an OpenJDK contributor.)

-- Chris

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class StageSizeTest extends Application {

    @Override
    public void start(Stage primaryStage) {

        // draw scene-filling rectangle with margin
        final int margin = 10, size = 200;
        Rectangle rect = new Rectangle(margin, margin, size, size);
        StackPane root = new StackPane(rect);
        final int sceneSize = size + 2 * margin;
        Scene scene = new Scene(root, sceneSize, sceneSize);

        // add extra margin for non-client area
        final int stageSize = sceneSize + 3 * margin;
        primaryStage.setMinWidth(stageSize);
        primaryStage.setMinHeight(stageSize);
        primaryStage.setMaxWidth(2 * stageSize);
        primaryStage.setMaxHeight(2 * stageSize);

        primaryStage.setTitle("Stage Size Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Reply via email to