Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8285983

JavaFX reports maximized window size larger than the physical screen

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Thinkpad Laptop with 2 Screens, Acer Laptop with 1 Screen / Windows 10 x64 / Java 17.0.3 & Java 18.0.1 JDK's from Oracle & OpenJDK.

      A DESCRIPTION OF THE PROBLEM :
      When a Window is maximized (Swing or Java FX), it reports a Screensize 16 pixels larger than the Visual Bounds (Physical Screensize, less Taskbar Insets).
      In my case that is 16 pixels wider than the physical screen & 16 pixels higher than the Visual Bounds (but less than the physical Screen height).
      The Display is correct & DOES NOT overlay the Taskbar.
      Full Screen Windows (which is NOT the same as maximized) report Windowsize = Physical Screensize as expected for both Swing & Java FX.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      2 Programs attached (see "Source code for an executable test case").
      Run these, maximize the Windows & check the Sysout.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Maximized Windowsize should be equal to the Visual Bounds (Physical Screensize - Insets)
      ACTUAL -
      Maximized Windowsize = Visual Bounds + 16 (width & height)

      ---------- BEGIN SOURCE ----------
      package screensize.oracle18;

      import javafx.application.Application;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.stage.*;

      public class JavaFxScreensize extends Application {

      @Override
      public void start(final Stage stage) throws Exception {

      final var screen = Screen.getPrimary();

      final var screenVbWidth = screen.getVisualBounds().getWidth();
      final var screenVbHeight = screen.getVisualBounds().getHeight();

      final var screenWidth = screen.getBounds() .getWidth();
      final var screenHeight = screen.getBounds() .getHeight();

      System.out.println("Screen Visual Bounds......... w*h.: " + screenVbWidth + '*' + screenVbHeight);
      System.out.println("Screen Bounds................ w*h.: " + screenWidth + '*' + screenHeight);

      final var buttonFullScreen = new Button("Toggle Full Screen");
      /**/ buttonFullScreen.setOnMouseClicked(e -> stage.setFullScreen(stage.isFullScreen() == false));

      stage.fullScreenProperty().addListener((ov, oldValue, newValue) -> {
      System.out.println("Full Screen Property Listener w*h.: " + oldValue + "->" + newValue + " Old Stage size.: " + stage.getWidth() + '*' + stage.getHeight());
      });
      stage.maximizedProperty() .addListener((ov, oldValue, newValue) -> {
      System.out.println("Maximized Property Listener.. w*h.: " + oldValue + "->" + newValue + " Old Stage size.: " + stage.getWidth() + '*' + stage.getHeight());
      });

      stage.setScene(new Scene(buttonFullScreen, 200, 100));
      stage.show();
      }

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

      package screensize.oracle18;

      import static java.awt.Frame.ICONIFIED;
      import static java.awt.Frame.MAXIMIZED_BOTH;
      import static java.awt.Frame.MAXIMIZED_HORIZ;
      import static java.awt.Frame.MAXIMIZED_VERT;

      import java.awt.*;
      import javax.swing.*;

      public final class SwingJFrameScreensize {

      public static void main(final String[] args) {

      printScreenSize();

      final var frame = new JFrame("Screensize JFrame");

      setFullScreen(frame, false); // TODO <- fullScreen=true/false

      /**/ frame.setVisible(true);
      /**/ frame.addWindowStateListener(e -> {
      final var state = frame.getExtendedState() & (MAXIMIZED_BOTH | ICONIFIED);
      switch (state) {
      case MAXIMIZED_BOTH -> {System.out.println("Maximized...: " + frame.getSize());}
      case MAXIMIZED_HORIZ -> {System.out.println("Maximized H.: " + frame.getSize());}
      case MAXIMIZED_VERT -> {System.out.println("Maximized V.: " + frame.getSize());}
      case ICONIFIED -> {System.out.println("Iconified...: " + frame.getSize());}
      default -> {System.out.println("Normal......: " + frame.getSize());}
      }
      });
      }
      private static void printScreenSize() {

      final var screen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

      for(final var config : screen.getConfigurations()) {
      final var bounds = config.getBounds();
      final var insets = Toolkit.getDefaultToolkit().getScreenInsets(config);

      final var visualX = bounds.x + insets.left;
      final var visualWidth = bounds.width - insets.left - insets.right;
      final var visualY = bounds.y + insets.top;
      final var visualHeight = bounds.height - insets.top - insets.bottom;

      System.out.println("Screen......: " + bounds);
      System.out.println("User Area...: " + new Rectangle(visualX, visualY, visualWidth, visualHeight));
      }
      }
      private static void setFullScreen(final JFrame frame, final boolean fullScreen) {

      final var button = new JButton("Print Screen Size");

      button.addActionListener(e -> {
      System.out.println("Full Screen.: " + frame.getSize());
      });

      if (fullScreen) {
      frame.add(button);
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
      frame.setUndecorated(true);
      } else {
      frame.setSize(300, 100);
      }
      }
      }

      ---------- END SOURCE ----------

      FREQUENCY : always


            lkostyra Lukasz Kostyra
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: