【问题标题】:How to use ActionListener in another class如何在另一个类中使用 ActionListener
【发布时间】:2014-03-30 11:52:56
【问题描述】:

我正在清理我的代码。我读到我把ActionListener 放在另一个类更好。所以这就是我所做的。

但在我的ActionListener 中,除了在代码中的某个点,我得到了setSize(xx,xx) 之外,一切正常。我以前工作,因为它在同一个班。但现在不是了。我尝试了多种解决方案,但我无法弄清楚。

ActionListener:

public class ActionFrame implements ActionListener{

public void actionPerformed(ActionEvent e){
    Object src = e.getSource();

    if(src == Frame.Console_Bouton){
        System.out.println("Bouton console");
        if(getSize().getWidth() >= 750){
            /** If True (Retirer) */
            for(int i = 1090; i > 689; i--){
                setSize(i, 490);
                System.out.println("Rétractation du Frame");
            }
        }else{
            /** If False (Etirer) */
            for(int i = 689; i < 1090; i++){
                setSize(i, 490);
                System.out.println("Etirage du Frame");
            }
        }

            }

            ...

至于错误,没有,它只会冻结程序。

【问题讨论】:

    标签: java swing actionlistener code-cleanup


    【解决方案1】:

    猜测:这可能是提取ActionListener 不是一个好主意的情况不是,因为它使用对象的private 方法。

    具有通用/可重用功能的类应该独立存在。只要它们是为特定用途而设计的,将它们放在尽可能靠近它们使用的地方就不是坏习惯(完全!)。我可以想象您的 setSize 方法不是您类的公共接口的一部分,因此 ActionListener 只是将事件耦合到您的特定类的“粘合剂”。

    在这种情况下,您将创建一个“小”胶水线:

    abstract class ActionAdapter implements ActionListener {
    }
    ...
    frame.Console_Bouton.addActionListener(
        new ActionAdapter(){ // anonymous inner class 
          void actionPerformed(ActionEvent e){
             ... // (no need to check source!)
          }
        });
    

    【讨论】:

      【解决方案2】:

      创建一个新类:

       ButtonAction implements actionListner
      {
        //put the code above here
      }
      

      【讨论】:

        【解决方案3】:

        这样做的一个好方法是使用回调机制

        我在这里发布了相同上下文的答案

        JFrame in separate class, what about the ActionListener?


        -- 编辑--

        ActionEvent 获取源,然后找到它的父级(如果需要,获取父级的父级,直到获得需要调整大小的所需组件)并在其上调用setSize()

        【讨论】:

        • 我认为他正在尝试遵循 MVC 模式,并且在这种情况下,正在将动作侦听器从 View 类移动到 Controller 类。回调与多线程更加内联。
        • @W.K.S 是的,我正在尝试遵循 MVC。
        • 我不认为回调仅与多线程更内联。它是一种模式,可以在任何技术的任何地方使用。
        【解决方案4】:
        1. 在控制器中创建视图实例

        2. setSize(xx,yy)方法的访问修饰符从private更改为public

        3. actionPerformed() 中的setSize 替换为view.setSize(xx,yy)

        【讨论】:

        • 哪个部分不需要?
        • 显然,没有公开setSize,该课程也可以正常工作。因此不需要公开。除非它是该类“已发布”功能的一部分,否则我认为最好将其保密。
        猜你喜欢
        • 1970-01-01
        • 2015-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多