我有2个类,一个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
}
}`
答案 0 :(得分:1)
根据我的理解,您有一组LightsOutButton
已添加到JFrame
。在LightsOutButton
您尝试执行某些操作,但需要以某种方式访问JFrame
才能实现...
我会说你有错误的概念。当然,LightsOutButton
没有理由不让它自己的事件处理程序来管理它的内部状态,但除此之外,它不应该关注任何其他人。
似乎解决这个问题的最佳方法是使用JFrame类的事件句柄注册每个按钮
将是一个准确的评估。你是如何做的将取决于你如何管理你的代码,但最简单的方法是将LightsOutButton
添加到某种List
或数组中,然后在一个List
或数组中添加和注册处理程序循环。
识别每个灯光将是您的下一个问题,但您可以使用name
/数组中的引用,或者设置每个灯光的actionCommand
属性或Action
属性根据你的需要。
如果每个灯都有“特定”任务要做,您可以考虑为每个灯使用ActionListener
或专门的{{1}},但这归结为需求
答案 1 :(得分:0)
LightsOutButton b = new LightsButton(..);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//you have acces to JFrame methods ..
});