簡體   English   中英

在另一個類的Jbutton數組上使用動作偵聽器/ StackOverflowError

[英]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);
}

但是,請注意,在構建ScoreSheetScoreControl的構建尚未完成。 如果在ScoreControl構造函數中調用的任何方法引用sc ,則sc.sheet都不會被初始化,因為new ScoreSheet(this)尚未返回值。

由於ScoreControl構造函數不調用任何方法,因此它僅存儲對ScoreSheet的引用,我更喜歡前一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM