![](/img/trans.png)
[英]adding action listeners to a new jbutton created in a loop in java and called from another class
[英]Using action listeners on Jbutton array from another class / StackOverflowError
我正在制作Yahtzee型程序。 這是我的Java類中的最后一個項目。 我把它分解成多個類。 我遇到的問題是在我的ScoreSheet類和ScoreControl類之間。
ScoreSheet使用帶有循環的方法,該方法添加了一個JButtons數組並向它們添加了動作偵聽器。 然后,將動作偵聽器添加到ScoreControl類。 但是,當我在ActionPerformed中引用數組時,沒有任何輸出。 這是我的相關代碼:
從ScoreSheet:((sc)是我的ScoreControl的名稱)
public void setupUpperButtons(){
for(int i = 0; i<NUM_UPPER_CATEGORIES; i++){
upperCategories[i] = new JButton(upperNames[i]);
upperCategories[i].addActionListener(sc);
upperCategories[i].setFocusPainted(false);
}
當我嘗試從數組中引用按鈕時(在ScoreControl類中),如下所示:
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sheet.upperCategories[0]) {
System.out.println("You have pressed a button");
}
我沒有任何輸出。 打印只是為了測試它是否正常工作,一旦我開始工作,顯然會有不同的東西出現。
我只是注意到在我的ScoreSheet中,
ScoreControl=sc;
但是在構造函數中我沒有
sc = new ScoreControl;
但是,當我添加該行時,會出現大量StackOverflow錯誤。
java.lang.StackOverflowError
at sun.applet.AppletSecurity.checkPackageAccess(AppletSecurity.java:281)
at sun.reflect.misc.ReflectUtil.checkPackageAccess(ReflectUtil.java:188)
at javax.swing.UIDefaults.getUIClass(UIDefaults.java:680)
at javax.swing.UIDefaults.getUI(UIDefaults.java:757)
at javax.swing.UIManager.getUI(UIManager.java:1016)
at javax.swing.JPanel.updateUI(JPanel.java:126)
at javax.swing.JPanel.<init>(JPanel.java:86)
at javax.swing.JPanel.<init>(JPanel.java:109)
at javax.swing.JPanel.<init>(JPanel.java:117)
at ScoreSheet.<init>(ScoreSheet.java:33)
at ScoreControl.<init>(ScoreControl.java:16)
at ScoreSheet.<init>(ScoreSheet.java:34)
at ScoreControl.<init>(ScoreControl.java:16)
at ScoreSheet.<init>(ScoreSheet.java:34) (these last two lines repeat many many times)
這是每個構造函數:
來自ScoreSheet:
public ScoreSheet(){
sc = new ScoreControl();
grid = new GridLayout(0, 1, 10, 3);
setupUpperSection();
setupLowerSection();
setupFields();
setupScorePanel();
setupScoreSheet();
}
從ScoreControl:
public ScoreControl() {
sheet = new ScoreSheet();
}
我只是在我的ScoreControl上開始工作,因此其他內容將在以后發布,但這就是它們當前的樣子。
看起來很簡單。 您只需要將ScoreSheet
實例傳遞給ScoreControl
構造函數。
public ScoreSheet(){
sc = new ScoreControl(this);
grid = new GridLayout(0, 1, 10, 3);
setupUpperSection();
setupLowerSection();
setupFields();
setupScorePanel();
setupScoreSheet();
}
public ScoreControl(ScoreSheet _sheet) {
sheet = _sheet;
}
您也可以以相反的方式執行此操作...
public ScoreSheet(ScoreControl _sc){
sc = _sc;
grid = new GridLayout(0, 1, 10, 3);
setupUpperSection();
setupLowerSection();
setupFields();
setupScorePanel();
setupScoreSheet();
}
public ScoreControl() {
sheet = new ScoreSheet(this);
}
但是,請注意,在構建ScoreSheet
, ScoreControl
的構建尚未完成。 如果在ScoreControl
構造函數中調用的任何方法引用sc
,則sc.sheet
都不會被初始化,因為new ScoreSheet(this)
尚未返回值。
由於ScoreControl
構造函數不調用任何方法,因此它僅存儲對ScoreSheet
的引用,我更喜歡前一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.