CodeArea: too frequent model updates

Kevin Rushforth kevin.rushforth at oracle.com
Wed Apr 30 16:22:14 UTC 2025


https://bugs.openjdk.org/browse/JDK-8355986

On 4/30/2025 9:05 AM, Andy Goryachev wrote:
>
> Thank you, Pavel, for filing the ticket (it will take some time before 
> it gets routed to me).  And thank you so much for the feedback - keep 
> it going!
>
> -andy
>
> *From: *openjfx-dev <openjfx-dev-retn at openjdk.org> on behalf of 
> PavelTurk <pavelturk2000 at gmail.com>
> *Date: *Wednesday, April 30, 2025 at 08:54
> *To: *openjfx-dev at openjdk.org <openjfx-dev at openjdk.org>
> *Subject: *Re: CodeArea: too frequent model updates
>
> Hello, Andy
>
> I've made sure to formulate everything very precisely and just created 
> a new issue. Unfortunately I know only its ID: 9078451.
>
> If my proposal is incorrect - then this issue is not meant to be 
> resolved. However, I'm certain this is an important question regardless.
>
> Best regards, Pavel
>
> On 4/30/25 17:45, Andy Goryachev wrote:
>
>     Dear Pavel:
>
>     As I mentioned before, the view might request more paragraphs than
>     currently visible, so it works as designed.
>
>     When you say it's slow, could you tell what metric / measurement
>     you used?  The attached code does not appear slow on my macOS. 
>     Would you provide a reproducer which can illustrate the issue?
>
>     Thanks
>
>     -andy
>
>     *From: *openjfx-dev <openjfx-dev-retn at openjdk.org>
>     <mailto:openjfx-dev-retn at openjdk.org> on behalf of PavelTurk
>     <pavelturk2000 at gmail.com> <mailto:pavelturk2000 at gmail.com>
>     *Date: *Wednesday, April 30, 2025 at 04:14
>     *To: *openjfx-dev at openjdk.org <openjfx-dev at openjdk.org>
>     <mailto:openjfx-dev at openjdk.org>
>     *Subject: *CodeArea: too frequent model updates
>
>     Trying to understand why my Jfx CodeArea works so slowly I wrote a
>     test application (see below).
>     And I got interesting results. If you start the application you
>     will see that about 10 paragraphs
>     are visible.
>
>     1. If after start you click on the report button you will see that
>     about 113 paragraphs were created (remember 10 visible).
>     2. If you click event button (as I understand to update only 15
>     paragraphs - I can be wrong here) in the report you will see 112
>     paragraphs.
>     3. If you scroll to line 100, click report to clear, add one
>     letter via keyboard and in the new report you will see 210
>     paragraphs were updated.
>     So, with one paragraph modified and 10 paragraphs visible CodeArea
>     updates 210 paragraphs.
>
>     I see two solutions here:
>     1) If Jfx CodeArea wants to update paragraphs itself it should be
>     optimized
>     2) A better solution is to remove final modifier from
>     CodeTextModel.getParagraph(int index) method so that we could
>     override it.
>
>     public class JfxTextArea extends Application {
>
>          @Override
>          public void start(Stage primaryStage) throws Exception {
>              CodeArea codeArea = new CodeArea();
>     codeArea.setLineNumbersEnabled(true);
>              final List<Integer> requestedIndexes = new ArrayList<>();
>              codeArea.setSyntaxDecorator(new SyntaxDecorator() {
>                  @Override
>                  public RichParagraph
>     createRichParagraph(CodeTextModel ctm, int i) {
>                      requestedIndexes.add(i);
>                      RichParagraph.Builder b = RichParagraph.builder();
>     b.addSegment(ctm.getPlainText(i));
>                      return b.build();
>                  }
>
>                  @Override
>                  public void handleChange(CodeTextModel ctm, TextPos
>     tp, TextPos tp1, int i, int i1, int i2) {
>
>                  }
>              });
>              StringBuilder sb = new StringBuilder();
>              for (var i = 0; i < 1000; i++) {
>                  sb.append(i);
>                  sb.append("\n");
>              }
>              codeArea.setText(sb.toString());
>
>              var reportButton = new Button("Report & Clear");
>              reportButton.setOnAction(e -> {
>     Collections.sort(requestedIndexes);
>     System.out.println("Created/Updated " + requestedIndexes.size() +
>     " paragraphs: " + requestedIndexes);
>                  requestedIndexes.clear();
>              });
>              var topButton = new Button("To Top");
>              topButton.setOnAction(e -> codeArea.select(new TextPos(0,
>     0, 0, true)));
>              var bottomButton = new Button("To Bottom");
>              bottomButton.setOnAction(e -> codeArea.select(new
>     TextPos(999, 0, 0, true)));
>              var eventButton = new Button("Fire Event");
>              eventButton.setOnAction(e -> codeArea.getModel()
>                      .fireStyleChangeEvent(new TextPos(0, 0, 0, true),
>     new TextPos(15, 0, 0, true)));
>              HBox buttonBox = new HBox(reportButton, topButton,
>     bottomButton, eventButton);
>
>              VBox.setVgrow(codeArea, Priority.ALWAYS);
>              VBox root = new VBox(codeArea, buttonBox);
>              Scene scene = new Scene(root, 600, 200);
>              primaryStage.setScene(scene);
>              primaryStage.show();
>
>          }
>
>          public static void main(String[] args) {
>              launch(args);
>          }
>
>     }
>
>     Best regards, Pavel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20250430/8c72ce69/attachment-0001.htm>


More information about the openjfx-dev mailing list