![](/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.