【问题标题】:ActionListener interface动作监听接口
【发布时间】:2017-05-29 08:45:12
【问题描述】:
public class myWindow extends JFrame implements ActionListener{

如果我有这段代码,我的类将是一个 JFrame,我可以在其中添加组件并在构造函数中向它们添加 actionlistener,如下所示

public MyWindow()
     {
      JButton b = new Jbutton("button");
       b.addActionListener(this);
        }

这个关键字将作为一个匿名的 actionlistener 对象(这是我的类)对吗?

稍后我将使用标题覆盖 actionPerformed 方法:-

 public void ActionPerformed(ActionEvent ae)
         {      : 
                :
                        }

我真的很困惑..我的书说“侦听器对象调用事件处理程序方法,事件作为参数”

监听对象:this

事件处理方法:ActionPerformed(ActionEvent ae)

argument:我的事件是 JButton b .. 它不是 EventAction 类型时怎么会?如果是这样,我们为什么要使用:

 ae.getActionCommand(); 

我认为这是一种告诉哪个组件触发事件的方法,为什么当组件作为参数传递时我们需要它呢?

【问题讨论】:

  • "this keyword will work as an anonymous actionlistener object(which is my class) right ?" -- 不,这不是匿名的 ActionListener。您正在让您的视图类实现接口,我们中的许多人都建议不要这样做。我们大多数人也建议不要扩展 JFrame。
  • 不,您的 JButton 不是“事件”,而是源。这里的参数是一个由 Swing 创建的 ActionEvent 对象,它将对激活按钮的引用放入 ActionEvent 的源属性(通过调用 getSource() 获得)
  • 这是我们从学期开始就使用的方式
  • 我是一名学生 ..swing 对我来说是一个新概念。我们使用的编码方式使其变得更加复杂 ..我得到了满分,但仍然无法理解 GUI 的基础知识..你能推荐一些教程之类的吗
  • “你能推荐一些教程什么的吗”,是的,official one。我认为您对什么是动作和how to use them 感到困惑

标签: java swing actionlistener


【解决方案1】:

这个关键字将作为一个匿名的 actionlistener 对象(这是我的类)对吗?

不,这将是一个实现 actionsListener 的类的对象。在您的情况下,它是“MyWindow”。

我的事件是 JButton b .. 当它不是 EventAction 类型时怎么会?如果是这样,我们为什么要使用:

JButton b 是一个组件而不是一个事件。事件描述了源状态的变化。当用户与 GUI 交互时,会生成诸如单击按钮、移动鼠标​​等事件。

来自点击here的参考

事件处理是一种控制事件并决定如果事件发生时应该发生什么的机制。

事件处理涉及的步骤:-

  1. 用户点击按钮,产生事件。

  2. 现在自动创建相关事件类的对象,并且在同一对象中填充有关源和事件的信息。

  3. 事件对象被转发到注册监听类的方法。

  4. 方法现在被执行并返回。

我认为这是一种告诉哪个组件触发事件的方法,为什么当组件作为参数传递时我们需要它呢?

现在您应该明白了,可能有许多按钮注册到同一个 ActionsListerner。现在要针对不同的事件执行不同的操作, e.getActionCommand() 很方便,它会告诉你哪个按钮是触发事件的来源。 希望这会有所帮助。

我试图给你一个简单的 JButton 程序的例子。

    import javax.swing.*;       
    import java.awt.*;
    import java.awt.event.*;

    public class ButtonSwing {
        private int numClicks = 0;

        public Component createComponents() {
            //Method for creating the GUI componenets
            final JLabel label = new JLabel("Clicks: " + "0"); //final so that i can access inside inner class
            JButton button = new JButton("Simple Button");
            button.addActionListener(
            //inner class for ActionListener. This is how generally it is done.     
            new ActionListener() {
                           public void actionPerformed(ActionEvent e) {
                               numClicks++;
                               label.setText("Clicks: " + numClicks);
                   System.out.println(e.getActionCommand());
                   System.out.println(e.getModifiers());
                   System.out.println(e.paramString());
             }
            }
           );
            JPanel pane = new JPanel();   //using JPanel as conatiner first.
            pane.setLayout(new FlowLayout());
            pane.add(button);  // adding button to the JPanel.
            pane.add(label);   // adding label to the JPanel.
            return pane;
        }

        public static void main(String[] args) {
            JFrame frame = new JFrame("SwingApplication");
            ButtonSwing obj = new ButtonSwing();
            Component contents = obj.createComponents();
            frame.getContentPane().add(contents);
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            frame.pack();  //It will cause the window to be sized to fit the preferred size 
                            //and layouts of its subcomponents. 
            frame.setVisible(true);
        }
    }   

【讨论】:

  • 很高兴知道。如果你觉得这个答案很好。您可以将其标记为已接受。有检查标记它。点击后会变成绿色。谢谢!
【解决方案2】:

您的 JButton 是一个组件而不是一个事件。在这种情况下,事件是由组件上的某些操作生成的。当您单击按钮时,将触发 ActionEvent 并将其传递给订阅该事件的所有侦听器,在这种情况下,它是您的 MyWindow 对象,用作 ActionListener

【讨论】:

  • 很好,但是 ActionEvent 是如何被触发的?它来自哪里。是因为我们的 ActionListener 对象将调用以 ActionEvent 对象作为参数的 actionperformed 方法吗? ae 只是我们事件处理方法(actionperformed)中使用的局部变量。
  • 动作事件由JButton生成。它内部的 UI 代码知道它什么时候被点击,然后会触发一个 ActionEvent 并调用所有注册的 ActionListener 的 actionPerformed
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 2021-07-02
  • 2013-12-17
  • 1970-01-01
  • 2013-12-24
  • 2021-09-16
  • 1970-01-01
  • 2022-10-24
相关资源
最近更新 更多