Java 无法将操作侦听器添加到JButton
我已经有几年没有接触Java了,现在我回来了,尝试制作一个GUI来测试JFrame。我正在尝试创建一个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
“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();
}
});
}
}