gpt4 book ai didi

java - 仅使用合理的键在 JTable 单元格中开始编辑

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:18:07 26 4
gpt4 key购买 nike

我认为 JTable 组件应该更好地过滤将开始编辑的键。我的意思是,对于当前的实现,如果您在可编辑的单元格中键入 DEL、Ctrl+Shift+DEL、F5、F7,单元格编辑器就会出现。在我看来,使用这些键启动单元格编辑器对于最终用户来说非常不直观。

此外,还有另一个问题:JTable 不知道表单中定义的其他可能的键绑定(bind)。如果您为窗体上的按钮定义了键绑定(bind) Ctrl+Shift+C,如果您在 JTable 中键入此组合键,表格将开始编辑,接下来将调用您的按钮键绑定(bind)操作。我认为应该有一种简单的方法来防止这种情况发生,而不是在您的表键绑定(bind)映射中禁用所有那些已经定义的键绑定(bind)。

是否有一些第三方组件已经至少部分地解决了其中的一些问题,特别是使用合理的 key 开始编辑的组件?我不想自己进行所有繁琐的过滤。

如有任何帮助,我们将不胜感激。谢谢。

马科斯

更新

目前我正在使用这个非常不完美的“解决方案”,它至少暂时不会让事情变得更糟。感谢改进、意见和建议。

    @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: 同时基本上委托(delegate)给 SunToolkit 中的隐藏方法并处理 keyTyped(与过滤可能发生的事件所需的 keyPressed开始编辑后有效的可打印字符的候选者)它可能仍然会让你知道如何去做(suntoolkit 的源代码很可能在 openjdk 中可用,但没有在那里搜索)

关于java - 仅使用合理的键在 JTable 单元格中开始编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com