我有两个类,一个JFrame类和一个名为LightsOutButton的JButton类。JFrame类有一个LightsOutButton对象的集合。当按下各个按钮时,我需要执行操作,但我无法从LightsOutButton类中的事件处理程序访问JFrame类的方法。
解决这一问题的最佳方法似乎是向JFrame类的事件处理程序注册每个按钮。我该怎么做?
`// this is my button object. It has registered its action listener to itself(which I want to change)
public class LightsOutButton extends JButton implements ActionListener {
private boolean onOrOff; // true = on, false = off
private int iCoord;
private int jCoord;
public LightsOutButton() {
super.addActionListener(this);
onOrOff = false;
super.setContentAreaFilled(false);
}
}
// this is my JFrame class. This is the class that I want to handle each button object's events
public void actionPerformed(ActionEvent e) {
// Get the button that was clicked
JButton button = (JButton)e.getSource();
if(button == newGame) {
reset();
}
if(button == manual) {
if (manualMode == false) {
manualMode = true;
}
if (manualMode == true) {
manualMode = false;
}
}
// this is the implementation that I'm wishing for here:
if(button = LightsOutButton){
// do something
}
}`
据我所知,基本上,您有一组LightsOutButton
,它们已添加到JFrame
中。在LightsOutButton
中,您试图执行一些操作,但需要以某种方式访问JFrame
才能实现…
我想说你有错误的概念。当然,LightsOutButton
没有理由不拥有自己的事件处理程序来管理其内部状态,但除此之外,它不应该关心其他任何人。
解决这个问题的最好方法似乎是用JFrame类的事件句柄注册每个按钮
这将是一个准确的评估。如何执行将取决于您如何管理代码,但最简单的方法可能是将LightsOutButton
添加到某种List
或数组中,然后在循环中添加并注册处理程序。
识别每个灯光将是您的下一个问题,但您可以使用List
/阵列中的引用,或者根据需要设置每个灯光的name
属性或actionCommand
属性。
如果每个灯都有一个"特定"的任务要做,你可以考虑为每个灯使用Action
或专门的ActionListener
,但这归结为需要
在JFrame类中,当您添加按钮时
LightsOutButton b = new LightsButton(..);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//you have acces to JFrame methods ..
});