2012-09-14 44 views
2

接收焦點上點擊看來,JButton點擊時不會自動接收焦點,除非我明確地.setRequestFocusEnabled(true)配置的按鈕。我正在使用的應用程序在許多不同的地方(即不通過工廠方法)創建了很多按鈕,並且我需要所有這些按鈕在單擊時請求焦點。是否有Java的一種方法,使按鈕默認

有一種簡單的方法來改變默認行爲,通過按鈕設置一些屬性由默認請求專注於點擊,例如?或者我需要一直追捕他們,然後每個按鈕上都打一個電話.setRequestFocusEnabled(true)

回答

1

一個JButton 應該獲得焦點,所有Jbutton將點擊時。你可能有按鈕被修改爲不這樣做。但是這並不能解決你的問題。

整個UI已創建之後你可以改變你的按鈕(假設GUI不可同時打開修改) - 這種方式,你只需要每幀/對話框一個調用點:

public static class FocusHelper { 
    public static void alterButtons(Component container) { 
     if (component instanceof Container) { 
      Component[] children = ((Container) component).getComponents(); 
      for (Component child : children) { 
       alterButtons(child); 
      } 
     } else if (component instanceof JButton) { 
      ((JButton) component).setRequestFocusEnabled(true); 
     } 
    } 
} 

輔助方法只是掃描setRequestFocusEnabled按鈕和()的調用每個JButton的整個組件層次結構(您可能要檢查其他組件類型一樣AbstractButton的,這取決於你想達到的目標)。您只需從創建GUI的任何位置調用該方法,並傳遞頂層容器(JFrame,JDialog或任何其他Container組件)。

0

也許你可以創建一個從JButton的繼承子類,並實現有功能:

public class MyJButton extends JButton { 
    public MyJButton(String string, Icon icon) { 
     super(string, icon); 
     this.setRequestFocusEnabled(true); 
    } 

    public MyJButton(Action action) { 
     super(action); 
     this.setRequestFocusEnabled(true); 
    } 

    public MyJButton(String string) { 
     super(string); 
     this.setRequestFocusEnabled(true); 
    } 

    public MyJButton(Icon icon) { 
     super(icon); 
     this.setRequestFocusEnabled(true); 
    } 

    public MyJButton() { 
     super(); 
     this.setRequestFocusEnabled(true); 
    } 
} 

現在,你必須更換MyJButton對象

+0

或者,你可以簡單地覆蓋'的init()':'@覆蓋保護無效的init(字符串文本,圖標圖標){super.init(文字,圖標); this.setRequestFocusEnabled(真); }'。這應該工作,因爲[所有的JButton構造函數的最終調用此方法。(http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/javax/swing/JButton的.java#的JButton%3Cinit%3E%28java.lang.String%2Cjavax.swing.Icon%29) – gobernador

+0

嗯,我正在尋找一種方式,以避免更換所有的按鈕。但是,如果沒有這樣的方式,那麼我肯定要替換。我想我寧願選擇工廠模式,而不是像這樣繼承所有類型。 – janos

相關問題