2

JTable編集可能なセルがあります。セルをクリックすると、編集モードになります。方向矢印を使用してセル内を移動しているときにも同じことが起こります。ここで、編集を開始する代わりにセルを選択し、Enterキーが押されたときにのみセルを編集したいと考えています。

その他の情報が必要な場合は、お尋ねください。

編集:Enterキーのアクション

class EnterAction extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent e) {
        JTable tbl = (JTable) e.getSource();
        tbl.editCellAt(tbl.getSelectedRow(), tbl.getSelectedColumn());
        if (tbl.getEditorComponent() != null) {
            tbl.getEditorComponent().requestFocus();
        }
    }
}

これは左矢印アクションのためのもので、残りの 3 つはこの 1 つから推測するのは難しくありません。

class LeftAction extends AbstractAction {
    @Override
    public void actionPerformed(ActionEvent e) {
        JTable tbl = (JTable)e.getSource();
        tbl.requestFocus();
        tbl.changeSelection(tbl.getSelectedRow(), tbl.getSelectedColumn() > 0 ? tbl.getSelectedColumn()-1:tbl.getSelectedColumn(), false, false);
        if(tbl.getCellEditor()!=null)
            tbl.getCellEditor().stopCellEditing();
    }
}

そして、これはこのアクションをバインドする方法です:

final String solve = "Solve";
            KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
            table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(enter, solve);
            table.getActionMap().put(solve, new EnterAction());
final String sel = "Sel";
            KeyStroke arrow = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
            table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(arrow, sel);
            table.getActionMap().put(sel, new LeftAction());

ああ、マウスクリックで編集する代わりにセルを選択するのをほとんど忘れていました:

public static MouseListener mAdapterTable = new MouseListener()
{
    @Override
    public void mousePressed(MouseEvent e)
    {
        JTable tbl=((JTable)e.getComponent());
        if(tbl.isEditing())
        {
            tbl.getCellEditor().stopCellEditing();
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        JTable tbl=((JTable)e.getComponent());
        if(tbl.isEditing() )
            tbl.getCellEditor().stopCellEditing();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        JTable tbl=((JTable)e.getComponent());
        if(tbl.isEditing() )
            tbl.getCellEditor().stopCellEditing();
    }
};

次のEventListnerようにテーブルに追加する必要があります。

table.addMouseListener(mAdapterTable);
4

2 に答える 2

4

これにはキーバインディングを使用します。ほとんどのLook&Feel実装はすでにF2テーブルのstartEditingアクションにバインドされていますが、別のバインドを追加します。

tree.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "startEditing");

Enterこれにより、テーブルのselectNextRowCellアクションに対する以前のバインディングが効果的に置き換えられます。

于 2012-07-26T23:39:09.153 に答える
0

これが私がすることです:

  • まず、JTable の単一セル選択を有効にします
  • テーブルを含む JTable または JPanel の KeyAdapter または KeyListener を作成します。
  • KeyAdapter の keyPressed() メソッドで、次のように、選択したセルの編集モードに入ります: http://www.exampledepot.com/egs/javax.swing.table/StopEdit.html

ユーザーが編集のために右ボタンを押したかどうかは、keyPressed() メソッドで確認できます。テーブルで通常の(ダブルクリック)編集が無効になっている場合、プログラムで編集しようとするとどうなるかわかりませんが、うまくいかない場合は、選択したセルで編集を有効にすることができます、ユーザーが編集ボタンを押したときに、編集が終了したら、もう一度無効にします。

于 2012-07-26T11:50:02.110 に答える