[英]Java Swing Timer Not Working
我試圖每秒重新繪制我的小程序,以顯示烏龜和野兔之間的競賽,但我的小程序中的搖擺計時器似乎沒有正常工作。 任何幫助或建議將不勝感激!
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
import java.awt.Color;
public class Project2 extends Applet
{
int squaret = 1;
int squareh = 1; //initial location of tortoise and hare
int move;
String tmessage;
String hmessage;
Timer timer;
public void init()
{
timer = new Timer(100, getNewValues);
timer.addActionListener(getNewValues);
timer.start();
}
ActionListener getNewValues = new ActionListener() {
public void actionPerformed(ActionEvent e)
{
repaint();
}
};
public void paint (Graphics g)
{
move = (int)(Math.random() * 10) + 1;
if (move > 8)
{
squaret -= 6;
tmessage = "Tortoise slips!";
if (squaret < 1)
squaret = 1;
}
else if (move > 6)
{
squaret += 1;
tmessage = "Tortoise plods slowly along.";
if (squaret > 49)
squaret = 50;
squareh -=2;
hmessage = "Hare slips slightly.";
if (squareh < 1)
squareh = 1;
}
else if (move > 5)
{
squaret += 1;
tmessage = "Tortoise plods slowly along.";
if (squaret > 49)
squaret = 50;
squareh -=12;
hmessage = "Hare makes a big slip.";
if (squareh < 1)
squareh = 1;
}
else if (move > 2)
{
squaret += 3;
tmessage = "Tortoise plods along quickly.";
if (squaret > 49)
squaret = 50;
squareh += 1;
hmessage = "Hare makes a small hop.";
if (squareh > 49)
squareh = 50;
}
else
{
squaret += 3;
tmessage = "Tortoise plods along quickly.";
if (squaret > 49)
squaret = 50;
squareh += 9;
hmessage = "Hare makes a big hop.";
if (squareh > 49)
squareh = 50;
}
g.drawString("Start (Square 1)", 0, 70);
g.drawString("Finish (Square 50)", 900, 70);
//determine positions for each area
//each box is ten wide and 150 tall
final int WIDTH_OF_OVAL = 4;
final int HEIGHT_OF_OVAL = 4;
final int WIDTH_OF_SQUARE = 20;
final int HEIGHT_OF_SQUARE = 20;
g.setColor(Color.GREEN);
g.fillOval(((WIDTH_OF_SQUARE - WIDTH_OF_OVAL) / 2) + WIDTH_OF_SQUARE * (squaret - 1), ((HEIGHT_OF_SQUARE - HEIGHT_OF_OVAL) / 2), WIDTH_OF_OVAL, HEIGHT_OF_OVAL);
g.setColor(Color.YELLOW);
g.fillOval(((WIDTH_OF_SQUARE - WIDTH_OF_OVAL) / 2) + WIDTH_OF_SQUARE * (squaret - 1), ((HEIGHT_OF_SQUARE - HEIGHT_OF_OVAL) / 2) + HEIGHT_OF_SQUARE, WIDTH_OF_OVAL, HEIGHT_OF_OVAL);
//show messages
g.setColor(Color.BLACK);
g.drawString(tmessage, 10, 100);
g.drawString(hmessage, 10, 120);
g.drawLine(0, HEIGHT_OF_SQUARE, WIDTH_OF_SQUARE * 50, HEIGHT_OF_SQUARE); //draw horizontal middle line
for (int i = 0; i < 50; i++) //draw vertical lines
{
int width = (i + 1) * WIDTH_OF_SQUARE;
g.drawLine(width, 0, width, HEIGHT_OF_SQUARE * 2);
}
if (squaret > 49 && squareh > 49)
{
g.drawString("Tie!", 500, 60);
timer.stop();
}
else if (squaret > 49)
{
g.drawString("Turtle wins!", 500, 60);
timer.stop();
}
else if (squareh > 49)
{
g.drawString("Hare wins!", 500, 60);
timer.stop();
}
else
{
}
update(g);
}
public static void main(String[] args)
{
Project2 panel = new Project2();
JFrame application = new JFrame();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.add(panel);
application.setSize(2600, 300);
application.setVisible(true);
}
}
不要從paint()
調用update()
paint()
。 update()
最終將觸發paint()
,因此您將創建一個無限循環的重繪,從而導致StackOverflowError
。
其他一些問題:
假設你想要創建一個applet,我不確定你想用main()
方法實現它作為普通應用程序執行它。 也不清楚為什么選擇Applet
而不是JApplet
。
有關更多詳細信息和示例,請參閱Java Applet 。 特別是,請參閱有關main
方法的里程碑方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.