【问题标题】:JButton ActionListener not respondingJButton ActionListener 没有响应
【发布时间】:2015-06-18 22:54:27
【问题描述】:

我在网上其他任何地方都找不到答案,所以我来到了这里。如果我的代码中的错误非常明显,我提前道歉;我对 java swing 还是很陌生。这是发生了什么:我创建了一个名为toggleElevators 的JButton,我希望它在单击时更改文本。我已经创建了一个 ActionListener 并将其添加到 toggleElevators。我现在只想让 JButton 在单击时将文本从 Click me 更改为 Clicked

首先,这是 JFrame 在执行时的样子:

注意:还有第三类,但它纯粹用于绘制左边的图片。它与 GridLayout 或 JButton 无关。

Run 类(创建框架并添加toggleElevatorsJButton:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;

import javax.swing.JFrame;

public class Run extends Input{

Input i = new Input();

public static void main(String[] args) {
    new Run();
}

public Run() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new JFrame("Elevators");
            frame.setLayout(new GridLayout(0, 3));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new Elevators(Color.MAGENTA, true));
            frame.add(new Elevators(Color.ORANGE, false));
            frame.setSize(800,600);
            frame.setResizable(false);

            frame.getContentPane().add(toggleElevators); //adds toggleElevators button to JFrame
            i.addButtonListeners(); //calls method defined in Input class, which adds the ActionListener to the toggleElevators button

            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

}

Input 类(创建toggleElevators JButton 及其ActionListener):

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class Input {
JButton toggleElevators = new JButton("Click me.");

public void addButtonListeners() {
    toggleElevators.addActionListener(new toggleElevatorsListener());
}

class toggleElevatorsListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        toggleElevators.setText("Clicked.");
        System.out.println("ActionListener called."); //I know the ActionListener is not being called because this line is not being printed out in the console
    }
}
}

【问题讨论】:

  • 你为什么要把事情复杂化?为什么不直接在JButton 中添加ActionListener
  • @NabeelOmer 这是导致问题的原因吗?为 ActionListener 创建了一个内部类?我不认为那会做任何事情。
  • 我现在不在电脑附近(见鬼,这里是凌晨 4 点),但是您通过为 ActionListener 创建单独的类来使事情复杂化,尝试将其添加到 JButton直接地。还有
  • 我认为这就是为什么匿名类或 lambda 函数适用于 ¿?

标签: java swing jbutton


【解决方案1】:

您的 Run 类扩展了 Input,但也有一个名为 i 的 Input。您正在将 this.toggleElevators 添加到框架中,但您正在将侦听器添加到 i.toggleElevators

从您的班级中删除 i 字段。我也会完全忘记定义和扩展 Input 类。它没有任何用途,而且似乎比帮助你更令人困惑。

【讨论】:

  • 谢谢。我完全忘记了我的代码基本上是指toggleElevators 按钮的独立实例。我听从了您的建议并删除了 i 对象,这很有效。再次感谢您的宝贵时间!
【解决方案2】:

您在Run 类中创建了一个新的Input,而Run 类也扩展了Input

当您调用 i.addButtonListeners(); 时,动作侦听器会从 i 添加到 toggleElevators,而不是从 Input 类继承的 toggleElevators

试试addButtonListeners()

【讨论】:

  • 只是我自己想出来的。无论如何感谢您的宝贵时间!
【解决方案3】:

您的 Run 类扩展了 Input。因此它有自己的toggleElevators,这是它在框架中设置的那个。但是,i 拥有自己的 toggleElevators,它在其中设置事件侦听器。因此,它们不是设置在框架中的那个上,而是设置在永远不会被使用的那个上。

您可以简单地删除i 对象。由于Run扩展了Input,所以可以直接调用该方法,然后监听器会添加到自己的toggleElevators中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 2012-07-16
    • 2013-01-07
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多