4

JComboBoxエディターを含むJTableを次のように初期化しています

JComboBox comboBox = ...;
TableColumn tc = table.getColumnModel().getColumn(i);
tc.setCellEditor(new DefaultCellEditor(comboBox));

これは他の点では問題なく機能していますが、テーブル内を移動して、キーボードのみで値を更新できるようにしたいと思います。これはコンボボックスで可能ですが、値「1」を更新する場合は、最初にキーを押してコンボボックスをアクティブにし、次に「1」を押して項目を選択する必要があります。

だから、私が欲しいのは、「1」を押すことができ、1回のキーを押すだけでアイテムが選択されることです。

テキストセルの場合、次のようにprepareEditorでこれを行うことができました...

@Override
public Component prepareEditor(TableCellEditor editor, int row, int column) {
    Component c = super.prepareEditor(editor, row, column);
    if (c instanceof JTextComponent) {
        ((JTextComponent) c).selectAll();
    } 
    return c;
}

...しかし、私はコンボボックスをどうするかを理解することができませんでした。

1つの可能性は独自のTableCellEditorである可能性がありますが、もっと簡単な解決策があればいいでしょう=)

br、トウコ

4

2 に答える 2

0

コードに a を追加する必要がありKeyListenerます。

JTable最善の解決策は、それを配置しているコンポーネントに追加し、メソッドまたはJComboBoxメソッドを実装して、どちらがキーであるかを知り、必要なアクションを実行することです。keyPressed(KeyEvent e)keyReleased(KeyEvent e)

ここで例を挙げます。

JTable table = new JTable();

// Your necessary code (create combo box, cell editor...etc)

table.addKeyListener(new KeyListener() {

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch(keyCode) {
        case KeyEvent.VK_1:
            // manage key 1
            break;
        case KeyEvent.VK_A:
            // manage key A
            break;
        case KeyEvent.VK_F1:
            // manage key F1
            break;
        case KeyEvent.VK_TAB:
            // manage key TAB
            break;
        default:
            // manage other keys
        }
    }
});

このソリューションを、keyCode をアクション インターフェイスに関連付けるディクショナリと組み合わせることもできます。

この 2 番目のソリューションには、次のコードが必要です: グローバル属性 (ディクショナリ):

Map<Integer,MyAction> keyActions = new Hashmap<Integer,MyAction>();

独自のアクション インターフェイス:

public interface MyAction {

    public void doAction();
}

KeyListener.keyPressed() 関数は次のようになります。

public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    MyAction ma = keyActions.get(keyCode);
    if (ma != null) {
        ma.doAction();
    }
    else {
        // do default action for other keys
    }
}

これがお役に立てば幸いです。

よろしく!

于 2011-07-27T08:19:59.333 に答える