概括:
在我的桌面应用程序中,我加载了一个 Jtable,在编辑模式下,如果我按 Tab,我需要将单元格的焦点放在下一个单元格上。
问题: 当我编辑一个单元格的值,然后当我按下 Tab 键时,焦点丢失了。我在网上做了一些搜索,我发现这是因为在每个 Tab 上按下 Jtable 都会重新加载。
可能的解决 方案我想到的一个解决方案是获取我正在工作的单元格的索引,将其放入全局变量中,然后按 Tab 键我可以获得下一个单元格的索引并将焦点设置在该单元格上。不知何故它不起作用。
请建议。
提前致谢..
在我的脑海中,我认为我们keystroke通过 tabes InputMap& 中的自定义实现克服了这个问题ActionMap。
我们使用的实现允许我们执行“连续”编辑,即当用户按下 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);
Run Code Online (Sandbox Code Playgroud)
该ContinousEditAction负责寻找下一个可编辑单元格。基本上,当动作被触发时,您通过JTable.getEditingRow&JTable.getEditingColumn方法评估当前单元格(您还想通过 来检查表格是否处于编辑模式JTable.isEditing,否则您需要使用JTable.getSelectedRow& JTable.getSelectedColumn- 事实上,您可能会逃避这样做,但是这就是我解决问题的方式)。
从那里,您希望遍历单元格,直到找到可编辑的单元格。
基本上,您想检查到当前行的末尾,然后移动到下一行,直到不再存在行,这取决于您要执行的操作,您可以选择循环回到表的开头(单元格 0x0)并步行直到您到达当前位置。
小心,如果你不小心,你可能会陷入一个连续的循环:P。
如果您没有找到任何可编辑的单元格,您可能只想使用JTable.setRowSelectionInterval&选择下一个可用的单元格,否则JTable.setRowSelectionInterval您可以调用JTable.editCellAt(nextRow, nextCol)
但这一切都归结为您想要实现的目标。
此外,您可以将相同的想法应用于回车键 ;)