【问题标题】:How to retrieve SVGPath content from MouseEvent in JavaFX如何从 JavaFX 中的 MouseEvent 检索 SVGPath 内容
【发布时间】:2019-03-27 11:03:56
【问题描述】:

我正在开发一个项目,该项目允许用户单击美国的一个州,然后显示一个测验,询问该州和首都是什么。状态是 SVGPaths。我需要鼠标事件处理程序来确定单击了哪个 SVGPath 以确定测验数据。如何获取从处理程序中单击的 SVGPath 的坐标?

        //Mouse event handler for attacking states 
      EventHandler<MouseEvent> clickState = new EventHandler<MouseEvent>() { 
         @Override 
         public void handle(MouseEvent e) { 
            /*
             * Register quiz data here
             * 
             * QuizScreenController.setState(state);
             * QuizScreenController.setCapital(capital)
             */

             //Load quiz screen
            loadQuiz("State Quiz");
         }

      }; 
      //allStates is an SVGPath array that stores the individual state paths
      for(SVGPath currState : allStates) {  
          //Color states
          currState.setFill(Color.GRAY);
          registerHandler(currState, Color.GRAY, Color.BLACK);  
          //Register mouse event
          currState.addEventFilter(MouseEvent.MOUSE_CLICKED, clickState);
      }

【问题讨论】:

  • 您可以访问MouseEvent,其来源将是SVGPath,然后您可以查询,在这种情况下。该事件还允许在单击时访问鼠标的本地、场景和屏幕 (x,y) 坐标。你想用这些坐标做什么?如果你想确定路径是哪个状态,你总是可以创建一个状态枚举并在每个适当的路径上设置user data
  • 感谢您的建议。我对 Java 不是很流利,也不熟悉枚举或如何正确查询 MouseEvent。我找到了自己的解决方案,但我会研究您所说的解决问题的更有效方法。

标签: svg javafx


【解决方案1】:

虽然我很确定这不是最有效的方法,但我可以通过在 EventFilter 中设置 MouseEvent 来提取必要的数据。这样,我就能够简单地将 foreach 循环的当前路径迭代传递到事件中。

for(SVGPath currState : allStates) {  
              //Color states
              currState.setFill(Color.GRAY);
              registerHandler(currState, Color.GRAY, Color.BLACK);

              //Register mouse click
              currState.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
                 @Override 
                 public void handle(MouseEvent e) {
                     //Set quiz data
                    if(currState.getContent().equals(washington)) {
                      QuizScreenController.setState("washington");
                      QuizScreenController.setCapital("seattle");
                      selectedState = currState;
                  } else if(currState.getContent().equals(california)) {
                      QuizScreenController.setState("california");
                      QuizScreenController.setCapital("sacramento");
                    selectedState = currState;
                  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多