2014-09-12 126 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