繁体   English   中英

上下文菜单仅显示了一些TableView行javafx fxml

[英]Context menu only showing for a few TableView rows 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;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM