上下文菜单仅显示几个TableView行javafx fxml [英] Context menu only showing for a few TableView rows 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 ContextMenu
s 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屋!