如何从JPanel关闭基于动作事件的JavaJFrame

如何从JPanel关闭基于动作事件的JavaJFrame,java,swing,Java,Swing,如何根据ActionEvent从JPanel内的按钮点击关闭JFrame 我一共有三节课: Application:包含main方法,并通过创建FrameStartUp对象来运行程序 FrameStartUp:扩展JFrame类并显示StartUpPanel中的内容 StartUpPanel:扩展了JPanel类,并具有所有组件和ActionEvents 在StartUpPanel类中,我有一个按钮,上面有一个ActionEventListener等待单击按钮 单击按钮时,我希望应用程序完全

如何根据
ActionEvent
JPanel
内的按钮点击关闭
JFrame

我一共有三节课:

  • Application
    :包含main方法,并通过创建
    FrameStartUp
    对象来运行程序
  • FrameStartUp
    :扩展
    JFrame
    类并显示
    StartUpPanel
    中的内容
  • StartUpPanel
    :扩展了
    JPanel
    类,并具有所有组件和
    ActionEvents
StartUpPanel
类中,我有一个按钮,上面有一个
ActionEventListener
等待单击按钮

单击按钮时,我希望应用程序完全关闭。我知道
JFrame
类有一个名为
.dispose()
的方法,但我不能使用它,因为创建
FrameStartUp
的对象只会运行另一个GUI(由构造函数运行)

由于我是编程和swing新手,除了摆脱
StartUpPanel
并在
FrameStartUp
类中创建一个
JPanel
之外,我不知道还有什么其他方法可以解决这个问题

Swing是否提供了任何方法,可以访问面板打开的当前
JFrame
,以便在触发
ActionEvent
时关闭程序

我知道对于
JFrame
类有一个名为
.dispose()
的方法

如果显式设置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),这将起作用

Swing是否提供了任何方法可以访问面板上当前的
JFrame

是的
SwingUtilities
提供了一个名为
GetWindow祖先()
的工具

按钮。addActionListener(e->{
SwingUtilities.getWindow祖先((组件)e.getSource()).dispose();
});
。。。或者更常见的是,您可以选择引用
final
变量以实现相同的效果

final JFrame swingStuff=this;//或者通过getter/setter公开
按钮。addActionListener(e->{
swingStuff.dispose();
}); 
。。。然而,
final
变量布局和setter/getter需要一个小的可复制代码示例

最后,正如其他人所提到的,
System.exit(0)
也可以非常好地工作,只要它不破坏任何其他组件的生命周期

我的测试班:

import javax.swing.*;
导入java.awt.*;
公共类SwingStuff扩展JFrame{
//我们的主框架
公共SwingStuff(){
超级();
//按钮
JButton按钮=新JButton(“关闭”);
按钮。addActionListener(e->{
SwingUtilities.getWindow祖先((组件)e.getSource()).dispose();
});
//JPanel和嵌套组件
JPanel startupPanel=新的JPanel();
startupPanel.add(添加)按钮;
添加(启动面板);
包装();
//确保应用程序在关闭时退出
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//只是我们的切入点
公共静态void main(字符串…参数){
SwingUtilities.invokeLater(()->{
新SwingStuff().setVisible(true);
});
}
}

See(bad),它创建了一个糟糕的用户体验,您的任务栏可能会被多个窗口填满,并使您的用户感到困惑。您可以使用
JPanels
对话框
,也可以使用。为了获得更好的帮助,请尽快发布适当的
系统。退出(0)谢谢,这帮了大忙。