user2393948
user2393948

Reputation: 21

Stack overflow error with GUI

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

Upvotes: 2

Views: 989

Answers (2)

Reimeus
Reimeus

Reputation: 159844

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.

Upvotes: 5

johnchen902
johnchen902

Reputation: 9609

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

Upvotes: 1

Related Questions