4

私はTableViewJavaFXで作成しています。Context MenutableViewでマウスを右クリックして表示したい。したがって、以下に示すように、テーブルに EventHandler を追加しています。

    TableView tableView=new TableView();

    EventHandler event = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent me) {
            if (me.getButton() == MouseButton.SECONDARY) {
                tableView.getContextMenu().show(tableView, me.getSceneX(), me.getSceneY());
            }
        }
    };
    tableView.addEventHandler(MouseEvent.MOUSE_CLICKED, event);

しかし、私の問題はContext Menu、テーブルのどの部分を右クリックしても表示されることです。

Context Menuの行をクリックした場合にのみ表示されるようにしたいですTableView

つまり、特定の時点でTableViewの行番号を取得するにはどうすれContext MenuばよいですかTableView?

4

3 に答える 3

0

CellFactoryテーブル全体ではなく、特定のセルにコンテキスト メニューを追加します。

たとえば、 Oracle チュートリアルのテーブルを使用します。

    TableColumn firstNameCol = new TableColumn();
    firstNameCol.setText("First");
    firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
firstNameCol.setCellFactory(new Callback<TableColumn, TableCell>() {
    @Override
    public TableCell call(final TableColumn param) {

        final TableCell cell = new TableCell() {

            @Override
            public void updateItem(Object item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    if (isEditing()) {
                        setText(null);
                    } else {
                        setText(getItem().toString());
                        setGraphic(null);
                    }
                }
            }
        };
        // This way I will have context menu only for specific column
        cell.setContextMenu(ContextMenuBuilder.create().items(MenuItemBuilder.create().text("menu").build()).build());
        return cell;
    }
});
于 2012-12-21T12:25:41.373 に答える
0

古い質問かもしれません。テーブルのマウスイベントのターゲットを取得し、たとえばクラス TableCellSkin をチェックして、コンテキストメニューを次のように表示するなどの解決策があります。

table.addEventHandler(MouseEvent.MOUSE_CLICKED,
                new EventHandler<MouseEvent>() {

                    @Override
                    public void handle(MouseEvent e) {
                        if (e.getButton() == MouseButton.SECONDARY
                                && !isRowEmpty) {
                            EventTarget target = e.getTarget();
                            if (target instanceof TableCellSkin
                                    || ((Node) target).getParent() instanceof TableCellSkin) {
                                    // do your stuff. Context menu will be displayed by default
                            } else {
                                // hide the context menu when click event is outside table row
                                table.getContextMenu().hide();
                            }
                        }
                    }
                });
于 2014-04-16T11:17:14.747 に答える