2013-01-07 3 views
0

나는 StackPaneGroup을 가지고 있습니다. 그룹은 실제 시각적 인 내용을 가지며 사용자가 팬하고 확대/축소 할 수 있습니다. 그룹에는 좌표 변환이 있습니다.부모로부터 자식으로 마우스 이벤트와 스크롤 이벤트 전달하기 (JavaFX)

그룹 외부에서 발생하더라도 마우스 및 스크롤 이벤트가 동일하게 동작하도록하고 싶습니다 (축소되었거나 그룹 그래픽으로 인해 발생했기 때문에).

좌표계가 다르기 때문에 StackPane에서 이벤트를 직접 전달 (마우스) 할 수 없습니다.

그룹 뒤에 거대한 투명 사각형을 배치하려고했지만 그래픽 시스템 텍스처 크기 오버 플로우 (= 좋지 않음)가 발생합니다.

이제 StackPane과 그룹 모두에서 핸들러를 사용하여 그룹 내에서 좌표를 보정 한 별도의 메소드를 전달할 생각입니다. 작동하지만, 실현하지 못한 더 깔끔한 메커니즘이 존재합니까?

+0

[group.setMouseTransparent (true)] (http://docs.oracle.com/javafx/2/api/javafx/scene/Node.html#setMouseTransparent (boolean)) 도움이 되셨습니까? – jewelsea

+0

유리판 용액이 효과가없는 이유를 모르겠습니다. 우리는 응용 프로그램에서 유리판을 사용하고 있으며 잘 작동합니다. 우리는 뒤에있는 그룹 앞에 놓고 모든 좌표를 수동으로 변환하여 관련 부분으로 전달합니다. – Sebastian

+0

나는 "유리판"을 모른다. 이것은 JavaFX 2.x입니다. - 더 자세한 정보를 공유 할 수 있습니까? (아래의 해결 방법도 참조하십시오). 감사. – akauppi

답변

0

나는이 문제를 해결하는 방법 :

나는 그것의 부모에 대한 처리기를 설정 한 Group 생성자에서

:

runLater { 
    val pv= parent.value 
    assert(pv != null) 

    ..some local var's here.. 

    pv.onMousePressed = (ev: MouseEvent) => if (ev.primaryButtonDown) { 
    ... 

그룹이 부모에 부착 될 필요하지 않습니다 runLater 걸리는 처리 (또는 잠재적 인 부모의 핸들을 생성자 매개 변수로 제공). runLater-block이 실행되면 부모가됩니다.

이 방법은 다소 깔끔한 방법입니다. 모든 이벤트 처리를 그룹 내에서 처리 할 수 ​​있지만 부모의 더 큰 부동산을 여전히 사용합니다. 두 곳의 코드가 필요 없습니다. 좌표 변환은 호출 된 부모 이벤트이므로 (그룹이 아닌) 항상 동일합니다.

저는 스칼라를 사용하고 있습니다. 그러나 동일한 접근법이 모든 JVM 언어에서 작동해야합니다.

참고 : if으로 처리기를 시작하면 현재 ScalaFX에서 컴파일되지 않습니다. ScalaFX의 작은 결함이며 쉽게 해결할 수 있습니다 (세부 정보를 요청하십시오).

0

JavaFx 8에서 동일한 문제가 발생했으며이를 그룹으로 대체하여 문제를 해결했습니다. 변화가 없으며 매력처럼 작동합니다. 알아두면 유용 할 수 있습니다.

관련 문제