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

时间:2015-02-27 17:01:05

标签: java javafx fxml

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

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

1 个答案:

答案 0 :(得分:1)

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

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

}