簡體   English   中英

通過ENTER鍵在TableView(JavaFX)的選定第2列上顯示ContextMenu

[英]Show ContextMenu via ENTER key on selected row 2nd column in TableView (JavaFX)

直到現在,我只用該代碼按ENTER按鈕后,就使contextMenu出現在TableView的框架中了; contextMenu.show(tableView, Side.RIGHT, 0, 0); 但是這樣,上下文菜單僅在靜態位置彈出。

1.如何獲取所選行第二列的xy位置

我希望contextmenu動態顯示,也就是說,每當用戶在選定的行上按ENTER鍵時,contextmenu就會在第二行選定行中顯示:請查看下面的圖片。 在此處輸入圖片說明

有這樣的東西嗎

contextMenu.show(tableView,x-SelectedRow2ndCol,y-SelectedRow2ndCol);

2. Howto Contextmenu全部顯示在可見區域

例如,如果選定的行是TableView的最后一行,因此其位置在屏幕的最下部,則contextmenu仍將在最后一行的上方彈出其所有項目。

lookupAll可用於從TableView獲取所有TableRow 找到選定的一個,並獲得一個tableColumn與該列匹配的子TableCell 這將為您提供TableCell 使用show(Node anchor, Side side, double dx, double dy)方法顯示ContextMenu 這也可以使菜單保持在屏幕上。

從javadoc:

如果沒有足夠的空間,則將菜單移到另一側,並且不應用偏移。

TableView上的鍵偵聽器的示例:

ContextMenu contextMenu = ...

TableColumn secondColumn = tableView.getColumns().get(1);

tableView.setOnKeyReleased(evt -> {
    if (evt.getCode() == KeyCode.ENTER) {
        Set<Node> rows = tableView.lookupAll(".table-row-cell");
        Optional<Cell> n = rows.stream().map(r -> (Cell) r).filter(Cell::isSelected).findFirst();

        if (n.isPresent()) {
            Optional<Node> node = n.get().getChildrenUnmodifiable().stream()
                    .filter(c -> c instanceof TableCell && ((TableCell) c).getTableColumn() == secondColumn)
                    .findFirst();

            if (node.isPresent()) {
                Node cell = node.get();
                Bounds b = cell.getLayoutBounds();
                contextMenu.show(cell, Side.BOTTOM, b.getWidth() / 2, b.getHeight() / -2);
            }
        }
    }
});

請注意,如果沒有可見的選定表行,則此操作無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM