2016-12-13 23 views
0

我有一個40x40的窗格,顯示一張地圖。目前,我有以下幾種方法監聽右鍵點擊:Javafx - 確定光標相對於柵格的右擊位置

//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(由scenebuilder製作)和一個for循環來生成它。問題是,用上面添加的代碼作爲編輯(在我的主要問題中),得到的座標是錯誤的(總是39,39)。主要(階段被稱爲primaryStage,並且gridPane被命名爲root)。任何關於如何解決這個問題的建議? – asdf

+0

@ JK96有沒有可能的方式來告訴你從你發佈的代碼片段中做了什麼錯誤。我的榜樣是否適合你?如果是這樣,你有什麼不同?你如何以及在哪裏定義代碼中的'col'和'row'? –

+0

以下適用於我:菜單彈出。檢測到右擊,檢測到項目的選擇。 col和row是在一個循環內定義的,與你發佈的循環完全一樣,但是爲位置獲得的值似乎是錯誤的,並且不斷[39,39] – asdf