Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一行TableView上的上下文菜单?_Java_Javafx_Contextmenu - Fatal编程技术网

Java 在一行TableView上的上下文菜单?

Java 在一行TableView上的上下文菜单?,java,javafx,contextmenu,Java,Javafx,Contextmenu,我使用JavaFX,我的应用程序有一个表,我可以向表中添加元素,但我想创建一个上下文菜单,当我右键单击该行时,它会显示在该行上 我所拥有的 在Scene Builder中,我有一个在激活关联菜单时运行的方法,但这并不是我想要的。这真的很好,因为我可以随时通过编程从表中获取所选项。如果我保留当前拥有的内容,问题是让上下文菜单在所选元素处弹出 contextMenu是带有菜单项的上下文菜单。 connectedUsers是表视图 contextMenu.show(connectedUsers, Si

我使用JavaFX,我的应用程序有一个表,我可以向表中添加元素,但我想创建一个上下文菜单,当我右键单击该行时,它会显示在该行上

我所拥有的

在Scene Builder中,我有一个在激活关联菜单时运行的方法,但这并不是我想要的。这真的很好,因为我可以随时通过编程从表中获取所选项。如果我保留当前拥有的内容,问题是让上下文菜单在所选元素处弹出

contextMenu是带有菜单项的上下文菜单。 connectedUsers是表视图

contextMenu.show(connectedUsers, Side.BOTTOM, 0, 0);
下面是我能得到的最接近的,但这显示了TableView底部的上下文菜单

contextMenu.show(connectedUsers, Side.BOTTOM, 0, 0);
试试这个

ContextMenu cm = new ContextMenu();
MenuItem mi1 = new MenuItem("Menu 1");
cm.getItems().add(mi1);
MenuItem mi2 = new MenuItem("Menu 2");
cm.getItems().add(mi2);

table.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

    @Override
    public void handle(MouseEvent t) {
        if(t.getButton() == MouseButton.SECONDARY) {
            cm.show(table, t.getScreenX(), t.getScreenY());
        }
    }
});
ContextMenu cm=newcontextmenu();
菜单项mi1=新菜单项(“菜单1”);
cm.getItems().add(mi1);
菜单项mi2=新菜单项(“菜单2”);
cm.getItems().add(mi2);
table.addEventHandler(单击MouseEvent.MOUSE_,新建EventHandler()){
@凌驾
公共无效句柄(MouseEvent t){
if(t.getButton()==MouseButton.SECONDARY){
cm.show(表,t.getScreenX(),t.getScreenY());
}
}
});

我认为最好的解决方案是如中所讨论的那样

table.setRowFactory(
新回调函数(){
@凌驾
公共TableRow调用(TableView TableView){
最终TableRow行=新TableRow();
最终上下文菜单行菜单=新上下文菜单();
MenuItem editItem=新MenuItem(“编辑”);
editItem.setOnAction(…);
MenuItem removeItem=新MenuItem(“删除”);
removietem.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
table.getItems().remove(row.getItem());
}
});
rowMenu.getItems().addAll(editItem,removeItem);
//仅显示非空行的关联菜单:
row.contextMenuroperty().bind(
Bindings.when(row.emptyProperty())
.then((上下文菜单)null)
。否则(行菜单);
返回行;
}
});
JavaFX8(带Lambda):

另见:

有关TableView、TableRows和TableCells上的ContextMenu的详细讨论,请参见上面的链接,这里有一个可行的替代方案:它工作得很好!您能否为其中一个项目添加一个
设置动作的示例?Thanks@Robb1我希望,它将帮助您这不是安装在行,而是在标签因此,如果表为空,则将显示上下文菜单…如果IDE无法识别鼠标按钮,则导入javafx.scene.input.*将找到它。即使表中没有行,该解决方案也将显示上下文菜单。此外,它不会基于行添加上下文菜单,而是基于右键单击添加上下文菜单。因此,如果您也右键单击表格标题,仍然会看到上下文菜单,这似乎不合适。您要导入哪个库来使用
?Intellij不会为您提供任何建议it@Robb1,Item是我自己创建的类。它是表中包含的任何内容。后编辑。请查看,因为这将在在创建行时,您似乎无法轻松地使用自定义菜单来反映每行中的数据。例如,这样的提示:“删除行ID 123”……或者我是否遗漏了一些明显的内容?JavaFX将多次调用此回调,导致仅为上下文菜单对每行进行不必要的渲染,对吗?
MenuItem mi1 = new MenuItem("Menu item 1");
mi1.setOnAction((ActionEvent event) -> {
    System.out.println("Menu item 1");
    Object item = table.getSelectionModel().getSelectedItem();
    System.out.println("Selected item: " + item);
});

ContextMenu menu = new ContextMenu();
menu.getItems().add(mi1);
table.setContextMenu(menu);