在Java中使用侦听器时维护OO

在Java中使用侦听器时维护OO,java,oop,listeners,Java,Oop,Listeners,我有类似以下代码: public class myButton extends JButton() { public int data; public myButton(){ super("asdf"); data = 2; } } public class myPanel extends MouseListener() { myButton myButtonVar1; myButton myButtonVar2;

我有类似以下代码:

public class myButton extends JButton()
{
    public int data;
    public myButton(){
        super("asdf");
        data = 2;
    }
}

public class myPanel extends MouseListener()
{
    myButton myButtonVar1;
    myButton myButtonVar2;
    public myPanel()
    {
        myButtonVar1 = new myButton();
        myPanel.add(myButtonVar1);
        myButtonVar1.addMouseListener(this);
        myButtonVar2 = new myButton();
        myPanel.add(myButtonVar2);
        myButtonVar2.addMouseListener(this);
    }

    //MouseListener Methods are here
    void mouseClicked(MouseEvent e)
    {
        //say this changes the myButton that was clicked data based off
        //the other myButton's data
        doSomething((myButton)(e.getSource()).data);
    }
}
然后我通过setContentPane将该面板添加到JFrame中

这个很好用。处理程序必须能够访问所有按钮,因为它需要知道myButtonVar1.data和myButtonVar2.data

这个设置不适合我,但主要的问题是,我必须在框架中还有其他按钮,可以访问myButtons

所以,我怎样才能清理这个问题,这样我就可以添加一个“resetButton”来重置myPanel中包含的所有mybutton。对我来说,最突出的方法是使用instanceof来查看源代码是resetButton还是myButton,但我所看到的一切似乎都强烈反对这种做法


我希望我离这里不太远。我的目标是编写好代码,而不是坚持现有的代码,因此,如果我已经做了一些根本错误的事情,请告诉我,并且应该回溯。

类应该以大写字母开头(MyButton而不是MyButton)。这是一个惯例

字段通常是私有的,您只有一个getter(myButton.data)


instanceof很少需要。相反,您可以使用“press”方法定义基类。这两个类都可以实现它。

一般来说,您可以通过选择组合而不是继承来解决问题。您的按钮不应该是特殊类按钮。相反,它们应该是原始的
JButton
s。您可以创建一个类,该类返回带有首选设置的
JButton
,并保存数据,但尽量不要扩展Swing类

对于封装问题,不要将
数据
公开。相反,使用
getData()
getter根据需要获取值


您不需要使用instanceof。相反,安装两个不同的鼠标侦听器-一个用于
MyButton
按钮,另一个用于
ResetButton
按钮。这可以通过外部类或实现
MouseListener
的私有内部类来实现。所有
MyButton
-类型的按钮都将有一种类型的侦听器,而单个
ResetButton
将有另一种类型的侦听器。

doSomething((MyButton(e.getSource()).data)
你的意思是调用构造函数吗?因为
myButton
没有定义单参数构造函数。即使定义了,也缺少一个
new
。或者你的意思是执行某种查找吗?而且括号不平衡。这是一个错误,我遗漏了一个括号
doSomething((myButton)(e.getSource()).data)
aha,现在结束paren改变了情况:-)是的,我写得很快,我通常遵循大写惯例,使用访问器和变异器,但我想我会尽量保持简洁。在征求一般性意见时,我可能应该更加小心。就“按下”方法而言,这似乎是一种操作方式,问题是所执行的操作需要了解其他按钮,因此不能作为按钮的方法执行。我可以在构造器中传入面板,这样我就可以访问它的全部内容。我的按钮(这个);