我有以下问题:我希望java中的swing窗口能够以编程方式显示和关闭。但是,当框架关闭时,我不想退出应用程序,只要其他窗口仍然打开。
据我所知,这是dispose()
方法的意图。一旦所有窗口都被处理掉并且没有线程正在运行,应用程序就应该退出。
但是我的问题是我的应用根本没有退出。在进一步调查中,我写了一个MWE,并得到了同样的行为。我几乎100%肯定在很久以前,当我做类似的事情时,它按预期工作。
我是否需要编写自己的窗口管理器?!?这似乎很愚蠢,因为java应该已经拥有这样的功能。据我了解它应该有用的文档...我没有自己开始任何线程,我认为如果点击" X"或按钮。
你能指出我的问题吗?
package optimworkers.gui.config;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Test extends JFrame
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new Test();
}
});
}
public Test()
{
JButton but = new JButton("Test");
add(but);
but.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
setVisible(false);
dispose();
}
});
pack();
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}
修改
我使用Ubuntu Linux(Ubuntu 14.04 LTS是正确的)。我尝试使用OpenJDK 1.7.0_101和1.8.0_91(都来自ubuntu存储库)。
我打算将java用于这个特殊项目,因为JVM允许编写可移植代码。因此,如果它不是JRE中的真正错误,我必须/ shouold确保,应用关闭并发出System.exit(0);
电话。然而,人们认为这是不好的做法。我试图不惜一切代价避免这样做。
答案 0 :(得分:-2)
为了处理当前的类(表单)并打开另一个类,您可以使用以下代码。要退出您的应用程序,请使用System.exit(0)
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
try {
dispose();
new YOURCLASSTOBEOPENED().setVisible(true);
} catch (ClassNotFoundException ex) {
Logger.getLogger(YOURCURRENTCLASS.class.getName()).log(Level.SEVERE, null, ex);
}
}
});