使用 JFrame/Swing 实现 macOS 隐藏时退出行为
Posted
技术标签:
【中文标题】使用 JFrame/Swing 实现 macOS 隐藏时退出行为【英文标题】:Implement macOS hide on quit behavior with JFrame/Swing 【发布时间】:2021-12-31 22:09:33 【问题描述】:我正在尝试在我的 Java JFrame 应用程序中实现“退出时图标化”行为,就像大多数原生 macOS 应用程序一样,但我很困惑。
我试过了
Window.addWindowListener(new WindowAdapter()
@Override
public void windowClosing(WindowEvent Event)
System.out.println("Closed on macOS, iconifiying");
Window.setExtendedState(Frame.ICONIFIED);
);
并在退出时关闭窗口(以及添加调用 setVisible(false) 的窗口侦听器)
Window.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
前者不起作用,因为它看起来已最小化并创建了 2 个单独的图标。后者没有,因为我找不到一种方法来检测何时单击停靠图标以取消隐藏窗口。如果我能弄清楚如何做到这一点,我更喜欢这种方法。有人知道怎么做吗?
【问题讨论】:
好吧,你知道吗,System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS");
仍然有效。更多详情请见***.com/questions/2061194/…
你也可以使用Desktop.getDesktop().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS);
,这可能更容易
哦,我忘了具体说明我试图模仿的行为是什么。当您在 macOS 上按下退出按钮时,该窗口将变为不可见。当您单击 Dock 中的应用程序图标时,该窗口应再次可见。
【参考方案1】:
哦,我忘了具体说明我要模仿的行为到底是什么。当您在 macOS 上按下退出按钮时,该窗口将变为不可见。当您单击 Dock 中的应用程序图标时,该窗口应再次可见。
你真的应该阅读JavaDocs,它和一点点谷歌搜索让我想到了这个简单的例子......
import java.awt.Desktop;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.desktop.AppReopenedEvent;
import java.awt.desktop.AppReopenedListener;
import java.awt.desktop.QuitStrategy;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Test
public static void main(String[] args)
new Test();
Desktop.getDesktop().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS);
public Test()
EventQueue.invokeLater(new Runnable()
@Override
public void run()
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Desktop.getDesktop().addAppEventListener(new AppReopenedListener()
@Override
public void appReopened(AppReopenedEvent e)
frame.setVisible(true);
);
);
public class TestPane extends JPanel
public TestPane()
setBorder(new EmptyBorder(32, 32, 32, 32));
setLayout(new GridBagLayout());
add(new JLabel("Now you see me"));
【讨论】:
以上是关于使用 JFrame/Swing 实现 macOS 隐藏时退出行为的主要内容,如果未能解决你的问题,请参考以下文章