Since you have a simple test program that reproduces this bug, can you please file a bug report?

http://bugreport.java.com/

Thanks.

-- Kevin

Chris Nahr wrote:
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();
     }
}

Reply via email to