我想在Processing中使用g4p-controls库来创建一个按钮,该按钮在另一个窗口中执行绘图命令。在这个库中,由码在处理中调用外部绘图命令
GWindow window = GWindow.getWindow(this, "Main", 100, 50, 500, 500, JAVA2D);
其中this
是主要的小应用程序,和其他参数指定的名称,位置和渲染创建一个子窗口。 GWindow是PApplet的一个子类,所以我应该可以从我的代码中的任何地方调用绘图命令,例如window.background(0);
,以将该窗口绘制成黑色。但是,这不起作用,我不知道为什么。毕竟,同样的代码工作时,我把它放在一个处理函数,并把它添加到窗口:
window.addDrawHandler(this, "windowDraw");
其中windowDraw
方法是
public void windowDraw(PApplet app, GWinData data) {
app.background(0);
}
展望源代码,平局处理方法windowDraw
由GWindow对象调用,第一个参数为this
,这正是我尝试使用window.background(0);
时提及的对象。所以window
应该是其调用background()
方法来将画布涂成黑色的对象。
如果我误解了事件驱动编程的基础知识,请告诉我。看起来好像处理程序将相关小程序作为参数出于某种原因,但我真的无法看到处理函数内部和外部的调用有什么不同。
一些额外的注意事项:调用window.background(0);
如果它在主要draw()
函数内,则适用。如果它在setup()
功能不起作用了,可惜对我来说,它没有,如果它在一个按钮处理程序方法的工作:
public void handleButtonEvents(GButton button, GEvent event) {
if (this.button == button) {
if (event == GEvent.PRESSED) {
window.background(0);
}
}
}
很显然,我已经确定,当我按下这个代码实际运行按钮。
更奇怪的是,如果我用window.strokeWeight(10)
之类的东西替换上述图形调用window
,实际发生更改,并且该画布中的后续行会绘制得更厚。它只是没有真正画出东西。我只是处于亏损状态。
是的,在绘图函数中使用条件是我现在使用的解决方法。但是我也想在外部触发器上执行数千次绘图命令的计算量很大的序列,并且这种解决方案不太有助于确保它只发生一次。 – ShnitzelKiller
@ShnitzelKiller你也可以使用'PGraphics'缓冲区。或者'noLoop()'函数可能派上用场。 –
@ShnitzelKiller请参阅我刚添加到我的答案的更新。 –