![](/img/trans.png)
[英]Disable some context menu Items if multiple rows selected in TableView JavaFx
[英]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.