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

Reply via email to