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

标签 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 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/

相关文章:

hibernate - 混合 RDF 和 ORM 方法

php - 减少同一对象的不同类型集合中代码重复的设计模式

用于订阅的 Java 监听器设计模式

java - 例如,事件监听器如何不断轮询以检查按钮是否被单击?

java - 如何使用 JPA 在数据库中保存相似数据的映射

JavaFX:使垂直ScrollBar适合TableView中的父节点

java - 使用字符串指向某个列表(或数组)

java - 批量插入数据库期间,Spring JDBCTemplate 通信链接失败

C++有没有可能让一个类扩展一个类,同时又是一个接口(interface)的实现?

java - 无法解析对象