有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jtable requestFocusInWindow在第二次调用时失败

我使用Groovy SwingBuilder设置了一个Jtable,我试图在表中保留一个空行,以便用户可以继续添加新值。填充空行(单列)后,我立即添加新行,编辑新行的单元格,并请求将焦点放在表上。在第一次调用requestfocus时,一切正常(假设我首先单击了单元格)。在按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
}

我已经检查了visible、displayable和focusable的值,在这个场景中两次都返回true。我注意到的一件事是,我在表上覆盖了enter键的输入/操作。在我最初单击并编辑之后,enter将保存该行,创建一个新行,然后关注新行。编辑这一新行并按enter键后,什么也没有发生。两个不同的物体在某种程度上对焦了吗


共 (2) 个答案

  1. # 1 楼答案

    JTable需要在subdersfocusonkeystroke设置为true时声明。这允许在键盘事件(即-我在上一次编辑中按enter键)后,在此JTable的任何表格编辑器上获得焦点

  2. # 2 楼答案

    而不是

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

    你试过了吗

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