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;
}