Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8182369

JTextArea freeze when loading a text (~700,000 chars) with at least one non-US characters

XMLWordPrintable

      FULL PRODUCT VERSION :
      1.8.0_66
      1.8.0_131

      ADDITIONAL OS VERSION INFORMATION :
      Windows 10

      A DESCRIPTION OF THE PROBLEM :
      we encountered a situation in which we load a text area with a large amount of text
      and there was a case that the UI was not responding for about 2-3 minutes

      after investigation i realized that the problem was because the text contained a Cyrillic character i addition to about 700000 US characters.

      **Note that if the text is short -> no problem

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      import java.awt.BorderLayout;
      import java.awt.Container;

      import javax.swing.JFrame;
      import javax.swing.JScrollPane;
      import javax.swing.JTextArea;
      public class FrameTest {
          public static void main(String[] args) {
              JFrame jf = new JFrame("Demo Large Amount of character with non-english chars");
              Container cp = jf.getContentPane();
              cp.setLayout(new BorderLayout());
              JTextArea ta1 = new JTextArea(20, 20);
              cp.add(new JScrollPane(ta1), BorderLayout.CENTER);
              jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              for (int i = 0; i < 100000; i++) {
               ta1.append(i+" \n");
      }
              ta1.append("Yandex (Russian: Я́ндекс)");//the problematic text
              jf.setSize(700, 700);
              jf.setVisible(true);
          }
      }

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      the dialog should be opened immediately
      ACTUAL -
      if the problematic row is commented out the dialog open immediately, else it takes about 60 seconds

      ERROR MESSAGES/STACK TRACES THAT OCCUR :

      "main" #1 prio=5 os_prio=0 tid=0x0000000002486000 nid=0x33a8 runnable [0x000000000247e000]
         java.lang.Thread.State: RUNNABLE
              at javax.swing.text.GlyphView.getBreakSpot(GlyphView.java:791)
              at javax.swing.text.GlyphView.getMinimumSpan(GlyphView.java:551)
              at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:724)
              at javax.swing.plaf.basic.BasicTextAreaUI$PlainParagraph.calculateMinorAxisRequirements(BasicTextAreaUI.java:272)
              at javax.swing.text.BoxView.checkRequests(BoxView.java:935)
              at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:568)
              at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:903)
              at javax.swing.text.BoxView.checkRequests(BoxView.java:935)
              at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:343)
              at javax.swing.text.BoxView.layout(BoxView.java:708)
              at javax.swing.text.BoxView.setSize(BoxView.java:397)
              at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1722)
              at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:917)
              at javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:120)
              at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
              at javax.swing.JTextArea.getPreferredSize(JTextArea.java:618)
              at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:791)
              at java.awt.Container.layout(Container.java:1510)
              at java.awt.Container.doLayout(Container.java:1499)
              at java.awt.Container.validateTree(Container.java:1695)
              at java.awt.Container.validateTree(Container.java:1704)
              at java.awt.Container.validateTree(Container.java:1704)
              at java.awt.Container.validateTree(Container.java:1704)
              at java.awt.Container.validateTree(Container.java:1704)
              at java.awt.Container.validate(Container.java:1630)
              - locked <0x00000005c3ec3ba8> (a java.awt.Component$AWTTreeLock)
              at java.awt.Container.validateUnconditionally(Container.java:1667)
              - locked <0x00000005c3ec3ba8> (a java.awt.Component$AWTTreeLock)
              at java.awt.Window.show(Window.java:1033)
              at java.awt.Component.show(Component.java:1673)
              at java.awt.Component.setVisible(Component.java:1625)
              at java.awt.Window.setVisible(Window.java:1014)
              at com.skybox.view.app.FrameTest.main(FrameTest.java:25)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.awt.BorderLayout;
      import java.awt.Container;

      import javax.swing.JFrame;
      import javax.swing.JScrollPane;
      import javax.swing.JTextArea;
      public class FrameTest {
          public static void main(String[] args) {
              JFrame jf = new JFrame("Demo Large Amount of character with non-english chars");
              Container cp = jf.getContentPane();
              cp.setLayout(new BorderLayout());
              JTextArea ta1 = new JTextArea(20, 20);
              cp.add(new JScrollPane(ta1), BorderLayout.CENTER);
              jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              for (int i = 0; i < 100000; i++) {
               ta1.append(i+" \n");
      }
              ta1.append("Yandex (Russian: Я́ндекс)");//the problematic text
              jf.setSize(700, 700);
              jf.setVisible(true);
          }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      NO WORKAROUND FOUND

      SUPPORT :
      YES

            kizune Alexander Zuev
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: