2014-09-12 108 views
0

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

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

JTable中需要声明与surrendersFocusOnKeystroke设置为true。这允许在键盘事件之后在该JTable的任何表编辑器上获得焦点(即,我从前一个编辑中敲入回车键)。

0

而不是

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

你试过

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

这应该是自动完成,另一个问题将移动与插入或selectAll – mKorbel 2014-09-13 19:38:18

+0

我没有检查myTable.editCellAt(indexOfNewRow,0)的返回值,并且它在两种情况下都返回true。一切似乎都成功了,直到最后的requestFocusInWindow调用。 – Skeeterdrums 2014-09-16 20:06:24

+0

你试图在editorComponent上调用它吗? – 2014-09-16 22:53:03

相关问题