Java 处理代码不为';t工作(线程、draw()、noLoop()和loop())

Java 处理代码不为';t工作(线程、draw()、noLoop()和loop()),java,processing,Java,Processing,下面的代码应该使一个形状闪烁两次,我从root三次检查了这些方法,我99%确定这些方法是正确的(如果需要,我会发布代码)。让根目录的当前状态在屏幕上暂停几秒钟的最佳方法是什么 noLoop(); root.setVal(newVal); root.highlight(0,255,0); root.setopacity(200); redraw(); try {Thread.sleep((long)1500);} catch (InterruptedException ex)

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

    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;

您只能有一个线程进行绘图,如果您用
sleep
等阻塞该线程,它将“挂起”,直到有机会从代码中退出并返回到JRE中渲染代码。 有很多关于它的教程,谷歌是你的朋友

e、 g:


想象一下,当你在一个页面上画图时,这个页面会不时地从你的笔记本中被拉出来显示。如果你花10秒钟画一个圆,然后把它擦掉,这无关紧要。重要的是当页面显示时页面上的内容。

您只能有一个线程来绘制,如果您用
睡眠
等阻塞该线程,它将“挂起”,直到有机会从您的代码中退出并返回到JRE中呈现代码。 有很多关于它的教程,谷歌是你的朋友

e、 g:


想象一下,当你在一个页面上画图时,这个页面会不时地从你的笔记本中被拉出来显示。如果你花10秒钟画一个圆,然后把它擦掉,这无关紧要。重要的是显示页面时页面上的内容。

我不确定是否有您的问题,代码也无法运行,但是……也许您需要一种更简单的方法?你自己做的小计时器?问题是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);
}

我不确定我是否遇到了你的问题,而且代码无法运行,但是……也许你需要一个更简单的方法?你自己做的小计时器?问题是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);
}

那你建议我用什么呢?你不能用一个方法去{draw();wait();draw();wait()…}。它就是不能那样工作。你需要研究用Java制作动画的正确方法。那么你建议我用什么呢?你不能用一种方法来制作{draw();wait();draw();wait()…}。它就是不能那样工作。您需要研究用Java制作动画的正确方法。另一方面,您不需要使用
(long)
来播放
1500
。只需使用
L
而不是像这样
1500L
。L表示它是一个长文字。在完全不同的旁注上,您不需要使用
(Long)
强制转换
1500
。只需使用
L
而不是像这样
1500L
。L表示它是一个长文本。