无法将动作侦听器添加到 JButton

Unable to Add an Action Listener to JButton

几年没碰过 Java 现在我回来了,试图制作一个 GUI 来测试 JFrame。我正在尝试创建一个 JButton,它会在单击时关闭程序。使用当前代码,我收到错误 "The method addActionListener(java.awt.event.ActionListener) in the type javax.swing.AbstractButton is not applicable for the arguments (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));
    }
  }
}

我改变了一些东西来让你的程序运行。

  • 始终在 event dispatch thread.

  • 上构建 Swing 程序
  • 使用 Swing Timer 时不时地做些事情; 运行 一个完整的循环只会让房间更热。

  • 使用 JFrame.EXIT_ON_CLOSE 作为默认关闭操作,并从您的 EXIT 按钮发送一个 WINDOW_CLOSING 事件。

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

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();
            }
        });
    }
}