mac中的processWindowEvent

时间:2017-04-11 05:10:51

标签: java windows macos swing jframe

我有一个java swing应用程序,它有一个processWindowEvent方法。 下面是摘录

/models

现在我在Windows中启动了swing应用程序。

  1. 在秋千UI中与十字架靠近。 ==>显示正确的错误消息
  2. 从任务栏关闭应用程序==>显示正确的错误消息
  3. 但现在如果在mac中完成相同的步骤。

    1. 在秋千UI中与十字架靠近。 ==>显示正确的错误消息
    2. 从任务栏关闭应用程序==>不会进入上面的方法。所以没有正确的信息。
    3. 我想知道当从任务栏(停靠栏)关闭java swing应用程序时,将在mac中调用的默认方法是什么

2 个答案:

答案 0 :(得分:2)

欢迎来到“Apple以不同方式做事”的精彩世界

基本上发生的事情是,当你“退出”程序时,Apple会调用System.exit(0),基本上与你使用的 CMD + Q

现在,Apple提供了一个API,它提供了一些功能,您可以使用它来配置您的应用程序与MacOS并执行一些Apple独有的功能,问题是,这是一个完全痛苦的代码...关于和使用的有用信息。

您正在寻找的是com.apple.eawt.ApplictionsetQuitStrategy。这默认为调用System.exit(0),但您可以将其更改为“关闭所有窗口”。

在这种情况下,它会让你捕获WindowEvent并做你想做的事情

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.out.println("Closing");
                        System.exit(0);
                    }
                });
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                try {
                    Class quitStrategies = Class.forName("com.apple.eawt.QuitStrategy");
                    Object quitStrategy = null;
                    for (Object o : quitStrategies.getEnumConstants()) {
                        if ("CLOSE_ALL_WINDOWS".equals(o.toString())) {
                            quitStrategy = o;
                        }
                    }
                    if (quitStrategy != null) {
                        Class appClass = Class.forName("com.apple.eawt.Application");
                        Class params[] = new Class[]{};

                        Method getApplication = appClass.getMethod("getApplication", params);
                        Object application = getApplication.invoke(appClass);
                        Method setQuitStrategy = application.getClass().getMethod("setQuitStrategy", quitStrategies);
                        setQuitStrategy.invoke(application, quitStrategy);
                    }

                } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {
    }
}

我的一般建议是,构建一个不错的“Mac”实用程序类,它封装了你想要使用的功能并调用它。

另外要注意,此功能可能会在将来的版本中突然消失。

应该注意的是,如果您打算使用“one for all”应用程序,则需要使用反射,因为标准API中不提供所需的API,但是如果您想创建“Apple”只有发布,您应该查看this以获取有关如何在MacOS上编译代码的更多信息,因为使用...

Application.getApplication().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS);

更容易编写和理解

答案 1 :(得分:1)

要捕获窗口关闭事件,您需要添加Select * from table1 where end_date < TO_DATE(current_date, 'YYYY-MM-DD HH24:MI:SS') 并覆盖方法WindowListener。使用此代码:

windowClosing