[英]Stack overflow error with GUI
好吧,所以我正在做一個計算器,並且我遇到了堆棧溢出錯誤,我猜是因為它試圖處理大量數據。
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");
}
}
}
}
當我注釋掉paint(g)時,我不再收到錯誤:
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)
我希望它實時更新“ Aproox大小”
在paint
和DrawStats
之間存在循環依賴關系-每個相互調用。 不要直接叫油漆。 而是調用repaint
。 還要重寫paintComponent
而不是paint
並調用super.paintComponent(g)
。
刪除方法paint
和DrawStats
並替換為此
@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);
}
如果需要定期重繪,請使用Swing計時器來調用repaint
。
另外:在命名方法名稱(例如drawStats
時,請使用Java命名約定。
哎呀...無限遞歸
@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
}
我想您會在堆棧跟蹤中看到以下內容:
...
at Size.paint
at Size.DrawStats
at Size.paint
at Size.DrawStats
at Size.paint
at Size.DrawStats
(a lot more)...
去除paint(g);
在DrawStats
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.