Java 无法将操作侦听器添加到JButton

Java 无法将操作侦听器添加到JButton,java,swing,compiler-errors,jframe,jbutton,Java,Swing,Compiler Errors,Jframe,Jbutton,我已经有几年没有接触Java了,现在我回来了,尝试制作一个GUI来测试JFrame。我正在尝试创建一个JButton,单击该按钮时将关闭程序。对于当前代码,我收到错误“javax.swing.AbstractButton类型中的addActionListener(java.awt.event.ActionListener)方法不适用于参数(new ActionListener(){})”。我发现的其他问题涉及多个类或其他对我的问题没有帮助的问题。任何解决方案或替代方案都将不胜感激 import

我已经有几年没有接触Java了,现在我回来了,尝试制作一个GUI来测试JFrame。我正在尝试创建一个JButton,单击该按钮时将关闭程序。对于当前代码,我收到错误
“javax.swing.AbstractButton类型中的addActionListener(java.awt.event.ActionListener)方法不适用于参数(new ActionListener(){})”
。我发现的其他问题涉及多个类或其他对我的问题没有帮助的问题。任何解决方案或替代方案都将不胜感激

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

public class testFrame
{
  public static void main(String args[])
  {
    long base = System.currentTimeMillis();

    JFrame frame = new JFrame("Test Window");
    frame.setLocationRelativeTo(null);
    frame.setUndecorated(true);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);

    JLabel label = new JLabel();
    JLabel label2 = new JLabel("How Long Have I Been Running?");
    JButton button = new JButton("EXIT");
    button.addActionListener(new ActionListener(){
       public void actionPerformed (ActionEvent e) {
          JFrame.dispose();
       }
    });
    Box box = Box.createVerticalBox();
    box.add(label2);
    box.add(label);
    box.add(button);
    label2.setAlignmentX(Component.CENTER_ALIGNMENT);
    label.setAlignmentX(Component.CENTER_ALIGNMENT);
    button.setAlignmentX(Component.CENTER_ALIGNMENT);
    frame.getContentPane().add(box, BorderLayout.CENTER);

    while(true)
    {

       long input = System.currentTimeMillis();
       label.setText(Long.toString(input - base));
    }
  }
}

为了让你的节目继续进行,我做了一些改变

  • 始终在上构建Swing程序

  • 偶尔用秋千让事情发生一次;直接运行循环只会使房间更热

  • 使用
    JFrame.EXIT_ON_CLOSE
    作为默认关闭操作,并从退出按钮发送
    窗口关闭事件

  • 在添加组件和框架后调用
    setVisible()


ActionListener
ActionEvent
添加导入后,我看到一个编译错误,大意是
dispose()
不能从静态上下文中使用..1)
而(true)
这将阻止EDT。而是使用Swing
计时器来调用循环中的代码。2) 
frame.setVisible(true)应最后完成。3) 请学习常见的Java命名法(命名约定-例如,
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是一个
大写常量
),并始终如一地使用它。@Andrew Thompson您添加了什么导入?我的印象是
ActionListener
ActionEvent
都包含在
javax.swing.*
中。另外,我确信还有很多其他的问题,我现在正试图解决这个问题。“你添加了什么导入?”这个问题可以通过查看Java文档轻松发现,在编码时,你应该可以轻松访问并经常使用这些文档。因此,这不是一个帮助台或辅导网站,以防你弄错了。@AndrewThompson感谢你快速而有见地的回答。如果您认为我的问题不适合您,请报告或不回答;没有必要粗鲁无礼。我只是在努力学习。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class TestFrame {

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test Window");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                //frame.setUndecorated(true);
                //frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                Box box = Box.createVerticalBox();
                JLabel time = new JLabel("0");
                time.setAlignmentX(Component.CENTER_ALIGNMENT);
                JLabel label = new JLabel("How Long Have I Been Running?");
                label.setAlignmentX(Component.CENTER_ALIGNMENT);
                JButton button = new JButton("EXIT");
                button.setAlignmentX(Component.CENTER_ALIGNMENT);
                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frame.dispatchEvent(new WindowEvent(
                            frame, WindowEvent.WINDOW_CLOSING));
                    }
                });
                box.add(label);
                box.add(time);
                box.add(button);
                frame.add(box, BorderLayout.CENTER);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                long base = System.currentTimeMillis();
                Timer timer = new Timer(100, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        long input = System.currentTimeMillis();
                        time.setText(Long.toString(input - base));
                    }
                });
                timer.start();
            }
        });
    }
}