-
Bug
-
Resolution: Unresolved
-
P3
-
11.0.19, 17.0.7, 20, 21, 23, 24, 25
-
Cause Known
-
b22
-
x86_64
-
windows
ADDITIONAL SYSTEM INFORMATION :
Windows 11
JDK 21.0.3
A DESCRIPTION OF THE PROBLEM :
LineBorder does not scale correctly. With my OS set to 150% scale for example, the width of the LineBorder is the same as with my OS at 100% scale.
The bug is new since JDK 17.0.3. It works as expected in that version.
I believe the bug is in the following line of code in javax.swing.border.LineBorder:
int offs = this.thickness * (int) scaleFactor;
Note how scaleFactor is cast to an int before being used, thus losing the fractional part! This means that a scaling factor of 1.5 will result in an effective scale factor of 1. And a scale factor of 0.5 will result in an effective scale factor of 0 (making the border disappear entirely).
REGRESSION : Last worked in version 17
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Set your OS scaling to 150% via the OS settings
2. Run the code below
3. Print screen the Java app and paste it to a paint program
4. Measure the width of the red border in pixels
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The border is 15 pixels wide
ACTUAL -
The border is 10 pixels wide
---------- BEGIN SOURCE ----------
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
public class LineBorderBug {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
JPanel panel = new JPanel();
panel.setBorder(new LineBorder(Color.RED, 10));
frame.add(panel);
frame.setVisible(true);
}
}
---------- END SOURCE ----------
FREQUENCY : always
Windows 11
JDK 21.0.3
A DESCRIPTION OF THE PROBLEM :
LineBorder does not scale correctly. With my OS set to 150% scale for example, the width of the LineBorder is the same as with my OS at 100% scale.
The bug is new since JDK 17.0.3. It works as expected in that version.
I believe the bug is in the following line of code in javax.swing.border.LineBorder:
int offs = this.thickness * (int) scaleFactor;
Note how scaleFactor is cast to an int before being used, thus losing the fractional part! This means that a scaling factor of 1.5 will result in an effective scale factor of 1. And a scale factor of 0.5 will result in an effective scale factor of 0 (making the border disappear entirely).
REGRESSION : Last worked in version 17
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Set your OS scaling to 150% via the OS settings
2. Run the code below
3. Print screen the Java app and paste it to a paint program
4. Measure the width of the red border in pixels
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The border is 15 pixels wide
ACTUAL -
The border is 10 pixels wide
---------- BEGIN SOURCE ----------
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
public class LineBorderBug {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
JPanel panel = new JPanel();
panel.setBorder(new LineBorder(Color.RED, 10));
frame.add(panel);
frame.setVisible(true);
}
}
---------- END SOURCE ----------
FREQUENCY : always
- caused by
-
JDK-8282958 Rendering Issues with Borders on Windows High-DPI systems
-
- Resolved
-
- relates to
-
JDK-8294680 Refactor scaled border rendering
-
- Resolved
-