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

时间:2014-11-07 04:41:12

标签: java swing user-interface event-handling event-listener

我有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
    }
}`

2 个答案:

答案 0 :(得分:1)

根据我的理解,您有一组LightsOutButton已添加到JFrame。在LightsOutButton您尝试执行某些操作,但需要以某种方式访问​​JFrame才能实现...

我会说你有错误的概念。当然,LightsOutButton没有理由不让它自己的事件处理程序来管理它的内部状态,但除此之外,它不应该关注任何其他人。

  

似乎解决这个问题的最佳方法是使用JFrame类的事件句柄注册每个按钮

将是一个准确的评估。你是如何做的将取决于你如何管理你的代码,但最简单的方法是将LightsOutButton添加到某种List或数组中,然后在一个List或数组中添加和注册处理程序循环。

识别每个灯光将是您的下一个问题,但您可以使用name /数组中的引用,或者设置每个灯光的actionCommand属性或Action属性根据你的需要。

如果每个灯都有“特定”任务要做,您可以考虑为每个灯使用ActionListener或专门的{{1}},但这归结为需求

答案 1 :(得分:0)

在你的JFrame类中,当你添加按钮时

LightsOutButton b = new LightsButton(..);
b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //you have acces to JFrame methods ..
    });