【问题标题】:Using ActionListener in a different class在不同的类中使用 ActionListener
【发布时间】:2015-10-14 17:22:56
【问题描述】:

我在计算机科学课上有一个练习,我正在学习在 Java 小程序中使用动作侦听器。虽然我有点困惑,可以做一些帮助!这是我必须执行的练习:

“为三个按钮提供一个按钮处理程序类。构造函数应将小程序的引用和大小的适当整数值作为其参数。将 addActionListener 调用添加到 init 方法(即每个都应创建一个新的专用于特定按钮的处理程序对象)。编译并运行您的小程序。”

Iv 创建了一个按钮处理程序类并创建了构造函数(我认为我做得正确)。我的主要问题是“将 addActionListener 调用添加到 init 方法”部分。

这是我创建的 ButtonHandler 类:

      class ButtonHandler implements ActionListener {

        Square theApplet;

        ButtonHandler(Square app){
            theApplet = app;
        }
 }

之后我尝试在按钮处理程序必须调用的 init 方法中添加一个 addActionListener。

     butSmall.addActionListener(ButtonHandler());

但这给了我错误。谁能解释如何完成这个练习?谢谢。

【问题讨论】:

    标签: java swing applet


    【解决方案1】:

    我创建了一个按钮处理程序类并创建了构造函数(我认为我做得正确)。

    嗯,不,你做得不对。类声明它实现了ActionListener,但它实际上并没有提供ActionListener.actionPerformed(ActionEvent) 的实现。如果它是abstract,它可以侥幸逃脱,但事实并非如此。 (如果它抽象的,那么你将无法实例化它。)

    之后

    我对此表示怀疑。你提供的类不会编译,所以你没有通过那个类。

    我尝试在 init 方法中添加一个 addActionListener 按钮处理程序必须调用。

     butSmall.addActionListener(ButtonHandler());
    

    但这给了我错误。

    指定您收到的错误以及它们的来源(在这种情况下,即来自编译器)对您有利。如果编译器甚至尝试分析该行,它可能会抱怨您尝试调用的 ButtonHandler 构造函数不存在。您提供的一个构造函数需要Square 类型的参数,但您正在尝试调用不带参数的构造函数。

    任何可以解释如何完成的人 这个练习?

    如果您尝试从Squareinit() 方法中调用该构造函数,并且您想要传递对Square 的引用,而init() 方法正在执行调用,那么您可以使用关键字this 作为参数。然而,再一次,在你到达那个点之前,你需要修复ButtonHandler

    【讨论】:

      【解决方案2】:

      如果您查看ActionListener 接口的JavaDoc,您会发现它需要您实现一个方法void actionPerformed(ActionEvent e)。您的自定义 ButtonHandler 尚未实现该方法,因此它没有履行 ActionListener 接口提供的合同。

      像这样添加一个块:

      @Override
      public void actionPerformed(ActionEvent e) {
          //Do something here
      }
      

      到你的班级。

      请注意,在大多数情况下,像按钮的单击侦听器这样的小型 ActionListener 是作为匿名函数实现的。有一个很好的 "official" tutorial 关于如何编写 ActionListeners,请务必阅读!

      要实际实例化 ButtonHandler 的新实例,您需要 Java 关键字 new,例如 new ButtonHandler()

      【讨论】:

        【解决方案3】:

        只需创建一个实现 ActionListener 的类,特别是 actionPerformed(ActionEvent) 函数。如果您需要指定参数,请使用您希望的参数创建自定义构造函数。此外,您的 ButtonHandler 类不是静态的,因此您需要使用 new 对其进行初始化。

        查看下面的示例:

        它是一个以 JPanel 和 A JFrame 作为参数并将 JPanel 作为其内容窗格添加到 JFrame 的侦听器:

        public class OpenScreenListener implements ActionListener {
        
        private JPanel panel;
        private JFrame window;
        @Override
        public void actionPerformed(ActionEvent e) {
            window.setContentPane(panel);
            window.setVisible(true);
        }
        
        public OpenScreenListener(JPanel panel, JFrame window){
            this.screen = panel
            this.window = window;
        }
        

        }

        这就是我将它添加到按钮的方式:

        myButton.addActionListener(new OpenScreenListener(new JPanel("myJPanel"), myJframe));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-27
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多