2012-08-11 2 views
3

이 코드는 이라고 입력하면 JTable (gametable)으로 루틴을 호출합니다. 잘 작동하지만, Action을 누르지 않아도 JTable에서 위 또는 아래로 이동할 때 같은 것을 원합니다. 을 입력하십시오.; 나는 그것을 작동시킬 수 없다. VK_ENTERVK_UP으로 대체하려고 시도했지만 테이블을 위아래로 이동할 수 없습니까?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

JTable에 키 릴스터를 추가해야합니다. 그런 다음 키 수신기에서 Enter를 포함하여 누른 버튼을 확인하고 동일한 작업을 수행 할 수 있습니다.

나는 비슷한 코드를 가진 프로그램을 가지고있다. 여기 화살표 키가 다른 셀을 선택하면 하나의 텍스트 영역에 다른 값이 표시되지만, 설정하는 방법에 대한 아이디어를 줄 수 있다고 생각합니다.

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

+0

어쩌면 나는 그 질문을 오해했을 것입니다. 기능적으로는 내 프로그램에서하는 것처럼 들립니다. 내가 단축키 및 복사/붙여 넣기에 대한 몇 가지 키 바인딩을 가지고 있지만 기능의 다른 유형이야. – Logan

+0

'KeyListener'는 "missing"키로 악명이 높습니다. 'KeyEvent'가 이벤트 핸들링 체인에서 더 많이 소비된다면,'KeyEvent'는 아마 당신에게 그것을 만들지 않을 것입니다. KeyBinding은 훨씬 더 신뢰할 수 있습니다. IMHO – MadProgrammer

3

당신은 단계를 분리해야합니다 :

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); 
  • 그런 다음 그 actionMapKey 연결 :

    1. 첫째는 InputMapKeyStroke 인스턴스를 넣어 그래서 그들은이 actionMapKey 같은 대상 with your Action :

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

    은 자세한 내용은 How to Use ActionsKey Bindings를 참조하십시오.

    여기서는 synchronized (this)을 신중히 사용합니다. event dispatch thread에 GUI를 구성해야합니다.

  • +0

    이 통찰력에 환호. 귀하의 예를 읽고 행동과 바인딩에 대한 귀하의 링크를 읽었습니다. 이제 이것이 이것이 최선의 방법임을 알았습니다. 모든 것을 합치면됩니다. – user1432365

    관련 문제