[java] JavaFX 터치 기능 처리

JavaFX는 다양한 플랫폼에서 터치 이벤트를 처리할 수 있는 강력한 기능을 제공합니다. 이 글에서는 JavaFX에서 터치 이벤트를 처리하는 방법을 알아보겠습니다.

1. 터치 이벤트 등록하기

JavaFX에서 터치 이벤트를 처리하기 위해서는 Scene 객체에 이벤트 리스너를 등록해야 합니다. 이를 위해 setOnTouchPressed, setOnTouchReleased, setOnTouchMoved, setOnTouchExited, setOnTouchEntered 등의 메서드를 사용할 수 있습니다.

scene.setOnTouchPressed(touchEvent -> {
    double touchX = touchEvent.getTouchPoint().getX();
    double touchY = touchEvent.getTouchPoint().getY();
    // 터치 이벤트 처리 코드 작성
});

위의 예제에서는 setOnTouchPressed 메서드를 사용하여 터치 이벤트가 발생할 때 호출되는 람다 표현식을 등록하고 있습니다. getTouchPoint 메서드를 사용하여 터치한 좌표를 얻을 수 있습니다.

2. 터치 이벤트 처리하기

터치 이벤트를 처리하기 위해서는 터치 이벤트를 발생시킨 노드의 속성을 변경하거나 애니메이션을 적용하는 등의 작업을 수행할 수 있습니다. 아래는 터치한 위치에 사각형을 그리는 예제 코드입니다.

scene.setOnTouchPressed(touchEvent -> {
    double touchX = touchEvent.getTouchPoint().getX();
    double touchY = touchEvent.getTouchPoint().getY();
    
    Rectangle rectangle = new Rectangle(touchX, touchY, 50, 50);
    rectangle.setFill(Color.BLUE);
    
    // 터치한 위치에 사각형 추가
    root.getChildren().add(rectangle);
});

위의 예제에서는 터치가 발생한 좌표를 사용하여 Rectangle 객체를 생성하여 해당 위치에 추가하고 있습니다.

3. 다양한 터치 이벤트 처리하기

JavaFX에서는 터치 이벤트뿐만 아니라 드래그, 확대/축소 등의 다양한 터치 제스처를 처리할 수도 있습니다. 예를 들어, 아래는 드래그 제스처를 사용하여 사각형을 이동시키는 예제 코드입니다.

Rectangle rectangle = new Rectangle(100, 100, 50, 50);
rectangle.setFill(Color.BLUE);

rectangle.setOnTouchPressed(touchEvent -> {
    // 터치 시작 시 사각형의 초기 위치 저장
    rectangle.setUserData(new Point2D(rectangle.getX(), rectangle.getY()));
});

rectangle.setOnTouchMoved(touchEvent -> {
    double deltaX = touchEvent.getTouchPoint().getX() - touchEvent.getTouchPoint().getSceneX();
    double deltaY = touchEvent.getTouchPoint().getY() - touchEvent.getTouchPoint().getSceneY();

    // 사각형 이동
    rectangle.setX(rectangle.getUserData().getX() + deltaX);
    rectangle.setY(rectangle.getUserData().getY() + deltaY);
});

위의 예제에서는 setOnTouchPressed 메서드를 사용하여 터치 시작 시 사각형의 초기 위치를 저장하고, setOnTouchMoved 메서드를 사용하여 터치 이동 시 사각형을 이동시키고 있습니다. getSceneXgetSceneY 메서드를 사용하여 터치 이동 거리를 계산하고, setXsetY 메서드를 사용하여 사각형의 위치를 변경하고 있습니다.

참고 자료

JavaFX API 문서: https://openjfx.io/javadoc/16/