Как получить содержимое SVGPath из MouseEvent в JavaFX

Я работаю над проектом, который позволяет пользователям щелкнуть штат в США, который затем отображает викторину, в которой спрашивается, что такое штат и столица. Состояния - это 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) мыши при щелчке. Что вы хотите сделать с этими координатами? Если вы хотите определить, в каком состоянии находится путь, вы всегда можете создать перечисление состояний и установить данные пользователя для каждого соответствующего пути.

Slaw 26.03.2019 17:13

Спасибо за совет. Я не очень хорошо разбираюсь в Java и не знаком с перечислениями или с тем, как правильно запрашивать MouseEvent. Я нашел свое собственное решение, но я рассмотрю то, что вы сказали, как более эффективный метод решения проблемы.

devin 27.03.2019 04:06
Создание фильтров для вашего сайта
Создание фильтров для вашего сайта
Фильтры - удобный инструмент в арсенале веб-дизайнера. Они позволяют изменять элементы на странице с помощью всего нескольких строк кода. Эти...
Анимация SVG-узоров без единой строки CSS
Анимация SVG-узоров без единой строки CSS
Недавно я работал над веб-проектом, который позволил мне поэкспериментировать с шаблонами SVG. С SVG очень приятно работать, как только вы получите...
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
0
2
121
1

Ответы 1

Хотя я почти уверен, что это был не самый эффективный способ сделать это, я смог получить необходимые данные, установив MouseEvent внутри EventFilter. Таким образом, я смог просто передать текущую итерацию цикла 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;
                  }

Другие вопросы по теме