我有一个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,其中将显示一个上下文菜单。
答案 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;
}
}