2012-08-11 73 views
3

JTable(稱爲gametable)中輸入時,此代碼調用例程。它工作的很好,但我想同樣Action被調用時,在JTable上移或下移,而不需要按輸入;我無法讓它工作。我嘗試用VK_UP代替VK_ENTER,但我無法在桌面上下移動?在JTable中按下向上或向下時調用例程

KeyStroke enter = KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0); 

gameTable.getJTable().unregisterKeyboardAction(enter); 
gameTable.getJTable().registerKeyboardAction(new ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent e) { 
      synchronized (this) { 
       gotoGame(gameTable.getSelectedIndex()); 
      } 
     } 
    }, enter, JComponent.WHEN_FOCUSED); 

我弄不明白。有人能幫我嗎?

回答

0

您需要將keylistener添加到您的JTable。然後在您的關鍵聽衆中,您可以檢查按下的任何按鈕,包括Enter,並採取相同的操作。

我有一個類似代碼的程序。在這裏,我只是在一個textarea中顯示不同的值,如果箭頭鍵選擇一個不同的單元格,但我想它可能會讓你知道如何設置它。

import java.awt.event.KeyEvent; 

import javax.swing.JTable; 

public class MyClass { 
    static JTable table = new JTable(); 

    public static void main(String[] args) { 
     table.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyReleased(final java.awt.event.KeyEvent evt) { 
       tableKeyReleased(evt); 
      } 
     }); 
    } 

    private static void tableKeyReleased(final java.awt.event.KeyEvent evt) { 
     final int key = evt.getKeyCode(); 
     if (key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN 
       || key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT) { 
      final int row = table.getSelectedRow(); 
      final int column = table.getSelectedColumn(); 

      final Object cellValue = table.getValueAt(row, column); 

      if (cellValue == null) { 
       return; 
      } 

     } 
    } 
} 
+0

'KeyListener'本質上不是_wrong_,但問題似乎涉及鍵綁定。 – trashgod 2012-08-11 18:45:29

+0

也許我誤解了這個問題。從功能上來說,這聽起來像我在做我的程序。我也有一些快捷鍵和複製/粘貼的鍵綁定,但這是一種不同類型的功能。 – Logan 2012-08-11 18:57:29

+0

'KeyListener'因「丟失」鍵而臭名昭着。如果在事件處理鏈中「KeyEvent」被消耗得更高,那麼'KeyEvent'很可能不會對你產生影響。 KeyBindings更可靠。恕我直言 – MadProgrammer 2012-08-11 21:21:53

3

你必須分開步驟:

  1. 首先將兩個KeyStroke實例在InputMap所以他們的目標相同actionMapKey

    KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); 
    KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); 
    String actionMapKey = "anActionMapKey"; 
    gameTable.getInputMap().put(enter, actionMapKey); 
    gameTable.getInputMap().put(up, actionMapKey); 
    
  2. 然後就是actionMapKey關聯與您的Action

    gameTable.getActionMap().put(actionMapKey, new AbstractAction(actionMapKey) { 
        ... 
    }); 
    

詳見How to Use ActionsKey Bindings

我對你在這方面使用synchronized (this)表示警惕;你應該在event dispatch thread上構建你的GUI。

+0

歡呼這個見解。我已經通讀了您的示例並閱讀了關於操作和綁定的鏈接。我現在知道這是最好的前進方向 - 只需把它們放在一起。 – user1432365 2012-08-11 21:43:42

相關問題