Search code examples
javaswingexceptionrotationjlabel

Java JLabel rotated with StackOverflowError


waw...!!

I actually have my JLabel variable named as jll_img And I already set an icon into it.

My purpose is to rotate this jlabel that i put icon into it.

I test it out by making a single BUtton, and then when the button is clicked, it will do rotating by a thread. A single anonymous thread that will do loop from 0 degree into 360 degree.

Here

`// my button actions

    new Thread() {

        private boolean doRotating = true;
        private double norm = 0.0;
        private double numbs = 0.0;
        private double degreeIncrementation = 10.0;

        @Override
        public void run() {

            while (doRotating) {

                try {
                    ci = new CompoundIcon(jll_img.getIcon(), new TextIcon(jll_img, ""));
                    if (numbs == 360) {
                        numbs = 0.0;
                        System.err.println("transformed into earlier post");
                        doRotating = false;
                        ri = new RotatedIcon(ci, norm);
                    } else {
                        ri = new RotatedIcon(ci, degreeIncrementation);
                    }

                    System.err.println("degree is " + numbs);
                    jll_img.setIcon(ri);

                    numbs += degreeIncrementation;
                    this.sleep(10);

                    ri = null;
                    ci = null;
                } catch (Exception exp) {
                    System.err.println("blurp!");
                    exp.printStackTrace();
                }

            }

        }
    }.start();`

To do rotating I need to add two more classes namely as RotatedIcon.java and CompoundIcon.java because this two classes that do the job mostly.

Somehow I got this error when I tried to click it until 22nd times.

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.RotatedIcon.getIconHeight(RotatedIcon.java:129) at logic.CompoundIcon.getIconHeight(CompoundIcon.java:211) at logic.CompoundIcon.paintIcon(CompoundIcon.java:229) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233) at logic.RotatedIcon.paintIcon(RotatedIcon.java:175) at logic.CompoundIcon.paintIcon(CompoundIcon.java:233)

how could this happened? if it could run until 21st... but the next 22nd and so on will eventually failed?


Solution

  • A few comments:

    a) there is no need for you to use a CompoundIcon. The code you posted is using an empty String for the TextIcon.

    b) you should not nest RotatedIcons. If you nest, the actual rotation will be the sum of all the roatations so the rotation will not be sequentail. If you nest 3 icons with angles of 1, 2, 3, then you are actually rotating a total of 6 degrees, not 3. Right now your code is like:

    RotatedIcon ri = new RotatedIcon(ri, angle);
    

    Instead you should be using:

    RotatedIcon ri = new RotatedIcon(ri.getIcon(), angle);
    

    Here is a restructured version of you code which I think does what you want:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class IconSSCCE extends JPanel implements ActionListener
    {
        JLabel label = new JLabel();
        TextIcon text;
        ImageIcon image;
        Float angle = 0.0f;
    
        public IconSSCCE()
        {
            setLayout( new BorderLayout() );
    
            text = new TextIcon(label, "Some Text", TextIcon.Layout.HORIZONTAL);
    //      text = new TextIcon(label, "", TextIcon.Layout.HORIZONTAL);
            image = new ImageIcon("dukeWaveRed.gif");
            CompoundIcon ci = new CompoundIcon(CompoundIcon.Axis.X_AXIS, image, text);
            label.setIcon( ci );
            add(label, BorderLayout.NORTH);
    
            JButton rotate = new JButton("Rotate");
            add(rotate, BorderLayout.SOUTH);
            rotate.addActionListener( new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    new Timer(50, IconSSCCE.this).start();
                }
            });
        }
    
        public void actionPerformed(ActionEvent e)
        {
            angle++;
    
            RotatedIcon ri = new RotatedIcon(image, angle);
            CompoundIcon ci = new CompoundIcon(ri, text);
            label.setIcon( ci );
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("IconSSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new IconSSCCE() );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }