6

我认为 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;
    }
4

2 回答 2

4

如果 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 中可用,但没有在那里搜索)

于 2013-04-20T15:03:09.197 回答
1

您可以将任何所需的键绑定到表的startEditing操作,如此处和此处所示您可以禁用不需要的键,如此处所示。此处显示了一些其他细微差别,@camickr此处引用了该文章。

于 2013-04-20T14:28:03.860 回答