我认为 JTable 组件应该更好地过滤将开始编辑的键。我的意思是,对于当前的实现,例如,如果您在可编辑单元格中键入 DEL、Ctrl+Shift+DEL、F5、F7,则会出现单元格编辑器。在我看来,使用这样的键启动单元格编辑器对于最终用户来说是非常不直观的。
此外,还有另一个问题:JTable 不知道表单中定义的其他可能的键绑定。如果您为表单上的按钮定义了键绑定 Ctrl+Shift+C,如果您在 JTable 中键入此组合键,则表将开始编辑,接下来将调用您的按钮键绑定操作。我认为应该有一种简单的方法来防止这种情况,而不是禁用表键绑定映射中所有已经定义的键绑定。
是否有一些第三方组件已经至少部分地解决了其中一些问题,特别是用合理的键开始编辑的那个?我不想自己做所有乏味的过滤。
任何帮助,将不胜感激。谢谢你。
马科斯
更新
暂时我正在使用这个非常不完美的“解决方案”,至少暂时让事情变得不那么糟糕。改进,意见和建议表示赞赏。
@Override
public boolean isCellEditable(EventObject e)
{
if (e instanceof MouseEvent)
{
return ((MouseEvent) e).getClickCount() >=
_delegate.getMouseClickCountToStartEditing();
}
else if (e instanceof KeyEvent)
{
KeyEvent event = (KeyEvent) e;
int key = event.getKeyCode();
if ((key >= KeyEvent.VK_F1 && key <= KeyEvent.VK_F12) &&
KeyStroke.getKeyStrokeForEvent(event) != _startEditingKey)
{
return false;
}
int ctrlAlt = KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK;
if ((event.getModifiersEx() & ctrlAlt) == ctrlAlt)
{
return true;
}
if ((event.getModifiersEx() & ctrlAlt) != 0)
{
return false;
}
return true;
}
else
{
// Is this else really needed? Are there other events types
// other than mouse and key events?
return true;
}
}
// _startEditingKey is obtained with this method
private KeyStroke getStartEditingKey()
{
InputMap bindings = TheTable.this.getInputMap(
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
for (KeyStroke key : bindings.allKeys())
{
Object binding = bindings.get(key);
if ("startEditing".equals(binding))
{
return KeyStroke.getKeyStroke(
key.getKeyCode(), key.getModifiers(), true);
}
}
return null;
}