我有一个使用Groovy SwingBuilder的Jtable设置,我试图在表中保留一个空行,以便用户可以继续添加新值。在填充空行(单列)之后,我立即添加一个新行,编辑该新行的单元格,并请求焦点在该表上。在第一次请求焦点调用期间,一切正常(假设我先点击单元格)。按Enter键保存我的单元格内容后,我添加另一个空行,请求焦点失败。任何人对可能发生的事情都有任何建议吗?
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。我注意到的一件事是当我覆盖表格上的回车键的输入/动作时。在我最初点击并编辑之后,输入将保存行,创建一个新行,然后专注于新行。在我编辑这个新行并点击回车后,没有任何反应。两个不同的物体是否以某种方式聚焦?
答案 0 :(得分:0)
而不是
myTable.editCellAt(indexOfNewRow, 0)
myTable.requestFocusInWindow()
你试过吗
if (myTable.editCellAt(indexOfNewRow, 0)) {
myTable.editorComponent.requestFocusInWindow()
}
答案 1 :(得分:0)
需要在将surrendersFocusOnKeystroke设置为true的情况下声明JTable。这允许在键盘事件之后在该JTable的任何表编辑器上获得焦点(即 - 我从上一次编辑中击中回车键)。