如何检测JavaFx中的ComboBox(TableCell Combobox)双击?

时间:2019-11-28 15:52:39

标签: java javafx

我正在创建一个包含2列的tableview,该表的每个填充单元格都是一个ComboBox。这就是我的实现方式

    private void loadTable() {
        vBox.getChildren().clear();
        this.tableView = new TableView<>();
        tableView.setEditable(true);

        TableColumn<CustomClass, Products> prodCol = createComboBoxColumn("products", "Product", Products.class,
                productObList);
        prodCol.setMinWidth(300);
        prodCol.setOnEditCommit(e -> {
            if (!e.getTableView().getItems().isEmpty()) {
                System.out.println("e.getNewValue().getId(): " + e.getNewValue().getId());
                Products product = productsModel.getProductsById(e.getNewValue().getId());
                e.getTableView().getItems().get(e.getTablePosition().getRow()).setProducts(product);
            }
            tableView.refresh();
        });
        tableView.getColumns().add(prodCol);

        TableColumn<CustomClass, Brand> brandCol = createComboBoxColumn("brand", "Brand", Brand.class,
                brandObList);
        brandCol.setMinWidth(300);
        brandCol.setOnEditCommit(e -> {
            if (!e.getTableView().getItems().isEmpty()) {
                System.out.println("e.getNewValue().getId(): " + e.getNewValue().getId());
                Brand brand = brandModel.getBrandById(e.getNewValue().getId());
                e.getTableView().getItems().get(e.getTablePosition().getRow()).setBrand(brand);
            }
            tableView.refresh();
        });
        tableView.getColumns().add(brandCol);
//      tableView.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

//          @Override
//          public void handle(MouseEvent event) {
//              if (event.getClickCount() == 2) {
//                  System.out.println("on Click");
//                  if (event.getTarget() instanceof ComboBox) {
//                      System.out.println(((ComboBox) event.getTarget()).getSelectionModel().getSelectedItem());
//                  }
//              }
//          }

//      });

        tableView.getItems().addAll(brandManifestCustomObList);
        vBox.getChildren().addAll(tableView);

    }

和createComboboxColumn方法为

public static <T> TableColumn<CustomClass, T> createComboBoxColumn(String name, String columHeading,
            Class<T> type, ObservableList list) {
        TableColumn<CustomClass, T> column = new TableColumn<>(columHeading);
        column.setCellFactory(ComboBoxTableCell.forTableColumn(list));
        column.setResizable(true);
        column.setMaxWidth(100);
        column.setEditable(true);
        column.setCellValueFactory(new PropertyValueFactory<>(name));
        return column;
    }

我无法实现的是检测到表格单元格组合框中的双击(甚至单击)。选择其他行并返回到该表格单元格并双击后,才可以检测到该单元格上的双击。

一个明显的原因是,一旦我单击一个单元格,它就会变成一个组合框,并且我还没有编写代码来检测它,因为在这种情况下我不知道如何操作。 另外,如果可能,我需要在表格视图中检测单元格的列索引。 以下问题无法回答我的要求:

1)JavaFx: ComboBox Table Cell double click

2)Detect mouse click on SELECTION Editable ComboBox JavaFX

3)Select JavaFX Editable Combobox text on click

1 个答案:

答案 0 :(得分:1)

可能您可以使用

tableView.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {
                if (event.getClickCount() == 2) {
                    System.out.println("on Click");

                    if (event.getTarget() instanceof ComboBox) {
                        System.out.println(((ComboBox) event.getTarget()).getSelectionModel().getSelectedItem());
                    }
                    if (event.getTarget() instanceof ComboBoxTableCell<?,?>) {
                        System.out.println(((ComboBoxTableCell) event.getTarget()).getItem().toString());
                    }
                }
            }



        });

因为表格单元格现在已更改为ComboBoxTableCell。 为了获得tableView的列,我从James_D给出的here中得到了一些想法。 您可以使用

TablePosition pos = tableView.getSelectionModel().getSelectedCells().get(0);
        int row = pos.getRow();
        BrandManifestCustom bmc = tableView.getItems().get(row);
        TableColumn col = pos.getTableColumn();
        if (col.getCellObservableValue(bmc).getValue() instanceof Products) {
            System.out.println("hey Products");
        }
        if (col.getCellObservableValue(bmc).getValue() instanceof Brand) {
            System.out.println("hey Brand");
        }