我正在尝试制作一个红绿灯,在单击按钮后执行某些任务。这个红绿灯应该做的是50秒后从绿色变成黄色,10秒后从黄色变成红色,60秒后从红色变成绿色(这部分我工作得很好),如果按钮在绿色时按下,它应该变成黄色,这应该只有在绿色时至少过去10秒后才起作用。我的问题是如何检查 10 秒是否已经过去?
public class Stoplight extends Applet
{
Button cross;
public void init(){
cross = new Button("Cross");
add(cross);
StoplightCanvas stoplightCanvas = new StoplightCanvas(cross);
add(stoplightCanvas);
new StoplightThread(stoplightCanvas).start();
}
}
class StoplightCanvas extends Canvas implements ActionListener
{
int Xpos;
int Ypos;
int diameter;
Button cross;
int x = 1;
StoplightCanvas(Button cross)
{
this.cross = cross;
cross.addActionListener(this);
setSize(300, 600);
}
public void paint(Graphics g)
{
diameter = 70;
Xpos = 70;
Ypos = 50;
g.setColor(Color.BLUE);
g.fillRect(70, 50, 74, 220);
g.setColor(Color.WHITE);
if (x == 1)
g.setColor(Color.RED);
drawCircles(g, Xpos, Ypos);
g.setColor(Color.WHITE);
if (x == 2)
g.setColor(Color.YELLOW);
drawCircles(g, Xpos, Ypos + diameter);
g.setColor(Color.WHITE);
if (x == 3)
g.setColor(Color.GREEN);
drawCircles(g, Xpos, Ypos + diameter * 2);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == cross) {
}
repaint();
}
void drawCircles(Graphics g, int x, int y)
{
g.fillOval(x, y, diameter, diameter);
}
public void toggleColor() {
if (x == 1)
x = 3;
else if (x == 2)
x = 1;
else if (x == 3)
x = 2;
}
}
class StoplightThread extends Thread
{
StoplightCanvas stoplightCanvas;
StoplightThread(StoplightCanvas stoplightCanvas) {
this.stoplightCanvas = stoplightCanvas;
}
public void run()
{
while (true) {
try {
if (stoplightCanvas.x == 3){
Thread.sleep(50000);
} else if (stoplightCanvas.x == 2) {
Thread.sleep(10000);
} else if (stoplightCanvas.x == 1) {
Thread.sleep(60000);
}
} catch (InterruptedException e){}
stoplightCanvas.toggleColor();
stoplightCanvas.repaint();
}
}
}
最佳答案
您可以设置一个计时器,当他们按下按钮 10 秒时。当该时间到期时,然后通过回调将颜色更改为黄色。这比处理异常要好得多,因为它们应该是针对特殊情况的。
参见this thread关于如何设置稍后使用的计时器。
编辑
发帖者希望不使用计时器。一种方法是将按下按钮的时间存储在变量中,然后访问该变量并在 run
方法的 while 循环中与当前时间进行比较。
关于Java 线程处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390907/