On Sun, 10 Sep 2023 20:50:18 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:
> There are a number of tickets open related to text rendering: > > https://bugs.openjdk.org/browse/JDK-8314215 > > https://bugs.openjdk.org/browse/JDK-8145496 > > https://bugs.openjdk.org/browse/JDK-8129014 > > They have in common that wrapped text is taking the trailing spaces on each > wrapped line into account when calculating where to wrap. This looks okay > for text that is left aligned (as the spaces will be trailing the lines and > generally aren't a problem, but looks weird with CENTER and RIGHT alignments. > Even with LEFT alignment there are artifacts of this behavior, where a line > like `AAA BBB CCC` (note the **double** spaces) gets split up into `AAA `, > `BBB ` and `CCC`, but if space reduces further, it will wrap **too** early > because the space is taken into account (ie. `AAA` may still have fit just > fine, but `AAA ` doesn't, so the engine wraps it to `AA` + `A ` or > something). > > The fix for this is two fold; first the individual lines of text should not > include any trailing spaces into their widths; second, the code that is > taking the trailing space into account when wrapping should ignore all > trailing spaces (currently it is ignoring all but one trailing space). With > these two fixes, the layout in LEFT/CENTER/RIGHT alignments all look great, > and there is no more early wrapping due to a space being taking into account > while the actual text still would have fit (this is annoying in tight > layouts, where a line can be wrapped early even though it looks like it would > have fit). > > If it were that simple, we'd be done, but there may be another issue here > that needs solving: wrapped aligned TextArea's. > > TextArea don't directly support text alignment (via a setTextAlignment method > like Label) but you can change it via CSS. > > For Left alignment + wrapping, TextArea will ignore any spaces typed before a > line that was wrapped. In other words, you can type spaces as much as you > want, and they won't show up and the cursor won't move. The spaces are all > getting appended to the previous line. When you cursor through these spaces, > the cursor can be rendered out of the control's bounds. To illustrate, if > you have the text `AAA BBB CCC`, and the text gets wrapped to > `AAA`, `BBB`, `CCC`, typing spaces before `BBB` will not show up. If you > cursor back, the cursor may be outside the control bounds because so many > spaces are trailing `AAA`. > > The above behavior has NOT changed, is pretty standard for wrapped text > controls, and IMHO does not need further attent... @kevinrushforth I think this PR may be worth consideration, although I am not 100% sure that I haven't missed anything, the examples look a lot better with this fix. Here's the program I used to make the screenshots: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.text.Font; import javafx.scene.text.TextAlignment; import javafx.stage.Stage; public class TextFlowProblem2 { public static void main(String[] args) { Application.launch(App.class); } public static class App extends Application { /** * @param args the command line arguments */ public static void start(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { Label label1 = new Label("AAA BBB CCC"); label1.setFont(Font.font("courier new", 60)); label1.setWrapText(true); label1.setTextAlignment(TextAlignment.LEFT); label1.setStyle("-fx-border-color: red;"); Label label2 = new Label("AAA BBB CCC"); label2.setFont(Font.font("courier new", 60)); label2.setWrapText(true); label2.setTextAlignment(TextAlignment.CENTER); label2.setStyle("-fx-border-color: red;"); Label label3 = new Label("AAA BBB CCC"); label3.setFont(Font.font("courier new", 60)); label3.setWrapText(true); label3.setTextAlignment(TextAlignment.RIGHT); label3.setStyle("-fx-border-color: red;"); GridPane gridPane = new GridPane(); Label alignmentLabel1 = new Label("Left Aligned"); Label alignmentLabel2 = new Label("Center Aligned"); Label alignmentLabel3 = new Label("Right Aligned"); alignmentLabel1.setMinWidth(100); alignmentLabel2.setMinWidth(100); alignmentLabel3.setMinWidth(100); gridPane.addRow(0, alignmentLabel1, label1); gridPane.addRow(1, alignmentLabel2, label2); gridPane.addRow(2, alignmentLabel3, label3); stage.setScene(new Scene(gridPane)); stage.setWidth(1024); stage.setHeight(1024); stage.show(); } } } ------------- PR Comment: https://git.openjdk.org/jfx/pull/1236#issuecomment-1732332509 PR Comment: https://git.openjdk.org/jfx/pull/1236#issuecomment-1732332755