JButton ActionListener没有响应

时间:2015-06-18 22:54:27

标签: java swing jbutton

我无法在网上找到答案,所以我来到这里。如果我的代码中的错误非常明显,我会提前道歉;我对java swing还是一个新手。这里发生了什么:我创建了一个名为toggleElevators的JButton,我希望它在点击时更改文本。我已经创建了一个ActionListener并将其添加到toggleElevators。我现在想要的是让JButton在点击Click meClicked时更改文字。

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

JFrame

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

Run类(创建框架并添加toggleElevators JButton:

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 class(创建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
    }
}
}

3 个答案:

答案 0 :(得分:1)

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

从班级中删除i字段。我也完全忘记了定义和扩展Input类。它没有任何目的,似乎比帮助你更加困惑。

答案 1 :(得分:0)

您在Input课程中创建了新的Run,而Run课程也扩展了Input

当您致电i.addButtonListeners();时,toggleElevators上的i添加了动作听众,而不是toggleElevators类继承的Input。< / p>

尝试addButtonListeners()

答案 2 :(得分:0)

您的Run课程延长了Input。因此它有自己的toggleElevators,它是在框架中设置的i。但是,toggleElevators具有自己的i,用于设置事件侦听器。所以他们没有设置在框架中的那个,而是放在一个永远不会被使用的框架上。

您只需删除Run对象即可。当Input扩展toggleElevators时,它可以直接调用该方法,然后将侦听器添加到自己的{{1}}。