Stack overflow error with GUI-Collection of common programming errors

Alright so I am making a calculater, and I am getting a stack overflow error, i’m guessing because it’s trying to handle to much data.

import java.awt.*;
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Size extends JPanel implements ActionListener {

double base,size;
int shoesize;
String race;

JButton calc = new JButton("Calculate");

JTextField textsize = new JTextField(20);

public Size() {
    //JButton calc;
    System.out.println("Started the adding");

    calc.addActionListener(this);
    textsize.addActionListener(this);

    calc.setBounds(135, 200, 120, 40);
    textsize.setBounds(15,40,70,20);

    add(calc);
    add(textsize);

    setPreferredSize(new Dimension(400, 300));
    setLayout(null);
}

public static void main(String[] args) {
    JFrame frame = new JFrame("Size calc");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new Size());
    frame.pack();
    frame.setVisible(true);
}

@Override
public void paint(Graphics g){
    DrawStats(g);
}

public void DrawStats(Graphics g) {
    g.setFont(new Font(null, Font.PLAIN, 12));
    g.setColor(Color.red);
    g.drawString("Aprrox Size: " + size, 135, 15);
    paint(g);
}

public void actionPerformed(ActionEvent e) {
    if (e.getSource() == calc) {
        try {
            String ShoeSize = textsize.getText();

            shoesize = Integer.parseInt(ShoeSize);  
            size = shoesize/2;
        } catch (Exception j) {
            System.out.println("Nothing inside of the text field");
        } 
    }
    }
}

when I comment out paint(g) I no longer get the error:

 Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.lang.Character.toLowerCase(Unknown Source)
at java.lang.Character.toLowerCase(Unknown Source)
at java.lang.String.toLowerCase(Unknown Source)
at sun.font.SunFontManager.findFont2D(Unknown Source)
at java.awt.Font.getFont2D(Unknown Source)
at java.awt.Font.access$000(Unknown Source)
at java.awt.Font$FontAccessImpl.getFont2D(Unknown Source)
at sun.font.FontUtilities.getFont2D(Unknown Source)
at sun.java2d.SunGraphics2D.checkFontInfo(Unknown Source)
at sun.java2d.SunGraphics2D.getFontInfo(Unknown Source)
at sun.java2d.pipe.GlyphListPipe.drawString(Unknown Source)
at sun.java2d.SunGraphics2D.drawString(Unknown Source)

I want it to update “Aproox size” in real time

  1. There is a cyclic dependency between paint and DrawStats — each one calls the other. Don’t call paint directly. Rather invoke repaint. Also override paintComponent rather than paint and invoke super.paintComponent(g).

    Remove the methods paint and DrawStats and replace with this

    @Override
    public void paintComponent(Graphics g) {
    
       super.paintComponent(g));
       g.setFont(new Font("SansSerif", Font.PLAIN, 12));
       g.setColor(Color.red);
       g.drawString("Aprrox Size: " + size, 135, 15);
    }
    

    Use a Swing Timer to invoke repaint if periodic repaints are required.

    Aside: Use Java naming conventions when naming method names such as drawStats.

  2. Ouch… Infinite recursion

    @Override
    public void paint(Graphics g){
        DrawStats(g); // infinite recursion
    }
    public void DrawStats(Graphics g) {
        g.setFont(new Font(null, Font.PLAIN, 12));
        g.setColor(Color.red);
        g.drawString("Aprrox Size: " + size, 135, 15);
        paint(g); // infinite recursion
    }
    

    I suppose you see this in your stack trace:

    ...
    at Size.paint
    at Size.DrawStats
    at Size.paint
    at Size.DrawStats
    at Size.paint
    at Size.DrawStats
    (a lot more)...
    

    Remove paint(g); in DrawStats

Originally posted 2013-11-27 05:08:33.