Dynamic TableView通过上下文菜单删除列
这是我第一次在这里问,如果我做错了什么对不起(也不是用我的母语) 最近,我从Swing&AWT转到了JavaFX 我发现了与Swing版本完全不同的新表。我想说的更好,它需要更少的操作和做更多的事情,但是。。。主啊,这更难理解 我目前正在尝试动态修改TableView。虽然addColumn方法不是一个大挑战,但我的deleteColumn方法需要帮助:/ 让我们谈谈我的问题: 我有一个场景,上面有许多组件(窗格、按钮、菜单等等),一个窗格(实际上是一个主播)承载一个表视图 我希望在执行此操作时动态删除整个列: 用户在TableView上单击鼠标右键>出现上下文菜单>选择“删除”项 因此,基本上是一个上下文菜单,它提供了删除用户右键单击的列的选项 我试过这个: ->当用户右键单击TableView时,调用此方法:Dynamic TableView通过上下文菜单删除列,dynamic,javafx,tableview,Dynamic,Javafx,Tableview,这是我第一次在这里问,如果我做错了什么对不起(也不是用我的母语) 最近,我从Swing&AWT转到了JavaFX 我发现了与Swing版本完全不同的新表。我想说的更好,它需要更少的操作和做更多的事情,但是。。。主啊,这更难理解 我目前正在尝试动态修改TableView。虽然addColumn方法不是一个大挑战,但我的deleteColumn方法需要帮助:/ 让我们谈谈我的问题: 我有一个场景,上面有许多组件(窗格、按钮、菜单等等),一个窗格(实际上是一个主播)承载一个表视图 我希望在执行此操作时
public void setTargetForContext(ContextMenuEvent event){
if(event.getTarget() instanceof Label){
ObservableList list =(((Label)event.getTarget()).getChildrenUnmodifiable());
activeColumn = ((Text)((ObservableList)list)).getText();
}...
目标是在“activeColumn”中设置列名
然后,当用户从上下文菜单中选择“删除”选项时,将调用另一个方法来比较列的名称并删除正确的列
但似乎我不能调用标签上的getChildren()方法,只能调用不可修改的方法。它不允许强制转换并抛出异常
您有允许我获取列名的解决方案吗
或者我走错了方向,我必须找到另一种方法来删除右键单击的列,但在这种情况下,我也需要您的帮助
非常感谢您的阅读,并提前感谢您的帮助。首先,请允许我指出,如果您致电
table.setTableMenuButtonVisible(true);
然后,该表将有一个内置菜单按钮,该按钮带有单选按钮,允许用户选择显示哪些列。也许这就是你所需要的
在Swing中,表格单元格的渲染器只是绘制在表格上的“橡皮图章”。因此,您不能向它们注册UI事件的侦听器
相比之下,在JavaFX中,表中的单元格是具有完整功能的真实UI控件。这意味着不需要从表中获取单元格坐标的API。您不应使用表视图
注册侦听器,而应使用您要操作的实际单元格。可以从表列的单元工厂访问单元
// the table:
TableView<RowDataType> table = new TableView<>();
//...
// A table column:
TableColumn<RowDataType, CellDataType> column = new TableColum<>("Header text");
// A context menu for the table column cells:
ContextMenu contextMenu = new ContextMenu();
MenuItem deleteColumnItem = new MenuItem("Remove Column");
deleteColumnItem.setOnAction(e -> table.getColumns().remove(column));
contextMenu.getItems().add(deleteColumnItem);
// Cell factory for the column
column.setCellFactory(col -> {
// basically a cell with default behavior:
TableCell<RowDataType, CellDataType> cell = new TableCell<RowDataType, CellDataType>() {
@Override
public void updateItem(CellDataType item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setText(null);
} else {
setText(item.toString());
}
}
});
// add the context menu to the cell:
cell.setContextMenu(contextMenu);
return cell ;
});
噢非常感谢,我将不得不更加努力地了解FX的所有新功能。不管怎么说,这解决了我的问题,并导致了正确的道路!谢谢
column.setContextMenu(contextMenu);