Javafx:ComboBoxTableCell-如何在一次单击中选择一个值?

Javafx:ComboBoxTableCell-如何在一次单击中选择一个值?,javafx,combobox,tableview,mouseevent,Javafx,Combobox,Tableview,Mouseevent,我有一个带有ComboBoxTableCell的TableView,当使用默认实现时,用户必须单击三次才能从ComboBox列表中选择一个值。 我希望当用户单击单元格时显示组合框列表。我的解决方案基于此: 单元格确实进入编辑模式(调用startEdit()),但需要再次单击才能显示值列表,我缺少什么 table.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> { if (table.getEditingCell() == null)

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

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

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

谢谢。

也许不是这个问题的最干净的解决方案,但我找到了一个解决方法,只需单击一次即可使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;
        }
      });
column.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn列){
ComboBoxTableCell cbtCell=新ComboxTableCell(cbValues);
setOnMouseCenter(新的EventHandler(){
@凌驾
公共无效句柄(事件){
//如果没有Person对象,则该行中不应打开组合框
if(((Person)((TableRow)cbtCell.getParent()).getItem())!=null){
机器人r=新机器人();
r、 鼠标单击(MouseButton.PRIMARY);
r、 鼠标单击(MouseButton.PRIMARY);
}
}
});
返回cbtCell;
}
});

PS:我知道这个话题有点老了,但我最近也偶然发现了这个问题,在网上找不到任何有效的解决方案。正如我所悲伤的,这不是最干净的解决办法,但至少它完成了它的工作

有趣的问题-过了一会儿又冒出来:)

看起来OP的方法确实起作用了(从fx11开始,其编辑周围的一些错误似乎已经修复)-在组合单元格的帮助下:

  • 在tableView(从OP)上的单击处理程序中开始编辑
  • 扩展ComboBoxTableCell并覆盖其startEdit以打开下拉列表
代码段:

// 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();
        }
    }

});
//设置为可编辑以查看组合
table.setEditable(true);
//通过OP保持接近
table.addEventHandler(MouseEvent.MOUSE_单击,(e)->{
TablePosition focusedCellPos=table.getFocusModel()
.getFocusedCell();
if(table.getEditingCell()==null){
table.edit(focusedCellPos.getRow(),
focusedCellPos.getTableColumn());
}
});
//使用修改后的标准组合单元格在startEdit上显示其弹出窗口
setCellFactory(cb->new ComboBoxTableCell(名字){
@凌驾
公开作废已启动IT(){
super.startEdit();
if(iEdit()&&getGraphic()实例组合框){
//需要关注esc/enter的正确工作
getGraphic().requestFocus();
((组合框)getGraphic()).show();
}
}
});

默认情况下,双击进入编辑模式,单击一次即可展开
组合框
。您将其简化为一次单击以进入编辑模式,但您无法在不再次单击的情况下打开组合框的listview(除了一个非常难看的css“hack”)。我建议使用定制的
TableCell
实现。就我个人而言,我更愿意让组合框始终处于活动状态,因为显示组合框并打开下拉列表是我在表格单元格中不希望看到的行为。邪恶的方法,在enter键上创建一个机器人-但是,如果它起作用:)想知道它是否也能在您的上下文中起作用