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 を処理します (vs. keyPressed はイベントをフィルタリングするために必要です)。編集を開始した後、有効な印刷可能な文字の候補となる可能性があります)それを行う方法のアイデアを提供する場合があります (suntoolkit のソースはおそらく openjdk で入手できますが、そこで検索しませんでした)

于 2013-04-20T15:03:09.197 に答える