我想在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請參閱我剛添加到我的答案的更新。 –