0

Groovy SwingBuilder を使用して Jtable をセットアップしています。ユーザーが引き続き新しい値を追加できるように、テーブルに空の行を保持しようとしています。空の行 (1 つの列) が入力されたら、すぐに新しい行を追加し、その新しい行のセルを編集して、テーブルへのフォーカスを要求します。フォーカスを要求する最初の呼び出しでは、すべてが正しく行われます (最初にセルをクリックすると仮定します)。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 を返します。私が気づいたことの 1 つは、テーブルのエンター キーの入力/アクションをオーバーライドしたときです。最初にクリックして編集した後、Enter キーを押して行を保存し、新しい行を作成してから、新しい行にフォーカスします。この新しい行を編集して Enter キーを押しても、何も起こりません。2 つの異なるオブジェクトに焦点が合っていますか?

4

2 に答える 2

0

JTable は、surrendersFocusOnKeystroke を true に設定して宣言する必要があります。これにより、キーボード イベント (つまり、前の編集で Enter キーを押したとき) の後に、この JTable の任意のテーブル エディターにフォーカスを移すことができます。

于 2014-09-18T21:42:09.840 に答える
0

それ以外の

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

やってみました

if (myTable.editCellAt(indexOfNewRow, 0)) {
    myTable.editorComponent.requestFocusInWindow()
}
于 2014-09-13T08:50:09.157 に答える