2 votes

Erreur de dépassement de pile avec l'interface graphique

Je suis en train de faire un calculateur, et j'obtiens une erreur de dépassement de pile, je suppose que c'est parce qu'il essaye de gérer trop de données.

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");
        } 
    }
    }
}

lorsque je commente paint(g), je n'obtiens plus l'erreur :

 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)

Je veux qu'il mette à jour la "taille de l'Aproox" en temps réel.

5voto

Reimeus Points 93429

Il existe une dépendance cyclique entre paint y DrawStats - chacun appelle l'autre. N'appelez pas directement la peinture. Invoquez plutôt repaint . Remplacer également paintComponent plutôt que paint et invoquer super.paintComponent(g) .

Supprimer les méthodes paint y DrawStats et remplacer par ceci

@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);
}

Utiliser un Minuterie de balancement pour invoquer repaint si des repeints périodiques sont nécessaires.

A part : Utilisez les conventions d'appellation Java pour nommer les noms de méthodes tels que drawStats .

1voto

johnchen902 Points 5903

Ouch... Récursion infinie

@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
}

Je suppose que vous voyez cela dans votre trace de pile :

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

Retirer paint(g); en DrawStats

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X