JavaFx电子表格单元格右键单击打开对话框

JavaFx电子表格单元格右键单击打开对话框,java,javafx,event-handling,controlsfx,Java,Javafx,Event Handling,Controlsfx,我不熟悉ControlsFXAPI的电子表格功能。我想在Javafx中的SpreadsheetView的Spreadsheetcell上单击鼠标右键打开对话框。非常感谢您的帮助。这是一段代码,您可以在该代码中关闭标准上下文菜单,并使用对话框实现自己的处理程序,在本例中为文本输入对话框: SpreadsheetView spreadsheetView = new SpreadsheetView(); //off the standard ContextMenu spreadsh

我不熟悉ControlsFXAPI的电子表格功能。我想在Javafx中的
SpreadsheetView
Spreadsheetcell
上单击鼠标右键打开
对话框。非常感谢您的帮助。

这是一段代码,您可以在该代码中关闭标准上下文菜单,并使用
对话框
实现自己的处理程序,在本例中为
文本输入对话框

  SpreadsheetView spreadsheetView = new SpreadsheetView();
    //off the standard ContextMenu
    spreadsheetView.setContextMenu(null);
   //set own handler for right click with Dialog
    spreadsheetView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
      @Override public void handle(ContextMenuEvent event) {
        CellView cellView = (CellView) event.getTarget();
        TextInputDialog dialog = new TextInputDialog(cellView.getText());
        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()){
          System.out.println(cellView.getText());
        }
      }
    });
SpreadsheetView SpreadsheetView=新建SpreadsheetView();
//关闭标准上下文菜单
spreadsheetView.setContextMenu(空);
//为右键单击对话框设置自己的处理程序
电子表格视图.setOnContextMenuRequested(新事件处理程序(){
@重写公共无效句柄(ContextMenuEvent事件){
CellView CellView=(CellView)事件。getTarget();
TextInputDialog=新建TextInputDialog(cellView.getText());
可选结果=dialog.showAndWait();
if(result.isPresent()){
System.out.println(cellView.getText());
}
}
});
我不知道这个图书馆有多好,但它很好用。 其工作原理示例:

我的节目:

public class MainController extends Application {

  public static void main(String[] args) {
    launch(args);
  }

  @Override public void start(Stage primaryStage) throws Exception {


    SpreadsheetView spreadsheetView = new SpreadsheetView();
    //off the standard ContextMenu
    spreadsheetView.setContextMenu(null);
    //set own handler for right click with Dialog
    spreadsheetView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
      @Override public void handle(ContextMenuEvent event) {
        CellView cellView = (CellView) event.getTarget();
        TextInputDialog dialog = new TextInputDialog(cellView.getText());
        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()) {
          System.out.println(cellView.getText());
        }
      }
    });

    HBox hBox = new HBox();
    hBox.getChildren().add(spreadsheetView);
    Scene scene = new Scene(hBox);
    primaryStage.setScene(scene);
    primaryStage.show();
  }
}
public类MainController扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@覆盖公共无效开始(阶段primaryStage)引发异常{
电子表格视图电子表格视图=新电子表格视图();
//关闭标准上下文菜单
spreadsheetView.setContextMenu(空);
//为右键单击对话框设置自己的处理程序
电子表格视图.setOnContextMenuRequested(新事件处理程序(){
@重写公共无效句柄(ContextMenuEvent事件){
CellView CellView=(CellView)事件。getTarget();
TextInputDialog=新建TextInputDialog(cellView.getText());
可选结果=dialog.showAndWait();
if(result.isPresent()){
System.out.println(cellView.getText());
}
}
});
HBox HBox=新的HBox();
hBox.getChildren().add(电子表格视图);
场景=新场景(hBox);
初级阶段。场景(场景);
primaryStage.show();
}
}

它在表视图上使用鼠标处理程序,检查鼠标何时被单击,单击鼠标时在fx中触发新对话框,然后接受输入并更新fx表视图

table.setOnMousePressed(new          EventHandler<MouseEvent>() {
     @Override 
    public void handle(MouseEvent event) {
        if (event.getClickCount() == 1) {
            Call dialogue method of java fx           
        }
    }
});
table.setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.getClickCount()==1){
javafx的调用对话方法
}
}
});
或者,如果需要右键单击,可以创建单元格

乙二醇

FirstNameCol.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn列){
最终TableCell单元格=新TableCell();
cell.textProperty().bind(cell.itemProperty());//通常可能需要在此处为TableCell子类化并重写updateItem(…)
cell.setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.getButton==MouseButton.SECONDARY){
//句柄右键单击单元格。。。
//使用cell.getItem()访问单元格数据;
//使用(Person)cell.getTableRow().getItem()访问行数据;
}
}
});
返回单元;
}
});

您好,您想在右键单击后直接显示对话框吗?@BadVegan,是的,我想在右键单击单元格后直接显示对话框。谢谢您的努力,但不知为什么它对我不起作用,请您粘贴您的整个程序。我添加了我的程序。它现在对我起作用了。当时我的项目没有正确构建。很抱歉
FirstNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
    @Override
    public TableCell<Person, String> call(TableColumn<Person, String> col) {
        final TableCell<Person, String> cell = new TableCell<>();
        cell.textProperty().bind(cell.itemProperty()); // in general might need to subclass TableCell and override updateItem(...) here
        cell.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if (event.getButton == MouseButton.SECONDARY) {
                    // handle right click on cell...
                    // access cell data with cell.getItem();
                    // access row data with (Person)cell.getTableRow().getItem();
                }
            }
        });
        return cell ;
    }
});