Text mismeasured at certain Windows DPI levels

Chris Nahr chris.nahr at gmail.com
Mon Mar 12 10:33:48 UTC 2018


After some more experimentation I added some details and a screenshot 
(from another test program) to this blog post:
http://news.kynosarges.org/2018/03/11/windows-gui-dpi-scaling-in-2018/

That's about a small test suite for DPI scaling, and it's where I first 
saw this bug. Like the repro program below these test programs are quite 
simple. The bug does not seem to occur in more complex real-world 
programs, but it's reproducible when it does occur and also affects 
labeled controls other than checkboxes (saw it in buttons).

As I wrote in the blog post: My present guess is that on DPI scales that 
are not multiples of 100%, there is a small discrepancy in the initial 
measurement between a label's required width and the width provided by 
its container. In complex windows this gets eventually fixed by 
subsequent layout passes, but in simple windows the error persists and 
manifests as an ellipsis.

-- Christoph Nahr


On 2018-03-09 10:58, Chris Nahr wrote:
> I've found a pretty serious issue with CheckBox labels on Windows DPI 
> levels other than 100% or 200%. Apparently the label mismeasures itself 
> during layout, so its text is cut off with an ellipsis.
> 
> I've attached a simple program to reproduce this. Running with 
> -Dglass.win.uiScale=100%, 125%, 150%, 175%, 200% cuts off all CheckBox 
> labels on any DPI scale between 100% and 200%. My environment is Java SE 
> 9.0.4 on Windows 10 Creators Update.
> 
> The only workaround I found was to set an explicit minimum width for the 
> CheckBox. In that case the incorrect self-measurement of the label text 
> is ignored and the full text displayed.
> 
> Best regards,
> Christoph Nahr
> 
> 
> ----- Test Program -----
> 
> import javafx.application.*;
> import javafx.scene.*;
> import javafx.scene.control.*;
> import javafx.scene.layout.*;
> import javafx.stage.*;
> 
> public class CheckBoxLabel extends Application {
> 
>      public static void main(String[] args) {
>          Application.launch(args);
>      }
> 
>      @Override
>      public void start(Stage stage) {
>          final HBox box = new HBox();
>          for (int i = 0; i < 4; i++)
>              box.getChildren().add(new CheckBox("Check"));
> 
>          stage.setScene(new Scene(box));
>          stage.show();
>      }
> }
> 


More information about the openjfx-dev mailing list