在 JTable 中按 Tab 键将焦点从一个单元格转移到另一个单元格

3

概要:

在我的桌面应用程序中,我加载一个Jtable,当处于编辑模式时,如果我按Tab键,需要将光标焦点移动到下一个单元格。

问题: 当我正在编辑单元格的值,然后按Tab键时,焦点会丢失。我在网上搜索了一些信息,发现这是因为每次按Tab键时,Jtable都会重新加载。

可能的解决方案: 我想到的一个解决方案是获取我正在工作的单元格的索引,在全局变量中保存它,然后在按Tab键时,可以获取下一个单元格的索引并将焦点设置在该单元格上。 但不知何故它没有起作用。

请建议。

提前致谢。


+1 对于你的问题进行结构化 :-) 虽然我不太明白它的意思:你所说的“聚焦”下一个单元格是什么意思?是在编辑器上开始吗?类似于“失去焦点” - 是从哪个组件开始?“每次按下Tab键,JTable都会重新加载自己” 不,这不是默认行为。最好编写一个SSCCE来演示你的问题,这样就不会有简单语言误解阻碍解决方案的道路 :-) - kleopatra
2个回答

5

我想起来了,我们通过在选项卡的InputMapActionMap中实现自定义keystroke来解决这个问题。

我们使用的实现方式允许我们执行“连续”编辑,也就是说,当用户按下Enter或Tab键时,我们会移动到下一个可编辑的单元格并开始编辑。

InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = table.getActionMap();

KeyStroke tabKey = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);

Action moveNextCellAction = am.get(im.get(tabKey));

ContinousEditAction continousEditAction = new ContinousEditAction(table, moveNextCellAction);

im.put(tabKey, "Action.tab");

am.put("Action.tab", continousEditAction);
ContinousEditAction 负责查找下一个可编辑的单元格。当触发该操作时,您可以通过JTable.getEditingRowJTable.getEditingColumn方法获取当前单元格的信息(您还需要检查表是否处于编辑模式,如果不是,则需要使用JTable.getSelectedRowJTable.getSelectedColumn - 实际上只使用这些方法可能就足够了,但这是我解决问题的方式)。
从那里开始,您需要遍历单元格,直到找到可编辑的单元格。基本上,您想要检查当前行的末尾,然后移动到下一行,直到不存在更多的行,根据您想要做的事情,您可能会选择回到表格的开始位置(0x0单元格),并在到达当前位置之前遍历它。要小心,如果不小心的话,您可能会陷入连续循环中:P。
如果您找不到任何可编辑的单元格,您可以使用JTable.setRowSelectionIntervalJTable.setRowSelectionInterval选择下一个可用单元格,否则您可以调用JTable.editCellAt(nextRow, nextCol)。但这完全取决于您想要实现什么样的功能。
此外,您也可以将相同的想法应用于enter键;)。

3

通常情况下,在 jTable 上获取焦点后会使用 Tab 键。如果你想通过按 Tab 键编辑下一个单元格,请在 jTable 的键释放事件中添加以下代码。

 if (evt.getKeyCode() == 9) {
            jTable1.editCellAt(nextRowIndex, nextColumnIndex);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接