上下文菜单仅显示几个TableView行javafx fxml [英] Context menu only showing for a few TableView rows javafx fxml

查看:274
本文介绍了上下文菜单仅显示几个TableView行javafx fxml的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个TableView,我需要每行都有一个上下文菜单。在此上下文菜单中,应该有一个Edit选项和一个Remove选项。我写了这个课:

I have a TableView, in which i need each row to have a context menu. In this context menu there should be an Edit option and a Remove option. I wrote this class:

public class ContextMenuRowFactory<T> implements Callback<TableView<T>, TableRow<T>> {

    private List<MenuItem> menuItems;

    public List<MenuItem> getMenuItems() {
        return menuItems;
    }

    public void setMenuItems(List<MenuItem> menuItems) {
        this.menuItems = menuItems;
    }

    @Override
    public TableRow<T> call(TableView<T> view) {
        final TableRow<T> row = new TableRow<>();
        final ContextMenu menu = new ContextMenu();

        menu.getItems().addAll(menuItems);

        row.setContextMenu(menu);
        row.contextMenuProperty().bind(
            Bindings.when(Bindings.isNotNull(row.itemProperty())).then(menu).otherwise((ContextMenu) null));
        return row;
    }

}

我这样使用它,在fxml中:

And I use it like this, in fxml:

<TableView fx:id="table" layoutX="14.0" layoutY="35.0" prefHeight="660.0" prefWidth="514.0" editable="true">
    <columnResizePolicy>
        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
    </columnResizePolicy>
    <items>
        <FXCollections fx:id="tableData" fx:factory="observableArrayList" />
    </items>
    <columns>
        <TableColumn prefWidth="50" text="Column 1" />
        <TableColumn prefWidth="50" text="Column 2" />
    </columns>
    <rowFactory>
        <ContextMenuRowFactory>
            <menuItems>
                <FXCollections fx:factory="observableArrayList" >
                    <MenuItem text="Edit" />
                    <MenuItem text="Remove" />
                </FXCollections>
            </menuItems>
        </ContextMenuRowFactory>
    </rowFactory>
</TableView>

但是,它似乎只适用于少量行。在表中我有1000个条目,我可以找到6/1000,其中上下文菜单将显示。

However, it only seems to be working for a small number of the rows. In the table i have 1000 entries and i could find 6/1000 where a context menu would show.

推荐答案

A MenuItem 可能只属于一个菜单;您正在尝试在您创建的所有 ContextMenu 中使用相同的 MenuItem 实例。

A MenuItem may only belong to one menu; you are trying to use the same MenuItem instances in all the ContextMenus you create.

最简单的解决方法是创建一个 ContextMenu

The simplest fix is just to create a single ContextMenu:

import java.util.List;

import javafx.beans.binding.Bindings;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.util.Callback;

public class ContextMenuRowFactory<T> implements Callback<TableView<T>, TableRow<T>> {

    private final ContextMenu menu = new ContextMenu();

    public List<MenuItem> getMenuItems() {
        return menu.getItems();
    }

    public void setMenuItems(List<MenuItem> menuItems) {
        menu.getItems().setAll(menuItems);
    }

    @Override
    public TableRow<T> call(TableView<T> view) {
        final TableRow<T> row = new TableRow<>();

        row.contextMenuProperty().bind(
            Bindings.when(Bindings.isNotNull(row.itemProperty())).then(menu).otherwise((ContextMenu) null)
        );
        return row;
    }

}

这篇关于上下文菜单仅显示几个TableView行javafx fxml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆