java - 上下文菜单仅显示几个 TableView 行 javafx fxml

标签 java javafx fxml

我有一个 TableView,其中我需要每一行都有一个上下文菜单。在此上下文菜单中应该有一个编辑选项和一个删除选项。我写了这个类:

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 中这样使用它:

<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 个条目,其中将显示上下文菜单。

最佳答案

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

最简单的修复方法就是创建一个 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;
    }

}

关于java - 上下文菜单仅显示几个 TableView 行 javafx fxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28770391/

相关文章:

JavaFX:使用来自不同类的数据填充 TableView

java - 按两次 ToggleButton 时无法在自定义线程中执行 while 循环(仅适用于第一次)

java - 如何在Android 6.0中写入SD卡而不询问运行时权限?

java - 使用 RxJava2 将 CSV 文件转换为 JSON

user-interface - 从 Controller 内关闭阶段

java - JavaFX 上带参数的构造函数?

java - 对象数组索引值被前面的索引值覆盖

java - 尝试使 JTable 中的链接可单击时出现未处理的异常类型 URISyntaxException

java - 在 JavaFX/fxml 中打开新窗口,但我不希望它打开新场景

java - 项目在 intellij 中编译,但导出时不编译