在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改变了情况:-)是的,我写得很快,我通常遵循大写惯例,使用访问器和变异器,但我想我会尽量保持简洁。在征求一般性意见时,我可能应该更加小心。就“按下”方法而言,这似乎是一种操作方式,问题是所执行的操作需要了解其他按钮,因此不能作为按钮的方法执行。我可以在构造器中传入面板,这样我就可以访问它的全部内容。我的按钮(这个);