2011-06-24 13 views
2

私はKeyListenerを使用してDELETE (char) 127が押されたかどうかを確認できますが、JTableのselectedRowにkeyListenerを追加するにはどうすればよいですか?キーボードのDELETEを押してJTableの行を削除する方法

EDIT:

私はこれを試してみましたが、それは動作しません:

myTable.addKeyListener(this); 
... 
public void keyPressed(KeyEvent e) 
{ 
    if(e.getKeyCode() == 127 && myTable.GetSelectedRow() != -1) 
    { 
     btnRemove.doClick(); // this will remove the selected row in JTable 
    } 
} 
+0

は 'getSelectedRow()'で小文字 'G' であるべきです。 'btnRemove.doClick()'は何をしますか? –

+0

@bemace私自身の 'GetSelectedRow()'メソッドを定義しました –

+2

うーん、*問題があります。在庫の問題は何でしたか? –

答えて

10

1つの問題は、に聞かれてコンポーネントがフォーカスをなければならないということです。これを回避する方法の1つは、キーバインディングを使用することです。

例えば、

// assume JTable is named "table" 
    int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; 
    InputMap inputMap = table.getInputMap(condition); 
    ActionMap actionMap = table.getActionMap(); 

    // DELETE is a String constant that for me was defined as "Delete" 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), DELETE); 
    actionMap.put(DELETE, new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     // TODO: do deletion action here 
    } 
    }); 
+0

Key Bindingsの使用例を教えてください。 –

+0

@Eng:上記を参照してください。しかし、もっと重要なのは、このトピックのSwingチュートリアル –

+2

+1を参照してください。ただし、WHEN_ANCESTOR_OF_FOCUSED_COMPONENTを使用します。正確な違いはわかりませんが、デフォルトのバインディングはこれを使用するか、またはWHEN_FOCUSEDを使用します。 Key Bindings(http://tips4java.wordpress.com/2008/10/10/key-bindings/)を参照してください。 – camickr

3

あなたが行に1を追加する必要はありません。 1つのリスナーをテーブルに追加して、どの行が選択されているのかをテーブルに尋ねさせます。

keyPressedの代わりにkeyTypedを試すこともできます。一部のプラットフォームでは、一方が動作し他方が動作しないという問題がありました。

ユーザーがキーバインディングを設定できるようにしたい場合は、@hovercraftが示唆しているようにキーバインディングを使用することができます。 KeyStrokeをアクション名にマッピングしてInputMapとし、アクション名をActionにマッピングすることが必要です(ActionMap)。 KeyListenersと

table.getInputMap().put(KeyStroke.getKeyStroke("DELETE"), 
         "deleteRow"); 
table.getActionMap().put("deleteRow", yourAction); 
+0

私はこれを前に試しましたが、なぜ動作しないのか分かりません。\ –

+0

@Eng:あなたが私たちにコードを表示していないのであれば、どちらもしません。 –

+0

@Hovercraft update –

関連する問題