[英]Start editing in a JTable cell only with reasonable keys
我认为JTable组件应该更好地过滤将开始编辑的键。 我的意思是,对于当前的实现,如果您在可编辑单元格中键入DEL,Ctrl + Shift + DEL,F5,F7,则会出现单元格编辑器。 在我看来,使用这些键启动单元格编辑器对最终用户来说非常不直观。
此外,还有另一个问题:JTable不知道表单中定义的其他可能的键绑定。 如果为表单上的按钮定义了键绑定Ctrl + Shift + C,如果在JTable中键入此键组合,表将开始编辑,然后将调用按钮键绑定操作。 我认为应该有一种简单的方法来防止这种情况,而不是在表键绑定映射中禁用所有已定义的键绑定。
是否有一些第三方组件已经解决了,至少部分已经解决了其中一些问题,特别是用合理的密钥开始编辑的问题? 我不想自己做所有繁琐的过滤。
任何帮助,将不胜感激。 谢谢。
马科斯
UPDATE
暂时我正在使用这种非常不完美的“解决方案”,至少让事情变得更糟。 感谢改进,评论和建议。
@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;
}
如果keyEvent具有您要忽略的修饰符,则可以实现报告不可编辑的自定义编辑器:
DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) {
@Override
public boolean isCellEditable(EventObject e) {
if (e instanceof KeyEvent) {
return startWithKeyEvent((KeyEvent) e);
}
return super.isCellEditable(e);
}
private boolean startWithKeyEvent(KeyEvent e) {
// check modifiers as needed, this here is just a quick example ;-)
if ((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) {
return false;
}
// check for a list of function key strokes
if (excludes.contains(KeyStroke.getKeyStrokeForEvent(e)) {
return false;
}
return true;
}
};
JTable table = new JTable(new AncientSwingTeam());
table.setDefaultEditor(Object.class, editor);
编辑:对于可以正确处理ctrl-alt组合的更可靠的过滤,您可以查看DefaultEditorKit.DefaultKeyTypedAction:同时基本上委托SunToolkit中的隐藏方法并处理keyTyped(与过滤事件所需的keyPressed相对)在开始编辑之后可能是有效的可打印字符的候选者)它可能仍然让你知道如何做(suntoolkit的源代码最有可能在openjdk中提供,但是没有在那里搜索)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.