0

下面的代码应该使形状闪烁两次,我从根目录检查了三次方法,我 99% 确定这些方法是正确的(如果需要,我会发布该代码)。使当前 root 状态在屏幕上暂停几秒钟的最佳方法是什么?

    noLoop();      
root.setVal(newVal);
root.highlight(0,255,0);
root.setopacity(200);
redraw();
try {Thread.sleep((long)1500);} 
catch (InterruptedException ex) {println("Error!");}
root.setopacity(0);
redraw();
try {Thread.sleep((long)1500);} 
catch (InterruptedException ex) {println("Error!");}
root.setopacity(200);
root.clearHL();//just to make sure I repeated these methods
root.highlight(0,255,0);
redraw();
try {Thread.sleep((long)1500);} 
catch (InterruptedException ex) {println("Error!");}
root.clearHL();
redraw();
loop();
return root;
4

2 回答 2

2

您只能有一个线程进行绘图,如果您将该线程与sleepetc 卡住,它将“挂起”,直到它有机会退出您的代码并返回到 JRE 中呈现代码。有很多关于它的教程,谷歌是你的朋友!

例如:http ://www.java-tips.org/java-se-tips/java.awt/how-to-create-animation-paint-and-thread.html

把它想象成你在一个页面上绘图,并且不时地从你的笔记本中拉出页面来显示。不管你花 10 秒钟画一个圆圈,然后把它擦掉。重要的是页面上显示的内容。

于 2013-02-27T02:19:44.423 回答
1

我不确定我是否遇到了您的问题,并且代码不可运行,但是...也许您需要一种更简单的方法?自己做的小计时器?问题是 draw() 在 draw() 结束渲染帧之前执行所有指令。因此,如果您停止 draw(),它将暂停,不进行任何绘制,然后继续进行所有更改并在最后绘制。我的意思是,如果我这样做:

draw(){
fill(0);
ellipse(10,10,10,10);
delay(1000);
fill(255,255,0);
ellipse(10,10,10,10);
}

我永远不会看到黑色椭圆,因为它在渲染发生之前被黄色覆盖......在绘制结束时。但是程序会每帧暂停一秒钟......

所以也许一个简单的计时器可以为你做。这是一个计时器的一般示例,您可以尝试适应您的需求:

PFont font;
String time = "000";
int initialTime;
int interval = 1000;
int times;
color c = color(200);


void setup() {
  size(300, 300);
  font = createFont("Arial", 30);
  background(255);
  fill(0);
  smooth();

  //set the timer as setup is done
  initialTime = millis();
}

void draw()
{
  background(255);

  //compare elapsed time if bigger than interval...
  if (millis() - initialTime > interval)
  {
    //display the time
    time = nf(int(millis()/1000), 3);

    // reset timer
    initialTime = millis();

    //increment times
    times++;
  }

  // an arbitrary ammount
  if (times == 3) {

    //do somethng different
    c = color(random(255), random(255), random(255));

    // reset times
    times = 0;
  }

  //draw
  fill(0);
  text(time, width/2, height/2);
  fill(c);
  ellipse(75, 75, 30, 30);
}
于 2013-03-01T05:14:46.337 回答