我的代码类似于以下内容:
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 中包含的所有 myButtons。对我来说突出的路线是使用instanceof来查看源是否是resetButton或myButton,但在我所看到的所有内容中似乎都强烈建议不要这样做。
我希望我离这里不太远。我的目标是编写好的代码,而不是坚持现有的代码,所以请告诉我我是否已经做了一些根本性错误的事情并且应该回溯。
最佳答案
一般来说,您可以通过选择组合而不是继承来解决问题。您的按钮不应该是特殊类按钮。相反,它们应该是原始的 JButton。您可以创建一个类,该类返回具有首选设置的 JButton
并保存数据,但尽量不要扩展 Swing 类。
对于您的封装问题,请勿公开data
。相反,使用 getData()
getter 来根据需要获取值。
您不需要使用instanceof。相反,请安装两个不同的 MouseListener - 一个用于您的 MyButton
按钮,另一个用于您的 ResetButton
按钮。这可以通过外部类或实现 MouseListener
的私有(private)内部类来完成。所有 MyButton
类型的按钮都将具有一种类型的监听器,而单个 ResetButton
将具有另一种类型的监听器。
关于java - 在 Java 中使用监听器时维护 OO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754931/