2011-03-02 6 views
0

는, 그 버튼을 같이 다른 버튼이 기본값으로 설정되어 있는지 여부를 클릭 :Nimbus L & F를 수정하여 Enter 키를 누를 때 기본 단추를 활성화하는 방법은 무엇입니까? 버튼에 포커스가있는 경우 하나가 Enter 키를 누를 때 후광의 L & F에서

getRootPane().setDefaultButton(myButton); 

또한, 바인딩 키 사용 작동하지 않습니다

Action clickDefault = new AbstractAction("clickDefault") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Got Here"); 
     getRootPane().getDefaultButton().doClick(); 
    } 
}; 
InputMap im = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
KeyStroke enter = KeyStroke.getKeyStroke("ENTER"); 
im.put(enter, "defaultButton"); 
getRootPane().getActionMap().put("defaultButton", clickDefault); 

나는 결코조차 볼 수있는 내가 같은 다른 키 스트로크 (keystroke)에 결합하면 예상대로 "P는"이 기능하지만, 메시지 "여기있어." 따라서이 이벤트 처리기에 도착하기 전에 Enter 키가 캡처 된 것 같습니다.

나는 또한되는 UIDefaults를 변경 시도 :

im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap"); 
    im.put(enter, null); 
    im.put(enterRelease, null); 

도 실패. 누구든지이 아이디어를 어떻게 성취 할 수 있습니까? (물론

--- 업데이트은 ---

추가 조사하는 JButton의 InputMap를가 { "발표": "프레스", "발표는 ENTER" "Enter 키를 눌렀을"}이 포함되어 있는지 밝혀 SPACE에 대한 바인딩). 문제의 컴퍼넌트의 키 바인드가 RootPane의 우선 순위보다 높습니다. 문제를 해결하는 코드는 내 대답을 참조하십시오.

답변

0

좋아, 마침내 내가 원하는대로이 작업을 수행하는 방법을 알아 냈습니다. 여기에 내가 사용하고 코드입니다 : 홈페이지

public class Main { 
    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 

      // Use Nimbus if it's available and we're not on Mac OSX 
      if (!System.getProperty("os.name").equals("Mac OS X")) { 
       try { 
        for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
         if ("Nimbus".equals(info.getName())) { 
          UIManager.setLookAndFeel(info.getClassName()); 

          ((InputMap) UIManager.get("Button.focusInputMap")) 
            .put(KeyStroke.getKeyStroke("pressed ENTER"), null); 
          ((InputMap) UIManager.get("Button.focusInputMap")) 
            .put(KeyStroke.getKeyStroke("released ENTER"), null); 

          break; 
         } 
        } 
       } catch (Exception e) { 
        // Default Look and Feel will be used 
       } 
      } 

      MainWindow mainWindow = new MainWindow(); 
      mainWindow.setVisible(true); 
     } 
    }); 
} 

} // 끝 클래스는

내가 알아 낸 한 가지 중요한 점은 InputMap를 (들)에 대한 업데이트는 모양과 느낌을 설정 한 후 이루어져야 것을 . 나는 이런 일들을 어지럽히는데 그것이 필요하다는 것을 몰랐다. 그러나 다시, 나는이 전체적인 Look and Feel 사업에 대해 새로운 사람이다.

0

저는 Nimbus LAF를 사용하지 않으므로 어떻게 작동하는지 잘 모르겠습니다.

Windows LAF에서는 기본 단추가 자동으로 현재 포커스가있는 단추로 바뀝니다. 이것은 포커스가있는 버튼의 더 어두운 테두리입니다. 포커스가 버튼에없는 경우, 더 어두운 경계선이 기본 버튼에서 재설정됩니다.

윈도우에서는 사용하여이 동작을 비활성화 할 수 있습니다

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.FALSE); 

지금 어두운 테두리 기본 버튼에 남아하고 Enter 키가 디폴트 버튼을 활성화합니다. 스페이스 바를 사용하여 포커스가있는 단추를 계속 클릭 할 수 있습니다.

+0

불행히도 Nimbus에서는 작동하지 않습니다. 실제로 Nimbus Defaults 페이지 : [link] (http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html)는 Button.defaultButtonFollowsFocus가 False로 설정되었음을 나타냅니다. 나는 또한 그것이 사실인지 확인하기 위해 getDefaults()를 사용하여 검사를 수행했다. – acarlow

관련 문제