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

JavaFX选项卡通过可编辑单元格,javafx,listener,tableview,Javafx,Listener,Tableview,我已经为TableView定义了自己的可编辑单元格。一切都很好,但我希望能够通过标签的细胞。假设我在[2,2]单元格中,按tab键,我希望所选单元格转到[3,2]。这可能吗?我应该如何实现这一目标?我应该向TableCell或TableColumn添加侦听器吗 这是我的定制桌椅 class EditingCell extends TableCell<Student, String> { private TextField textField; public Editi

我已经为TableView定义了自己的可编辑单元格。一切都很好,但我希望能够通过标签的细胞。假设我在[2,2]单元格中,按tab键,我希望所选单元格转到[3,2]。这可能吗?我应该如何实现这一目标?我应该向TableCell或TableColumn添加侦听器吗

这是我的定制桌椅

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();
   }
class EditingCell扩展了TableCell{
私有文本字段文本字段;
公共编辑单元(分配){
这个.setTooltip(新的工具提示(assign.getMaxPoints()+“pts max”);
}
@凌驾
公开作废已启动IT(){
如果(!isEmpty()){
super.startEdit();
createTextField();
setText(空);
设置图形(文本字段);
textField.selectAll();
}
}
@凌驾
公共作废取消编辑(){
super.cancelEdit();
setText((字符串)getItem());
设置图形(空);
}
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
if(textField!=null){
setText(getString());
}
setText(空);
设置图形(文本字段);
}否则{
setText(getString());
设置图形(空);
}
}
}
私有void createTextField(){
textField=newtextfield(getString());
textField.setMinWidth(this.getWidth()-this.getGraphicTextGap()*2);
textField.focusedProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observeValue您可以通过向
textField
添加KeyListener来实现这一点。尝试将以下代码添加到
createTextField()

textField.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent t){
if(t.getCode()==KeyCode.ENTER){
committedit(Integer.parseInt(textField.getText());
}else if(t.getCode()==KeyCode.ESCAPE){
取消编辑();
}else if(t.getCode()==KeyCode.TAB){
committedit(Integer.parseInt(textField.getText());
TableColumn nextColumn=getNextColumn(!t.IsShift Down());
if(nextColumn!=null){
getTableView().edit(getTableRow().getIndex(),nextColumn);
}
}
}
});
还有一些事情你必须注意。要获得一个完整的例子,请遵循


很酷的解决方案,但编辑(行索引,列)似乎并没有像广告中所说的那样。当I选项卡时,编辑被提交,但对edit()的调用不会设置编辑中的下一个单元格mode@JamesFazio代码有一个小小的错位
}
。你现在可以试试吗?嘿@ItachiUchiha,这不是编译问题,它似乎不起作用。是的,我也试过了,当我按tab键时,它只输入数据,然后突出显示行,你有这个工作吗?嗯,似乎发生的是它尝试进入下一个单元格的编辑模式,但它被阻止了,因为以前的edited cell仍然处于选中状态。但我找到了一个似乎适合我的解决方案,我没有调用edit(),而是使用getTableView().getSelectionModel().selectBelowCell();
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);
           }
       }
   }
});