Javafx 11 TableView Cell导航by Tab键在没有自定义EditableCell类的情况下按下



问题:

我想通过使用"选项卡键"从一个单元格到Javafx中下一个右边的邻居单元格。

注意:TableView设置为可编辑。

也启用了CellSelection。
 tableReceipt.getSelectionModel().setCellSelectionEnabled(true);

似乎是我的问题,而是我的问题,而是要求单个单元格在当前单元格上的焦点。

我可以将一个单元格聚焦,但是当我按下选项卡键时,焦点从表上移出其他元素。

tableview包含一些可编辑的textfieldtablecells和一个可编辑的comboboxbablecell。

我不为可编辑的单元格使用自定义类,但是代码:

Callback<TableColumn<Receipt, int>, TableCell<Receipt, int>> tfCallBack = TextFieldTableCell.forTableColumn();
columnAmount.setCellFactory(tfCallBack);

对于具有可编辑的Textfield Nature的Tablecell。

我的问题:

如何实施解决问题的解决方案?理论解决方案也将有所帮助。我已经准备好搜索此主题,但只找到了使用自定义EditableCell类的示例。我认为必须像我一样使用回调方法有一个解决方案。

解决方案方法:

tableReceipt.setOnKeyPressed(new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent t) {
        if (t.getCode() == KeyCode.TAB) {
            tableReceipt.getFocusModel().focusRightCell();
            Robot r = new Robot();
            r.keyPress(KeyCode.ENTER);
         }
     }
});

使用此代码,我可以在当前图的旁边获得焦点。而且我需要Enter Keypress来启用单元格的可编辑模式。但是,当我按键盘上的选项卡时,新值不会提交。例如,我按'2'默认值为'0',然后按下选项卡后,值再次为'0'。

问题编号2:

如何将上面的代码与changelistener/oneDitCommitListener组合在一起,将新值存储在单元格之后?

谢谢。

这可能会有所帮助。完成单元格后,您必须手动调用它。

import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by Brian Boutin on 5/14/2019
 */
class CellNav<T> {
    private final TableView<T> tableView;
    private KeyEvent lastKeyEvent;
    private TablePosition editingPosition;
    CellNav(TableView<T> tableView) {
        this.tableView = tableView;
        this.editingPosition = null;
        tableView.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
            if (event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.ENTER) {
                editingPosition = tableView.getEditingCell();
                lastKeyEvent = event;
            }
        });
        tableView.setOnMouseReleased(e -> editingPosition = null);
        for (TableColumn col : tableView.getColumns()) {
            col.setOnEditCancel(event -> editingPosition = null);
        }
    }
    void doCellNav() {
        if (editingPosition == null) {
            return;
        }
        if (lastKeyEvent.getCode() == KeyCode.ENTER) {
            int selectIdx;
            if (lastKeyEvent.isShiftDown()) {
                selectIdx = editingPosition.getRow() - 1;
            } else {
                selectIdx = editingPosition.getRow() + 1;
            }
            if (selectIdx < 0 ) {
                selectIdx = tableView.getItems().size() - 1;
            } else if (selectIdx > tableView.getItems().size() - 1) {
                selectIdx = 0;
            }
            tableView.layout();
            tableView.scrollTo(selectIdx == 0 ? selectIdx : selectIdx - 1);
            tableView.getSelectionModel().clearAndSelect(selectIdx);
            tableView.edit(selectIdx, editingPosition.getTableColumn());
        } else if (lastKeyEvent.getCode() == KeyCode.TAB) {
            TableColumn colToEdit = getNextColumn(!lastKeyEvent.isShiftDown(), editingPosition.getTableColumn());
            if (colToEdit != null) {
                tableView.layout();
                tableView.scrollToColumn(colToEdit);
                tableView.edit(editingPosition.getRow(), colToEdit);
            }
        }
        editingPosition = null;
    }
    boolean isNavigating() {
        return editingPosition != null;
    }
    private TableColumn getNextColumn(boolean forward, TableColumn currentCol) {
        List<TableColumn> columns = new ArrayList<>();
        for (TableColumn col : tableView.getColumns()) {
            if (col.isEditable() && col.isVisible() && (col.getStyleClass().contains("editable-col") || col.getStyleClass().contains("result-col"))) {
                columns.add(col);
            }
        }
        if (columns.size() < 2) {
            return null;
        }
        int currentIndex = -1;
        for (int i = 0; i < columns.size(); i++) {
            if (columns.get(i) == currentCol) {
                currentIndex = i;
                break;
            }
        }
        int nextIndex = currentIndex;
        if (forward) {
            nextIndex++;
            if (nextIndex > columns.size() - 1) {
                nextIndex = 0;
            }
        } else {
            nextIndex--;
            if (nextIndex < 0) {
                nextIndex = columns.size() - 1;
            }
        }
        return columns.get(nextIndex);
    }
}

public class ExampleClass{
  CellNav cellNav;
  
  public ExampleClass() {
    TableView  yourTableView = new TableView();
    cellNav = new CellNav(yourTableView);
    TableColumn someCol = new TableColumn();
    someCol.setOnEditCommit(e -> {
     //perform a save of your table data here
       //pick up cell nav again
      if (cellNav.isNavigating()) {
        cellNav.doCellNav();
      }
    });
  }
}

相关内容

  • 没有找到相关文章

最新更新