2016-12-13 19 views
0

У меня есть сетка 40x40 с отображением карты. В настоящее время у меня есть следующие методы прослушивания для правой кнопки мыши:Javafx - Определить положение курсора по правому клику относительно gridpane

//detect right click + display menu, select if you want to place item 1 or item 2 
    final ContextMenu cm = new ContextMenu(); 
    cm.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() 
    { 
     @Override 
     public void handle(MouseEvent event) 
     { 
      if (event.getButton() == MouseButton.SECONDARY) 
       event.consume(); 

     } 
    }); 
    cm.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      System.out.println("Following item selected: "+ 
        ((MenuItem)event.getTarget()).getText()); 
     } 
    }); 
    //two placeable items 
    MenuItem item1Place = new MenuItem("Item 1"); 
    MenuItem item2Place = new MenuItem("Item 2"); 
    cm.getItems().addAll(item1Place, item2Place); 

    primaryStage.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() 
    { 
     @Override 
     public void handle(MouseEvent e) 
     { 
      if (e.getButton() == MouseButton.SECONDARY) 
      { 
       cm.show(primaryStage, e.getScreenX(), e.getScreenY()); 
      } 
     } 
    }); 

То, что я хотел бы реализовать это следующим образом:

Если пункт меню выбран после того, как правая кнопки мыши, я» d хотел бы сохранить положение правого щелчка в переменной
например [32,12], если правой кнопкой мыши был 32 блока сетки поперек и 12 блоков вверх.


Любые предложения о том, как это сделать?
Заранее спасибо

// first edit code entered below. I realise the indentation is very off however fixing it seemed to turn it back to plain text 
placeItem1.setOnAction(evt -> System.out.println("Item 1 placed ["+col+", "+row+"]")); 
       placeItem2.setOnAction(evt -> System.out.println(Item 2 placed["+col+", "+row+"]")); 
       menu.show(cell, e.getScreenX(), e.getScreenY()); 
      }); 
      root.add(cell, x, y); 

ответ

1

Добавить слушателя в каждую ячейку в сетке, вместо того, чтобы добавлять один мыши слушателя на сцену. Надлежащий слушатель использовать для обработки контекстного меню является contextMenuRequested обработчиком:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.input.MouseButton; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class ClicksInGridPane extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     GridPane root = new GridPane(); 

     final int NUM_ROWS = 40 ; 
     final int NUM_COLS = 40 ; 

     ContextMenu menu = new ContextMenu(); 
     MenuItem menuItem1 = new MenuItem("Item 1"); 
     MenuItem menuItem2 = new MenuItem("Item 2"); 
     menu.getItems().addAll(menuItem1, menuItem2); 

     for (int x = 0 ; x < NUM_COLS ; x++) { 
      for (int y = 0 ; y < NUM_ROWS ; y++) { 
       Pane cell = new Pane(); 
       cell.setPrefSize(20, 20); 
       // add style just to draw grid: 
       cell.setStyle("-fx-background-color: black, white; -fx-background-insets: 0, 0 0 1 1;"); 

       // context menu listener: 
       final int col = x ; 
       final int row = y ; 

       cell.setOnContextMenuRequested(e -> { 
        menuItem1.setOnAction(evt -> System.out.println("Item 1 selected in cell ["+col+", "+row+"]")); 
        menuItem2.setOnAction(evt -> System.out.println("Item 2 selected in cell ["+col+", "+row+"]")); 
        menu.show(cell, e.getScreenX(), e.getScreenY()); 
       }); 

       root.add(cell, x, y); 
      } 
     } 

     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

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

Спасибо, я сделал некоторый прогресс, однако есть одна проблемы. У меня есть gridpane (созданный с помощью сценариста) и цикл for, чтобы сгенерировать его уже. Проблема в том, что код, который я добавил выше, как редактирование (в моем основном вопросе), полученные координаты неверны (всегда 39,39). Основной (этап называется primaryStage, а gridPane - root). Какие-нибудь предложения относительно того, как я буду решать это? – asdf

+0

@ JK96 нет никакого способа рассказать, что вы сделали неправильно из фрагмента кода, который вы опубликовали. Мой пример работает на вас? Если да, то чем вы занимаетесь по-другому? Как и где вы определяете 'col' и' row' в вашем коде? –

+0

следующие работы для меня: появляется меню. обнаружен щелчок правой кнопкой мыши, выбор элемента обнаружен. col и row определены в цикле точно так же, как и тот, который вы опубликовали, однако значения, полученные для позиции, кажутся неправильными, и постоянно [39,39] – asdf