2013-05-19 2 views
2

나는 java (fx)의 초보자입니다.
JavaFX에서 x 및 y로 마우스 위치를 얻는 방법은 무엇입니까? 내가 AWT의 MouseInfo (또한 가져온)을 사용하여 시도했지만 작동하지 않습니다. Ensemble에서 코드를 보았습니다. ("고급 스테이지"에서 볼 윈도우를 드래그하여, 내가해야 할 일은, 꾸며지지 않은 JavaFX 스테이지를 드래그합니다.)하지만 작동하지 않습니다. 나는 컨트롤러와 함께 FXML을 사용하고 있으며 이것이 주요 문제라고 생각한다. 단일 파일의 간단한 JavaFX로 다시 전환해야합니까? 나는 FXML이 UI를 배치하는 것이 더 낫다는 것을 알고 있지만, 많은 코드를 사용할 수는 없다. 아니면 컨트롤러에 다른 종류의 코드가 필요합니까? 가능한 모든 의견을 적어주십시오.
검사 할 때 약간의 코드가 필요하면 언제든지 물어보십시오.JavaFX에서 마우스의 위치를 ​​얻는 방법은 무엇입니까?

답변

2

그 목적으로 로봇을 사용하는 것은 어떻습니까?

http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/Robot.html

로봇을 사용하면, AWT 이벤트 큐에 이벤트를 게시 다르다. 이벤트는 기본 이벤트 대기열에서 생성됩니다. 실제로 Robot.mouseMove으로 마우스 위치를 설정할뿐만 아니라 위치를 알 수 있습니다.

마우스 위치를 얻기 위해

, 당신은 그것은 작동하지 않습니다 MouseInfo

import java.awt.MouseInfo; 
// get the mouse's position 
Point p = MouseInfo.getPointerInfo().getLocation(); 

에 충실 할 수 있습니다 : 당신은 Mac에서입니까? 어떤 JavaFX 버전입니까? FX8에서 수정 된 문제 인 것 같습니다. 오직 맥의 경우,

com.sun.glass.ui.Robot robot = 
     com.sun.glass.ui.Application.GetApplication().createRobot(); 

// getPosition of the mouse in Mac 
int x = robot.getMouseX(); 
int y = robot.getMouseY(); 
+0

나는 윈도우 8 64 오전, 자바 FX 2 (JDK의 v7u21). 나는 어제 jdk 8을 다운로드하고 있었다. 그러나 나의 어리석은 그물은 그 다음 죽었다. –

+0

Windows에서이 로봇을 사용할 수 있습니까? (테스트 자동화 전용입니까, 아니면 현실 세계에서 사용할 수 있습니까?) MouseInfo와 Point가 작동하지만 x와 y를 함께 제공합니다 (java.awt.Point [x = 449, y = 323]). 그렇게하는 방법? –

+0

예. awt.point : 두 개의 필드 x와 y를 가지고 있습니다 – octoback

19

귀하의 질문에 몇 가지 항목이 있습니다 사용할 수 있습니다 - 나는 한 번에 하나씩 해결할 수 있습니다.

JavaFX에서 x 및 y로 마우스 위치를 얻는 방법은 무엇입니까?

는 당신이 마우스의 위치를 ​​추적 할 적절한 자바 FX 구성 요소에 마우스 이벤트 핸들러를 추가합니다. 자바 FX 마우스 이벤트는 좌표의 여러 종류를보고합니다. x 및 y 좌표는 위치가 모니터되는 노드의 왼쪽 위 모서리를 기준으로합니다. sceneX 및 sceneY 좌표는 장면의 왼쪽 상단 0,0 좌표에 상대적입니다. screenX 및 screenY 좌표는 현재 화면의 왼쪽 상단 0,0 좌표를 기준으로합니다.

이 좌표는 MouseEvent 문서에 설명되어 있습니다. NodeScene 설명서에는 좌표 시스템을 이해하는 데 추가 정보가 있습니다.

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.event.*; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.VBox; 
import javafx.stage.*; 

public class MouseLocationReporter extends Application { 
    private static final String OUTSIDE_TEXT = "Outside Label"; 

    public static void main(String[] args) { launch(args); } 

    @Override public void start(final Stage stage) { 
    final Label reporter = new Label(OUTSIDE_TEXT); 
    Label monitored = createMonitoredLabel(reporter); 

    VBox layout = new VBox(10); 
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10px;"); 
    layout.getChildren().setAll(
     monitored, 
     reporter 
    ); 
    layout.setPrefWidth(500); 

    stage.setScene(
     new Scene(layout) 
    ); 

    stage.show(); 
    } 

    private Label createMonitoredLabel(final Label reporter) { 
    final Label monitored = new Label("Mouse Location Monitor"); 

    monitored.setStyle("-fx-background-color: forestgreen; -fx-text-fill: white; -fx-font-size: 20px;"); 

    monitored.setOnMouseMoved(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent event) { 
     String msg = 
      "(x: "  + event.getX()  + ", y: "  + event.getY()  + ") -- " + 
      "(sceneX: " + event.getSceneX() + ", sceneY: " + event.getSceneY() + ") -- " + 
      "(screenX: " + event.getScreenX()+ ", screenY: " + event.getScreenY() + ")"; 

     reporter.setText(msg); 
     } 
    }); 

    monitored.setOnMouseExited(new EventHandler<MouseEvent>() { 
     @Override public void handle(MouseEvent event) { 
     reporter.setText(OUTSIDE_TEXT); 
     } 
    }); 

    return monitored; 
    } 
} 

mouselocationmonitor

나는 (또한 수입) AWT의의 MouseInfo를 사용했지만, 제대로 동작하지 않습니다.

금지하지 마세요. 다양한 그래픽 툴킷 (예 : Swing/AWT 및 JavaFX)을 혼합하면 고급 주제가됩니다. 일반적으로 JavaFX 응용 프로그램을 작성하는 경우 java.awt 네임 스페이스와 javax.swing 네임 스페이스에서 가져 오는 것은 사용하지 마십시오. JavaFX 응용 프로그램과 상호 작용할 필요가있는 대규모의 기존 Swing 기반 응용 프로그램이나 프레임 워크가있는 경우에만 사용해야합니다. 이 경우에는 그런 상황이 발생하지 않습니다.

는 또한 ("고급 단계"에서 볼 창을 드래그하면, 즉 내가 할 내 장식되지 않은 자바 FX 단계를 드래그 필요하다고),하지만 그것도 작동하지 않습니다 앙상블에 대한 코드를 보았다.

나는 Ensemble Advanced Stage 샘플을 시도해 보았고 그 스테이지를 드래그하여 저를 위해 일했습니다.

장식되지 않은 스테이지를 JavaFX에서 드래그하는 또 다른 샘플은 How to draw a clock with JavaFX 2?에 대한 답변이며 associated sample code입니다. 내가 컨트롤러와 FXML을 사용하고

/** makes a stage draggable using a given node */ 
public static void makeDraggable(final Stage stage, final Node byNode) { 
    final Delta dragDelta = new Delta(); 
    byNode.setOnMousePressed(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
     // record a delta distance for the drag and drop operation. 
     dragDelta.x = stage.getX() - mouseEvent.getScreenX(); 
     dragDelta.y = stage.getY() - mouseEvent.getScreenY(); 
     byNode.setCursor(Cursor.MOVE); 
    } 
    }); 
    byNode.setOnMouseReleased(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
     byNode.setCursor(Cursor.HAND); 
    } 
    }); 
    byNode.setOnMouseDragged(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
     stage.setX(mouseEvent.getScreenX() + dragDelta.x); 
     stage.setY(mouseEvent.getScreenY() + dragDelta.y); 
    } 
    }); 
    byNode.setOnMouseEntered(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
     if (!mouseEvent.isPrimaryButtonDown()) { 
     byNode.setCursor(Cursor.HAND); 
     } 
    } 
    }); 
    byNode.setOnMouseExited(new EventHandler<MouseEvent>() { 
    @Override public void handle(MouseEvent mouseEvent) { 
     if (!mouseEvent.isPrimaryButtonDown()) { 
     byNode.setCursor(Cursor.DEFAULT); 
     } 
    } 
    }); 
} 

, 나는 그 주요 문제 같아요 : 시계 샘플에 대한 장식되지 않은 단계 드래그하기 위해 사용하는 방법이다. 단일 파일의 간단한 JavaFX로 다시 전환해야합니까? 나는 FXML이 UI를 배치하는 것이 더 낫다는 것을 알고 있지만, 많은 코드를 사용할 수는 없다.

기본 JavaFX API에 대한 이해가 부족하고 익숙하지 않은 것이 FXML을 사용하는 것이 아닌 주요 문제 일 수 있습니다. 그러나 fxml의 복잡성은 더 가벼운 문서와 함께 웹상의 샘플이 귀하의 고난에 기여할 수 있음을 의미합니다. FXML을 사용하여 일부 JavaFX 기능을 작동시키는 방법을 이해하는 것이 어려워지면 지금은 FXML 사용을 중단하는 것이 좋습니다. Java API를 사용하여 로직을 직접 코딩하고, 어려운 문제가 발생하면 Oracle JavaFX tutorialsEnsemble sample code을 참조하십시오.

JavaFX API에 직접 코딩하는 것이 편한 경우 많은 GUI 요소가 포함 된 더 큰 프로젝트의 경우 FXML을 사용하도록 다시 전환하십시오. FXML 요소와 속성 자체는 표준 JavaFX API를 반영 할 때 거의 완벽하게 구현됩니다. 따라서 핵심 JavaFX API를 이해한다면 FXML에 대한 거의 모든 것을 이해할 수 있습니다.

이 답변에 대한 후속 의견을 게시하지 마십시오.이 답변은 그대로입니다. 새로운 질문이있는 경우 새로운 질문 (질문 당 하나의 질문)을 만드십시오.

+1

당신은 멋진 Sir Jewelsea입니다. (항상 여분의 마일을 보내고 있습니다.) 감사합니다. – Elltz

+0

@jewelsea는 Windows 8과 같은 메뉴를 보여주기 위해이 트릭을 사용할 수 있습니까? (마우스가 구석으로 오면 평균 쇼 메뉴) – UnKnown

+1

@UnKnown 아니오, 할 수 없습니다. 마우스 이벤트는 장면으로 만 전달 될 수 있습니다. 전체 화면 응용 프로그램이있는 경우 응용 프로그램에서이를 수행 할 수 있지만 응용 프로그램이 윈도우로 표시되거나 최소화되어 있고 마우스 기반 메뉴 만 표시하려는 경우 화면의 구석으로 이동하면 할 수 없습니다. 어떻게할지는 모르겠지만, 새로운 질문을 만들 수 있습니다. – jewelsea

1

JavaFx 8 WindowEvent는 불행히도 마우스의 (x, y) 위치를 제공하지 않습니다. 나는이 같은 AWT의 MouseInfo를 사용하여 (그리고 잘 작동)이 해결 :

Tooltip t = new Tooltip(); 
Tooltip.install(yournode, t); 
t.setOnShowing(ev -> {// called just prior to being shown 
       Point mouse = java.awt.MouseInfo.getPointerInfo().getLocation(); 
       Point2D local = yournode.screenToLocal(mouse.x, mouse.y); 

       // my app-specific code to get the chart's yaxis value 
       // then set the text as I want 
       double pitch = yaxis.getValueForDisplay(local.getY()).doubleValue(); 
       double freq = AudioUtil.pitch2frequency(pitch); 
       t.setText(String.format("Pitch %.1f: %.1f Hz %.1f samples", pitch, freq, audio.rate/freq)); 
     }); 
관련 문제