gpt4 book ai didi

java - 在 Java 中使用监听器时维护 OO

转载 作者:行者123 更新时间:2023-11-30 05:10:02 25 4
gpt4 key购买 nike

我的代码类似于以下内容:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com