提问者:小点点

Jtable request estFocus usInWindow在第二次调用时失败


我使用Groovy SwingBuilder进行了Jtable设置,我正在尝试在表格中保留一个空行,以便用户可以继续添加新值。在空行(单列)填写后,我立即添加一个新行,编辑该新行的单元格,并请求对焦于表格。在第一次调用请求对焦期间,一切正常(假设我首先单击了单元格)。在点击回车键以保存我的单元格内容后,我添加了另一个空行,并且请求对焦失败。有人对可能发生的情况有任何建议吗?

SwingBuilder swingBuilder = new SwingBuilder()
JTable myTable = swingBuilder.table(autoCreateRowSorter: true, focusable: true)
table.myTable = swingBuilder.tableModel(list: [[value: "test"]) {
swingBuilder.closureColumn(header: "Values", 
  read: { row -> return row[value] }, 
  write: { row, newValue ->
    row[value] = newValue
    addNewRow(myTable)
  })
}

void addNewRow(JTable myTable) {
  List<Map<String, String>> myTableRows = myTable.model.getRows()
  if(myTableRows.findAll{ it[value].trim().isEmpty() }.size() == 0) { // prevent more than one empty row
    myTableRows.add([value: ""])
    myTable.model.fireTableDataChanged()

    // set focus on the newly created row
    int indexOfNewRow = myTable.convertRowIndexToView(myTableRows.findIndexOf { it[value] == "" })
    myTable.changeSelection(indexOfNewRow, 0, false, false)
    myTable.editCellAt(indexOfNewRow, 0)
    myTable.requestFocusInWindow() // succeeds on first call when I click this cell, fails on second when I hit enter after filling in a row
}

我已经检查了可见、可显示和可聚焦的值,在这种情况下两次都返回true。我注意到的一件事是,当我覆盖表格上回车键的输入/操作时。在我最初单击并编辑后,回车键将保存该行,创建一个新行,然后专注于新行。在我编辑这个新行并点击回车键后,什么都没有发生。两个不同的对象是否以某种方式聚焦?


共2个答案

匿名用户

而不是

myTable.editCellAt(indexOfNewRow, 0)
myTable.requestFocusInWindow()

你试过吗

if (myTable.editCellAt(indexOfNewRow, 0)) {
    myTable.editorComponent.requestFocusInWindow()
}

匿名用户

JTable需要声明并将surrendersFocus usOnKeystro设置为true。这允许在键盘事件之后(即-我按下上一次编辑的回车键)在此JTable的任何表格编辑器上获得焦点。