<AWT Dev> StackOverflowError happened by TextField.setFont(...)

Ichiroh Takiguchi takiguc at linux.vnet.ibm.com
Mon Aug 27 06:14:15 UTC 2018


Hello Krishna.

Thank you for your testing.

I'm sorry, I could not put information about tested platform.
I just tested this issue with jdk-12+8 on RHEL6/7 x86_64 and Ubuntu 
14.04.5 x86_64.
Still I could recreate this issue.

Test instruction is as follows:
1. Compile and run FontChangeTest
2. Press "Shuffle" button to top
3. Change Font size (TextField) "12" to "24" on right-buttom, then press 
Enter/Return key
    Then above exception will be happened

Thanks,

On 2018-08-27 12:55, Krishna Addepalli wrote:
> Hi Ichiroh,
> 
> I have tried the steps you outlined, but I'm not able to reproduce the
> issue you are seeing. Could you try with the latest jdk12 repo?
> 
> Thanks,
> Krishna
> 
> -----Original Message-----
> From: Ichiroh Takiguchi <takiguc at linux.vnet.ibm.com>
> Sent: Friday, August 24, 2018 1:42 PM
> To: awt-dev at openjdk.java.net
> Subject: <AWT Dev> StackOverflowError happened by 
> TextField.setFont(...)
> 
> Hello.
> 
> I could see following exception by TextField.setFont(...) by jdk-12+6
> 
> =====================
> Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
>          at
> java.desktop/javax.swing.plaf.basic.BasicTextUI$UpdateHandler.layoutContainer(BasicTextUI.java:2061)
>          at java.desktop/java.awt.Container.layout(Container.java:1537)
>          at 
> java.desktop/java.awt.Container.doLayout(Container.java:1526)
>          at
> java.desktop/java.awt.Container.validateTree(Container.java:1722)
>          at 
> java.desktop/java.awt.Container.validate(Container.java:1657)
>          at
> java.desktop/sun.awt.X11.XTextFieldPeer.setFont(XTextFieldPeer.java:290)
>          at 
> java.desktop/java.awt.Component.validate(Component.java:2976)
>          at
> java.desktop/java.awt.Container.validateTree(Container.java:1740)
>          at 
> java.desktop/java.awt.Container.validate(Container.java:1657)
>          at
> java.desktop/sun.awt.X11.XTextFieldPeer.setFont(XTextFieldPeer.java:290)
>          at 
> java.desktop/java.awt.Component.validate(Component.java:2976)
>          at
> java.desktop/java.awt.Container.validateTree(Container.java:1740)
> ...
> =====================
> 
> It seemed that sun.awt.X11.XTextFieldPeer.setFont(...) was called 
> recursively.
> 
> I used following test program to recreate this issue.
> =====================
> import java.awt.*;
> import java.awt.event.*;
> import java.awt.font.*;
> import java.util.*;
> 
> public class FontChangeTest extends Frame
>    implements ActionListener, ItemListener {
>    Panel p;
>    java.util.List list = Arrays.asList(
>      "1","2","3","4","5","6","7","8","9");
>    TextField[] textfs = new TextField[list.size()];;
>    Choice fontName, fontStyle;
>    TextField fontSize;
>    final static String[] fontStyles = new String[]{
>      "Plain","Bold","Italic","ItalicBold"};
>    final static int[] fontStylesId = new int[]{
>      Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};
>    Button btn;
>    final int fSize = 12;
>    void shuffle() {
>      Collections.shuffle(list);
>      for(int i=0; i<list.size(); i++) {
>        textfs[i].setText(list.get(i).toString());
>      }
>    }
>    void init() {
>      setLayout(new BorderLayout());
>      Panel p0 = new Panel();
>      p0.setLayout(new FlowLayout());
>      add(p0, BorderLayout.NORTH);
>      btn = new Button("Shuffle");
>      btn.addActionListener(this);
>      p0.add(btn);
>      Panel p1 = new Panel();
>      p1.setLayout(new FlowLayout());
>      add(p1, BorderLayout.SOUTH);
>      fontName = new Choice();
>      fontName.addItemListener(this);
>      for(String s : Toolkit.getDefaultToolkit().getFontList()) {
>        fontName.add(s);
>      }
>      p1.add(fontName);
>      fontStyle = new Choice();
>      fontStyle.addItemListener(this);
>      for(String s : fontStyles) {
>        fontStyle.add(s);
>      }
>      p1.add(fontStyle);
>      fontSize = new TextField(String.valueOf(fSize),2);
>      fontSize.addActionListener(this);
>      p1.add(fontSize);
>      p = new Panel();
>      add(p, BorderLayout.CENTER);
>      p.setLayout(new GridLayout(0,3,3,3));
>      for(int i=0; i<list.size(); i++) {
>        textfs[i] = new TextField(1);
>        textfs[i].setFont(new Font(fontName.getSelectedItem(),
>                          fontStylesId[fontStyle.getSelectedIndex()],
>                          fSize));
>        p.add(textfs[i]);
>      }
>      shuffle();
>    }
>    public void changeFont() {
>      int size;
>      try {
>        size = Integer.parseInt(fontSize.getText());
>        for(int i=0; i<textfs.length; i++) {
>          textfs[i].setFont(new Font(fontName.getSelectedItem(),
>                            fontStylesId[fontStyle.getSelectedIndex()],
>                            size));
>        }
>      } catch (java.lang.NumberFormatException nfe) {
>      }
>    }
>    FontChangeTest() {
>      super("FontChangeTest");
>      init();
>      addWindowListener(new WindowAdapter() {
>        public void windowClosing(WindowEvent we) { System.exit(0); }
>      });
>      pack();
>      setVisible(true);
>    }
>    public void actionPerformed(ActionEvent ae) {
>      if (ae.getSource().equals(btn)) {
>        p.setVisible(false);
>        shuffle();
>        p.setVisible(true);
>      } else if (ae.getSource().equals(fontSize)) {
>        changeFont();
>        pack();
>      }
>    }
>    public void itemStateChanged(ItemEvent ie) {
>      changeFont();
>      pack();
>    }
>    public static void main(String[] args) {
>      new FontChangeTest();
>    }
> }
> =====================
> 
> Test instruction is as follows:
> 1. Compile and run FontChangeTest
> 2. Press "Shuffle" button to top
> 3. Click left buttom's Choice button, then change "Dialog" to 
> "SansSerif"
>     Then above exception will be happened
> 
> It worked fine with JDK8
> java version "1.8.0_181"
> Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM)
> 64-Bit Server VM (build 25.181-b13, mixed mode)
> 
> Failed by
> openjdk version "12-ea" 2019-03-19
> OpenJDK Runtime Environment 19.3 (build 12-ea+6) OpenJDK 64-Bit Server
> VM 19.3 (build 12-ea+6, mixed mode)
> 
> One of fix candidate is:
> =====================
> diff -r 945ba9278a27
> src/java.desktop/share/classes/java/awt/Component.java
> --- a/src/java.desktop/share/classes/java/awt/Component.java    Tue Aug
> 07 00:06:52 2018 -0700
> +++ b/src/java.desktop/share/classes/java/awt/Component.java    Fri Aug
> 24 16:59:19 2018 +0900
> @@ -1936,8 +1936,8 @@
>               if (peer != null) {
>                   f = getFont();
>                   if (f != null) {
> +                    peerFont = f;
>                       peer.setFont(f);
> -                    peerFont = f;
>                   }
>               }
>           }
> =====================
> 
> I'm not sure, it's good or not...
> 
> Thanks,
> Ichiroh Takiguchi
> IBM Japan, Ltd.



More information about the awt-dev mailing list