通过可编辑单元格的JavaFX选项卡

Jam*_*zio 3 javafx listener tableview

我已经为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();
   }
Run Code Online (Sandbox Code Playgroud)

}

Ita*_*iha 5

您可以通过将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);
           }
       }
   }
});
Run Code Online (Sandbox Code Playgroud)

您还需要处理其他一些事情。有关完整的示例,请按照

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