2011-03-02 87 views
0

在雨雲大號& f出現一個按下Enter鍵,如果按鈕具有焦點,這個按鈕被點擊另一個按鈕是否已經被設置爲默認爲:如何修改Nimbus L&F以在按Enter鍵時激活默認按鈕?

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); 

我從來沒有看到「來到這裏」的消息,但如果我綁定到另一個鍵擊,如「P」,它的功能與預期。所以看起來Enter鍵在它到達這個事件處理程序之前被捕獲。

我也嘗試修改的UIDefaults:

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

這也失敗了。任何人有任何想法如何做到這一點?

--- 更新 ---

進一步調查顯示,JButton的InputMap中包含{ 「按下回車」: 「壓」, 「發佈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中(一個或多個)更新後必須設置的外觀和感覺做。我沒有意識到這些東西都是必需的,但是再次,我在整個外觀和感覺方面都是新手。

0

我不使用Nimbus LAF,所以我不確定它是如何工作的。

使用Windows LAF時,默認按鈕會自動更改爲當前具有焦點的按鈕。這通過具有焦點的按鈕上的較暗邊界來指示。如果焦點不在按鈕上,那麼較暗的邊框將在默認按鈕上重置。

在Windows中,您可以通過使用禁用此行爲:

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 2011-03-03 04:53:52