【问题标题】:JavaFX tab through editable cells通过可编辑单元格的 JavaFX 选项卡
【发布时间】:2025-11-29 02:10:02
【问题描述】:

我已经为 TableView 定义了我自己的可编辑单元格。一切都很好,但我希望能够通过单元格进行标记。假设我在选项卡上的单元格 [2,2] 中,我希望所选单元格转到 [3,2]。这可能吗?我应该如何实现这一目标?我应该向 TableCell 还是 TableColumn 添加一个侦听器?

这是我的自定义 TableCell

class EditingCell extends TableCell<Student, String> {

   private TextField textField;

   public EditingCell(Assignment assign) {
       this.setTooltip(new Tooltip(assign.getMaxPoints() + " pts max"));
   }

   @Override
   public void startEdit() {
       if (!isEmpty()) {
           super.startEdit();
           createTextField();
           setText(null);
           setGraphic(textField);
           textField.selectAll();
       }
   }

   @Override
   public void cancelEdit() {
       super.cancelEdit();

       setText((String) getItem());
       setGraphic(null);
   }

   @Override
   public void updateItem(String item, boolean empty) {
       super.updateItem(item, empty);

       if (empty) {
           setText(null);
           setGraphic(null);
       } else {
           if (isEditing()) {
               if (textField != null) {
                   textField.setText(getString());
               }
               setText(null);
               setGraphic(textField);
           } else {
               setText(getString());
               setGraphic(null);
           }
       }
   }

   private void createTextField() {
       textField = new TextField(getString());
       textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
       textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
           @Override
           public void changed(ObservableValue<? extends Boolean> arg0, 
               Boolean arg1, Boolean arg2) {
                   if (!arg2) {
                       commitEdit(textField.getText());
                   }
           }
       });
   }

   private String getString() {
       return getItem() == null ? "" : getItem().toString();
   }

}

【问题讨论】:

    标签: javafx listener tableview


    【解决方案1】:

    您可以通过将 KeyListener 添加到您的 textField 来实现此目的。尝试将以下代码添加到您的 createTextField()

    textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
       @Override
       public void handle(KeyEvent t) {
           if (t.getCode() == KeyCode.ENTER) {
               commitEdit(Integer.parseInt(textField.getText()));
           } else if (t.getCode() == KeyCode.ESCAPE) {
               cancelEdit();
           } else if (t.getCode() == KeyCode.TAB) {
               commitEdit(Integer.parseInt(textField.getText()));
               TableColumn nextColumn = getNextColumn(!t.isShiftDown());
               if (nextColumn != null) {
                   getTableView().edit(getTableRow().getIndex(), nextColumn);
               }
           }
       }
    });
    

    您还需要处理一些其他事情。完整示例请关注

    https://gist.github.com/abhinayagarwal/9383881

    【讨论】:

    • 很酷的解决方案,edit(row index, col) 似乎并不像宣传的那样。当我选项卡时,编辑已提交,但对 edit() 的调用并未将下一个单元格设置为编辑模式
    • @JamesFazio 代码有一个小错位 }。现在可以试试吗?
    • 嘿@ItachiUchiha 这不是编译问题,只是似乎不起作用
    • 是的,我也试过了,当我按 Tab 时,它只是输入数据然后突出显示该行,你有这个工作吗?
    • 嗯,似乎正在发生的事情是它试图进入下一个单元格的编辑模式,但它被阻止了,因为之前编辑的单元格仍然被选中。但我想出了一个似乎对我有用的解决方案,而不是调用 edit(),我使用 getTableView().getSelectionModel().selectBelowCell();