2017-09-09 3 views
2

처리 중에 g4p 컨트롤 라이브러리를 사용하여 다른 창에서 드로잉 명령을 실행하는 버튼을 만들려고합니다. 이 라이브러리에서 자식 창은 코드 this 메인 애플릿을, 그리고 다른 인수는 이름, 위치, 렌더러를 지정처리 중에 외부에서 드로잉 명령 호출

GWindow window = GWindow.getWindow(this, "Main", 100, 50, 500, 500, JAVA2D); 

에 의해 생성된다. GWindow는 PApplet의 하위 클래스이므로 그림 코드 과 같이 드로잉 명령을 호출하여 코드를 호출하여 해당 창을 검정색으로 표시 할 수 있어야합니다. 그러나이 방법은 효과가 없으며 그 이유를 알 수 없습니다.

window.addDrawHandler(this, "windowDraw"); 

windowDraw 방법은

public void windowDraw(PApplet app, GWinData data) { 
    app.background(0); 
} 

인 소스 코드, 그리기 핸들러로 상대 : 나는 핸들러 함수에 넣고 창에 추가 할 때 모든 후, 동일한 코드가 작동 메서드 windowDrawthis이라는 GWindow 개체에 의해 호출됩니다.이 개체는 window.background(0);을 시도했을 때 참조 된 개체입니다. 따라서 window은 캔버스를 검은 색으로 칠하기 위해 background() 메서드가 호출 된 객체 여야합니다.

이벤트 기반 프로그래밍에 대한 근본적인 오해가있는 경우 알려 주시기 바랍니다. 처리기가 관련 애플릿을 이유에 대한 인수로 사용하는 것처럼 보이지만 핸들러 함수 내부 및 외부에서 호출이 다른 것을 실제로 볼 수 없습니다.

몇 가지 추가 참고 사항 :이 draw() 주 기능 내부에있는 경우 작동합니다. 그것은 setup() 함수의 경우 작동하지 않으며,이 단추 처리기 방법에 있다면 불행하게도 나를 위해, 그것은 작동하지 않습니다 분명히

public void handleButtonEvents(GButton button, GEvent event) { 
    if (this.button == button) { 
    if (event == GEvent.PRESSED) { 
     window.background(0); 
    } 
    } 
} 

, 나는 확실히 만든 나는를 누를 때이 코드가 실제로 실행 단추.

더욱 이상하게도 window에 대한 위의 그림 호출을 window.strokeWeight(10)과 같은 것으로 바꾸면 실제로 변경이 수행되고 해당 캔버스의 후속 줄이 두꺼워집니다. 그것은 실제로 물건을 그리는 데 실패합니다. 나는 단지 손실에 처해있다.

답변

1

향후 연결이 끊긴 코드 스 니펫 대신 MCVE을 게시하십시오. 이 코드는 두 번째 창에서 원을 그리는 기대, 나는 첫 번째 창에서 마우스를 누르면 두 번째 창에 녹색 그릴

import g4p_controls.*; 

GWindow window; 

void setup(){ 
    window = GWindow.getWindow(this, "Main", 100, 50, 500, 500, JAVA2D); 
} 

void draw(){ 
    background(255, 0, 0); 
    window.ellipse(mouseX, mouseY, 25, 25); 
    window.draw(); 
} 

void mousePressed(){ 
    window.background(0, 255, 0); 
} 

예를 들면 다음과 같습니다이다. 그러나, 그것은 매우 드문 경우에만 그 것들을 그리는 것 같습니다.

사실, 여기에 프로그램의 동일한 유형은 G4p의 라이브러리를 사용하지 않고 "순수 처리"에있다 :

SecondApplet sa; 

void setup() { 
    String[] args = {"TwoFrameTest"}; 
    sa = new SecondApplet(); 
    PApplet.runSketch(args, sa); 
} 

void settings() { 
    size(200, 200); 
} 

void draw() { 
    background(0); 
    sa.ellipse(mouseX, mouseY, 25, 25); 
} 

void mousePressed() { 
    sa.background(255, 0, 0); 
} 

public class SecondApplet extends PApplet { 

    public void settings() { 
    size(200, 200); 
    } 

    void draw() { 
    } 
} 

가 나는 또한이 작업을 기대,하지만 우리는 초 비슷한 회색 창이 표시 스케치. here 버그를 처리하여 처리 개발자가 예상 한 동작인지 여부를 확인했습니다.당신이 뭔가를 할 경우 그 동안

, 당신은 더 좋은 행운을해야합니다 :

SecondApplet sa; 

float drawMouseX; 
float drawMouseY; 
color drawBackground = #0000ff; 

void setup() { 
    String[] args = {"TwoFrameTest"}; 
    sa = new SecondApplet(); 
    PApplet.runSketch(args, sa); 
} 

void settings() { 
    size(200, 200); 
} 

void draw() { 
    background(0); 
    drawMouseX = mouseX; 
    drawMouseY = mouseY; 
} 

void mousePressed() { 
    drawBackground = #00ff00; 
} 

public class SecondApplet extends PApplet { 

    public void settings() { 
    size(200, 200); 
    } 

    void draw() { 
    background(drawBackground); 
    ellipse(drawMouseX, drawMouseY, 25, 25); 
    } 
} 

대신 직접 그리기 함수를 호출, 우리는 이제 다음 두 번째에 사용되는 몇 가지 변수를 설정하는 애플릿의 draw() 기능. 이 작업을 수행하는 방법은 여러 가지가 있지만 아이디어는 같습니다. 그리기 기능을 직접 호출하지 말고 draw() 함수에서 호출하십시오.

업데이트 : 내가 GitHub의 출원 the bug에 (A 처리의 설립자)와 codeanticode (가공의 개발자) 다시 벤 프라이에서 듣고, 나는 이제 더이 작동하지 않는 이유를 이해합니다.

이유는 각 스케치가 이벤트 그리기 및 처리를 담당하는 자체 UI 스레드를 가지고 있기 때문입니다. 다른 스레드에서 스케치를 그릴 수 없습니다. 그렇지 않으면 이상한 일이 일어납니다. 하지만 첫 번째 스케치 이벤트 스레드의 두 번째 스케치 (이 아니라이 아닌 두 번째 스케치의 드로잉 스레드)를 그리려는 경우 작동하지 않습니다.

대체 접근법에 대한 논의는 버그를 참조하십시오. 솔직히 최선의 방법은 스케치간에 변수를 공유하는 방법으로 설명하는 것이 가장 좋습니다.

+0

예, 그리기 기능에서 조건부를 사용하는 것은 지금 사용하고있는 문제 해결 방법입니다. 그러나 외부 트리거에서 수천 개의 그리기 명령을 계산하기 위해 비싼 시퀀스를 수행하기를 원합니다.이 솔루션은 한 번만 발생하는 것을 보장하는 데별로 도움이되지 않습니다. – ShnitzelKiller

+0

@ShnitzelKiller'PGraphics' 버퍼를 사용할 수도 있습니다. 아니면'noLoop()'함수가 도움이 될 수 있습니다. –

+0

@ ShnitzelKiller 방금 내 대답에 추가 한 업데이트를 참조하십시오. –