2016-07-28 7 views
1

내 JButton에 바로 가기를 추가하려고합니다. 나는 How to Use Key Bindings 튜토리얼을 읽은 나는이 페이지 How to use Key Bindings instead of Key Listeners 및 키 바인딩에 대한 다른 질문의 loooooooooooooot을 읽고, 그러나 나는 무엇을 시도했다 나키 바인딩이 작동하지 않습니다. Java SE, 스윙

에 대한 답변을 못 찾았 :

public class Example extends JFrame { 

    public static void main(String args[]) { 
     Example example = new Example(); 
    } 

    Example(){ 
     Action action = new Action() { 
      @Override 
      public Object getValue(String key) { 
       return null; 
      } 

      @Override 
      public void putValue(String key, Object value) { 

      } 

      @Override 
      public void setEnabled(boolean b) { 

      } 

      @Override 
      public boolean isEnabled() { 
       return false; 
      } 

      @Override 
      public void addPropertyChangeListener(PropertyChangeListener listener) { 

      } 

      @Override 
      public void removePropertyChangeListener(PropertyChangeListener listener) { 

      } 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Hello World!"); 
      } 
     }; 

     JButton button = new JButton("Hello World!"); 
     button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("RIGHT"), "doSomething"); 
     button.getActionMap().put("doSomething", action); 
     button.addActionListener(action); 

     add(button); 
     setVisible(true); 
     pack(); 
    } 

} 

나는 또한처럼 만들려고했습니다 getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "doSmth");

을하지만 아무것도 작동하는 것 같다, 무슨 내가 잘못하고 있는가?

+0

첫 번째 예제가 저에게 효과적입니다. "와"actionPerformed' 함수가 무엇을 의미합니까? " – Ordous

+1

[mcve]를 게시하십시오. 문제가 귀하가 제공 한 코드 스 니펫에 없습니다. – user1803551

+0

질문을 편집했습니다. 이제 'NextCardListener'가 표시됩니다. 나는 슬픈 일을해야한다는 뜻입니다. –

답변

3

Action에는 구현 한 isEnabled이라는 메서드가 있습니다. 그것의 자바 독 상태 :

/** 
* Returns the enabled state of the <code>Action</code>. When enabled, 
* any component associated with this object is active and 
* able to fire this object's <code>actionPerformed</code> method. 
* 
* @return true if this <code>Action</code> is enabled 
*/ 

당신이 하드 false을 반환하기 때문에, Action이 활성화되지 않습니다와 actionPerformed 메서드가 호출되지 않습니다. 귀하의 문제는 구속력이 아니라 행동 자체입니다!

간단한 수정은, AbstractAction는 "나는 약을 상관하지 않는 모든이 물건의 종류 (true를 반환하는 isEnabled을 변경하거나, 더 간단하지만, Action 대신에 AbstractAction을 사용하고, 단지 actionPerformed을 무시하는 것입니다 한 가지 방법으로 구현할 수있는 가장 간단한 방법을 제공하십시오! ")

+0

내가 해냈어. 작동 해, 많이 고마워! 기음: –

관련 문제