如何将对象的事件侦听器注册到其类外部的事件处理程序?



我有两个类,一个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 ..
    });

最新更新