Java 处理代码不为';t工作(线程、draw()、noLoop()和loop())
下面的代码应该使一个形状闪烁两次,我从root三次检查了这些方法,我99%确定这些方法是正确的(如果需要,我会发布代码)。让根目录的当前状态在屏幕上暂停几秒钟的最佳方法是什么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)
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表示它是一个长文本。