Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写动作侦听器的常用方法是什么?_Java_Actionlistener - Fatal编程技术网

Java 编写动作侦听器的常用方法是什么?

Java 编写动作侦听器的常用方法是什么?,java,actionlistener,Java,Actionlistener,我刚开始学习如何使用动作监听器。据我所知,其工作方式如下: 默认情况下,有些类包含“addActionListener”方法(例如按钮类) 使用此方法,我们向对象添加一个动作侦听器。例如:listenedObject.addActionListener(listeningObject) 当执行带有“ListendObject”的操作时,将调用“listeningObject”的“actionPerformed”方法。因此,这意味着当我们为ListingObject编程一个类时,我们需要在其中放置

我刚开始学习如何使用动作监听器。据我所知,其工作方式如下:

  • 默认情况下,有些类包含“addActionListener”方法(例如按钮类)

  • 使用此方法,我们向对象添加一个动作侦听器。例如:
    listenedObject.addActionListener(listeningObject)

  • 当执行带有“ListendObject”的操作时,将调用“listeningObject”的“actionPerformed”方法。因此,这意味着当我们为ListingObject编程一个类时,我们需要在其中放置“actionPerformed”方法

  • 我不清楚的是,我们是否应该为每个我们想要监听的对象创建一个新类。在我看来,这并不是一个优雅的解决方案。另一方面,如果我们对所有(或至少多个)对象都有一个action listener类,那么我们就会遇到问题,因为该类的实例将不知道哪个对象正在调用“actionPerformed”方法(我们需要知道,因为actionPerformed执行的操作取决于此方法调用的对象)


    在我看来,我们需要创建的每个被监听对象都是“个人”动作监听器,我们可以通过为动作监听器的相应字段设置特定值来实现。但我不确定这是否是一种标准的方式?人们通常是怎么做的?

    根据我个人的经验判断,最常见的处理方法是创建一个匿名内联类。像这样:

    listenedObject.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            // Your action handling code in here
        }
    });
    
    我经常看到人们调用包含ListendObject的对象的方法。例如,在具有按钮的对话框中:

    myOkayButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            okayButtonPressed();
        }
    });
    
    然后在对话框类的后面部分:

    private void okayButtonPressed() {
        // Do what we need to do
    }
    

    个人而言,如果可能的话,我更喜欢使用类(例如
    AbstractAction
    的子类),而不是简单地依赖于动作侦听器。通过这种方式,我可以为原始小部件提供名称、图标、工具提示等…

    我一直认为有用的方式(用于导航)是创建一个匿名内部类,然后委托给外部类:

    listenedObject.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            listenedObject_actionPerformed(evt);
        }
    });
    
    
    private void listenedObject_actionPerformed(ActionEvent evt) {
        //Your handling goes here
    }
    
    然后,使用结构查找(IDEA中的CTRL+F12,Eclipse中的CTRL+O)更容易在IDE中处理代码

    使用单个类(如GUI
    MyColPanel
    )作为一组组件(按钮等)的公共侦听器的问题在于
    actionPerformed
    方法会进行大量丑陋的
    if-else
    比较,以确定实际按下了哪个按钮-根本不是很OO


    当然,您不应该过分担心这类事情的性能方面,因为它们在极端情况下可能可以忽略不计!众所周知,过早优化是一件坏事

    注意方法removeActionListener的存在是有原因的。如果所侦听的对象将与处理事件的对象一起消亡,则可以跳过侦听器清理。但是,如果您的组件侦听外部源提供的模型,则应该在addNotify中添加侦听器,并在removeNotify方法中删除它们。否则,您可能会发生内存泄漏。

    可能现在还没有,但我相信在不久的将来(在Java 7发布之后),类似这样的事情将是常见的方式:

    listenedObject.addActionListener ( #{doSmth();} );
    

    我一直认为有用的方法是创建一个单独的类,该类实现ActionListener接口和执行操作所需的所有其他方法。这样,一个动作就不会绑定到一个特定的对象,可以通过一个按钮、一个菜单等来触发。有点像我猜的那样。它使代码保持简单

    匿名类是不可重用的


    重定向到包含ListendObject的对象会导致难以维护的庞大类。

    OK。我懂了。顺便问一下,@Override是什么意思?甚至是:public void actionPerformed(ActionEvent e){onMyButtonClicked();}-几乎是一个方法pointer@Override是注释,表示Public void actionPerformed()重写其超类中的方法。当您创建这样的内联匿名类时,您正在重写ActionListener。您只是没有给它一个名称。注释只是告诉编译器在超类中查找被重写的方法,如果它不在超类中或不匹配,则对您大喊大叫。您还可以调用evt.getSource()来获取引发事件的对象-这意味着您可以使用单个侦听器侦听多个事件源上的事件。。。例如,JFrame上通常有侦听器来侦听该JFrame的许多控件的操作。