JavaFX选项卡通过可编辑单元格
我已经为TableView定义了自己的可编辑单元格。一切都很好,但我希望能够通过标签的细胞。假设我在[2,2]单元格中,按tab键,我希望所选单元格转到[3,2]。这可能吗?我应该如何实现这一目标?我应该向TableCell或TableColumn添加侦听器吗 这是我的定制桌椅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
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);
}
}
}
});