我有一个java swing应用程序,它有一个processWindowEvent方法。 下面是摘录
/models
现在我在Windows中启动了swing应用程序。
但现在如果在mac中完成相同的步骤。
我想知道当从任务栏(停靠栏)关闭java swing应用程序时,将在mac中调用的默认方法是什么
答案 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