JButton如何调用actionPerformed方法?线程与运行疑问
一、actionPerformed方法的调用机制与执行线程
- 当你点击JButton时,操作系统会捕捉到鼠标点击事件,将其转换为Swing的
ActionEvent对象,放入**事件调度线程(Event Dispatch Thread,EDT)**管理的事件队列中。 - EDT是Swing专门用于处理UI事件、更新UI的核心线程,它会持续从事件队列中取出事件并处理。针对按钮点击事件,EDT会遍历该按钮注册的所有
ActionListener实例,依次调用它们的actionPerformed方法。 - 你的
actionPerformed方法就是在EDT线程中执行的。注意:EDT不能处理耗时操作(比如IO读写、长时间循环计算),否则会导致UI卡顿——因为EDT被占用后,无法响应后续的UI事件和界面更新请求。
二、窗口关闭后程序仍运行的原因与解决办法
- 默认情况下,JFrame的关闭行为是
HIDE_ON_CLOSE,也就是仅隐藏窗口,但EDT的事件循环仍在运行,JVM不会主动退出,所以控制台会显示程序还在运行。 - 解决这个问题只需在
SampleFrame的构造函数中添加一行代码,修改窗口的默认关闭行为:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个设置会让你点击窗口关闭按钮时,直接终止JVM,彻底结束整个程序。另外也可以使用DISPOSE_ON_CLOSE,它会销毁当前窗口,当所有可显示的窗口都被销毁时,EDT会自动终止,JVM也会退出,但EXIT_ON_CLOSE是最直接的终止方式。
修改后的完整代码示例
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class SampleFrame extends JFrame implements ActionListener{ SampleFrame() { JButton button = new JButton("Hello"); add(button); button.addActionListener(this); // 设置窗口关闭时终止程序 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Hello"); } public static void main(String[] args) { new SampleFrame().setVisible(true); } }
内容的提问来源于stack exchange,提问作者Umang Lunia
相关产品推荐
相关产品推荐

