ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javafx-确定鼠标右键单击相对于网格窗格的位置

2019-10-10 01:15:56  阅读:245  来源: 互联网

标签:gridpane java javafx tile mouseevent


我有一个40×40的网格,显示地图.当前,我有以下方法监听右键单击:

    //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());
            } 
        }
    });

我要实现以下内容:

If a menu item is selected after a right click, i’d like to save
the position of the right click in a variable
e.g. [32,12] if
right click was 32 blocks of the gridpane across, and 12 blocks up.

关于如何执行此操作的任何建议?
提前致谢

// 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);

解决方法:

向网格中的每个单元格添加一个侦听器,而不是向舞台添加一个鼠标侦听器.用于上下文菜单处理的适当侦听器是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);
    }
}

标签:gridpane,java,javafx,tile,mouseevent
来源: https://codeday.me/bug/20191009/1883073.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有