Javafx:ComboBoxTableCell - 如何一键选择一个值?

时间:2017-12-27 14:47:57

标签: javafx combobox tableview mouseevent

我有一个带有ComboBoxTableCell的TableView,当使用默认实现时,用户必须单击三次次以从ComboBox列表中选择一个值。 我希望当用户点击单元格以显示组合框列表时。我的解决方案基于这个: JavaFX editable ComboBox in a table view

单元格确实进入编辑模式(调用startEdit())但是需要再次单击才能显示值列表,我缺少什么?

table.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> 
{
 if (table.getEditingCell() == null) 
 {
     TablePosition focusedCellPos = table.getFocusModel().getFocusedCell();
     table.edit(focusedCellPos.getRow(), focusedCellPos.getTableColumn());
 }
});

感谢。

2 个答案:

答案 0 :(得分:1)

有趣的问题-一段时间后再次冒泡:)

看起来OP的方法确实有效(从fx11开始,其编辑中的一些错误似乎已修复)-在组合单元的帮助下:

  • 在tableView上的单击处理程序中开始编辑(来自OP)
  • 扩展ComboBoxTableCell并覆盖其startEdit以打开dropDown

代码段:

// set editable to see the combo
table.setEditable(true);
// keep approach by OP
table.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> {
    TablePosition<Person, ?> focusedCellPos = table.getFocusModel()
            .getFocusedCell();
    if (table.getEditingCell() == null) {
        table.edit(focusedCellPos.getRow(),
                focusedCellPos.getTableColumn());
    }
});
// use modified standard combo cell shows its popup on startEdit
firstName.setCellFactory(cb -> new ComboBoxTableCell<>(firstNames) {

    @Override
    public void startEdit() {
        super.startEdit();
        if (isEditing() && getGraphic() instanceof ComboBox) {
            // needs focus for proper working of esc/enter 
            getGraphic().requestFocus();
            ((ComboBox<?>) getGraphic()).show();
        }
    }

});

答案 1 :(得分:0)

也许不是解决此问题的最佳方法,但我找到了一种解决方法,只需单击一下鼠标,即可使ComboBoxTableCells下拉菜单:

column.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
        @Override
        public TableCell<Person, String> call(TableColumn<Person, String> column) {
          ComboBoxTableCell cbtCell = new ComboBoxTableCell<>(cbValues);
          cbtCell.setOnMouseEntered(new EventHandler<Event>() {
            @Override
            public void handle(Event event) {
              // Without a Person object, a combobox shouldn't open in that row
              if (((Person)((TableRow)cbtCell.getParent()).getItem()) != null) {
                Robot r = new Robot();
                r.mouseClick(MouseButton.PRIMARY);
                r.mouseClick(MouseButton.PRIMARY);
              }
            }
          });
          return cbtCell;
        }
      });

PS:我知道这个话题有点老了,但是最近我也偶然发现了这个问题,无法在线找到任何可行的解决方案。令我难过的是,这不是最干净的解决方法,但至少可以做到这一点。 ;)