我遇到以下问题:我正在开发一个向我显示 JFrame 的 Java Swing 应用程序。我要做的是,当用户单击 X 按钮时,窗口必须图标化而不是关闭(这是客户要求的要求)
我的架构非常复杂,它的工作方式如下:
我有一个名为 GUI 的类,如下所示:
public class GUI extends SingleFrameApplication implements PropertyChangeListener {
private MainFrame mainFrame = null;
@Override
public void propertyChange(PropertyChangeEvent arg0) {
showMainFrame();
}
private void showMainFrame() {
mainFrame = new MainFrame(settings, tasksSettings, logAppender);
// I add a PropertyChangeListener to the created MainFrame object:
mainFrame.addPropertyChangeListener(this);
//mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
logger.info("Minimize the MainFrameWindows instead close it");
((MainFrame)e.getSource()).setState(MainFrame.ICONIFIED);
logger.info("EVENTO ICONIZZAZIONE: " + e.getSource().toString());
}
});
WindowListener exitListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("GUI SingleFrameApplication --> windowClosing");
mainFrame.OnWindowClose();
shutdown();
// mainFrame.setVisible(false);
/*int confirm = JOptionPane.showOptionDialog(frame,
"Are You Sure to Close this Application?",
"Exit Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null);
if (confirm == JOptionPane.YES_OPTION) {
System.exit(1);
}*/
}
};
mainFrame.addWindowListener(exitListener);
mainFrame.setVisible(true);
}
@Override
protected void shutdown() {
System.out.println("Entered into GUI ---> shutdown()");
logger.debug("Termino l'applicazione.");
ulogger.info(com.techub.crystalice.utils.Constants.APP_TITLE + "|Arresto " + com.techub.crystalice.utils.Constants.APP_TITLE);
// FileUtils.saveGeneralLogFile(logAppender.getLogInFile());
logAppender.saveGeneralLogFile();
EventBusService.unsubscribe(this);
if (mainFrame != null)
mainFrame.setVisible(false);
}
}
因此,在前面的代码中,我声明了 showMainFrame() 方法,并在该方法中添加了一个窗口监听器,该监听器必须以这种方式图标化我的 MainFrame JFrame
mainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
logger.info("Minimize the MainFrameWindows instead close it");
((MainFrame)e.getSource()).setState(MainFrame.ICONIFIED);
logger.info("EVENTO ICONIZZAZIONE: " + e.getSource().toString());
}
});
然后我有我的 MainFrame 窗口,它扩展了经典的 JFrame,如下所示:
公共(public)类 MainFrame 扩展 JFrame {
private final ConfigHelper settings;
private final TasksSettings tasksSettings;
public MainFrame(ConfigHelper settings, TasksSettings tasksSettings, LogAppender logAppender) {
super();
this.settings = settings;
this.tasksSettings = tasksSettings;
.......................................................
.......................................................
.......................................................
DO SOME STUFF
.......................................................
.......................................................
.......................................................
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
问题是,当我单击 MainFrane 窗口的 X 按钮时,它将关闭并且不会图标化。
你能帮我解决这种情况吗?让 MainFrame 窗口图标化而不是关闭?
我认为问题是在执行结束时执行执行此操作的 shutDown() 方法:
if (mainFrame != null)
mainFrame.setVisible(false);
所以窗口没有图标化而是关闭\使其不可见
有什么想法吗?
Tnx
安德里亚
最佳答案
如果我理解正确,当您点击 X 按钮时,您需要在系统托盘中显示该应用程序的图标,这是真的吗?
在这种情况下,您对关闭事件的默认行为已经足够了(默认是在关闭时隐藏,如文档中所述)。
http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html
为了管理系统托盘图标,这里有一些提示:
http://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html
在系统托盘中,您将拥有隐藏或显示主窗口所需的代码(我不知道,但也许您在 JFrame 中根本不需要窗口监听器)
关于java - 在这种特定情况下,当用户单击 X 按钮时,JFrame 窗口会出现一些问题,有什么想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994473/