接收焦點上點擊看來,JButton
點擊時不會自動接收焦點,除非我明確地.setRequestFocusEnabled(true)
配置的按鈕。我正在使用的應用程序在許多不同的地方(即不通過工廠方法)創建了很多按鈕,並且我需要所有這些按鈕在單擊時請求焦點。是否有Java的一種方法,使按鈕默認
有一種簡單的方法來改變默認行爲,通過按鈕設置一些屬性由默認請求專注於點擊,例如?或者我需要一直追捕他們,然後每個按鈕上都打一個電話.setRequestFocusEnabled(true)
?
接收焦點上點擊看來,JButton
點擊時不會自動接收焦點,除非我明確地.setRequestFocusEnabled(true)
配置的按鈕。我正在使用的應用程序在許多不同的地方(即不通過工廠方法)創建了很多按鈕,並且我需要所有這些按鈕在單擊時請求焦點。是否有Java的一種方法,使按鈕默認
有一種簡單的方法來改變默認行爲,通過按鈕設置一些屬性由默認請求專注於點擊,例如?或者我需要一直追捕他們,然後每個按鈕上都打一個電話.setRequestFocusEnabled(true)
?
一個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組件)。
也許你可以創建一個從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對象
或者,你可以簡單地覆蓋'的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
嗯,我正在尋找一種方式,以避免更換所有的按鈕。但是,如果沒有這樣的方式,那麼我肯定要替換。我想我寧願選擇工廠模式,而不是像這樣繼承所有類型。 – janos