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
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
- relates to
-
JDK-8285982 AWT reports maximized window size larger than the physical screen
-
- Open
-