QuitStrategy在eawt jdk 8中消失了

时间:2014-05-21 19:09:56

标签: java macos

我有一个应用程序,在退出时应关闭所有窗口并写入一些配置文件。

如果没有我在下面做的事情,以下内容从未被触发过,因此写出所有配置的closeEXES从未运行过。

    mainframe.addWindowListener(new java.awt.event.WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent winEvt) {
            closeEXES();
        }
    });

我使用以下内容在Mac OS上捕获Cmd-Q:

import com.apple.eawt.QuitStrategy;
import com.apple.eawt.Application;

主要是:

    if (System.getProperty("os.name").equals("Mac OS X")) {
        Application.getApplication().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS);

我之前的版本:

        public class MacQuitAdapter extends ApplicationAdapter {
            @Override
            public void handleQuit(ApplicationEvent e) {
                System.out.println("Using deprecated AplicationAdapter for handling Quit.");        
            }   
        }

我如何用JDK 8完成同样的事情? “同样的事情”是确保当命中Command-Q时,窗口的关闭将被传递给AWT,以便windowClosing方法可以做我想要的。

或者,是否还有一些其他听众需要感知Command-Q?我会继续寻找,但认为这里值得一试。

感谢。

1 个答案:

答案 0 :(得分:0)

我很抱歉回答我自己的问题。如果这是一个失礼,请告诉我。我used this加上仍保留代码的关闭窗口部分。对于JDK 8,这可以完成我想要的大部分工作。

所以现在代码看起来像这样:

    mainframe.addWindowListener(new java.awt.event.WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent winEvt) {
            closeEXES();
        }
    });

    if (System.getProperty("os.name").equals("Mac OS X"))
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("in : run () : shutdownHook");
                doCloses();
                System.out.println("Shutdown hook completed...");
            }
        });
    }

一个方法,closeEXES,提示用户确保他们真的要退出应用程序。另一个检查一个条件(文件是否在之前关闭?)并在它们尚未关闭时关闭它们。

为了完整性:

public void closeEXES() {
    int n = JOptionPane.showConfirmDialog(mainframe,
            "Close EXES GUI?", "Closing EXES GUI",
            JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
    if (n == 0) {
        System.out.println("Exiting...start");
        doCloses();
        System.exit(0);
    }
}

public void doCloses() {
    if ( beenClosed )
    {
        System.out.println("Already closed all files.");
    }
    else
    {
        // ... a bunch of stuff here writing GUI screen positions to a file and
        // things like that ...

        beenClosed = true;
    }
}