仅使用合理的密钥在JTable单元中开始编辑

Mar*_*cos 6 java swing jtable

我认为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;
    }
Run Code Online (Sandbox Code Playgroud)

tra*_*god 1

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