繁体   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