Context menu only showing for a few TableView rows javafx fxml

☆樱花仙子☆ 提交于 2019-12-23 05:11:30

问题


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;
    }

}

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>

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.


回答1:


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

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;
    }

}


来源:https://stackoverflow.com/questions/28770391/context-menu-only-showing-for-a-few-tableview-rows-javafx-fxml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!