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();
}
}