使用 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 隐藏时退出行为的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Multiplatform:共享多个目标(iOS、macOS)的实际类实现

如何实现类似MacOS(EN Intl)的德国变音符行为?

macos系统实现用ffmpeg录制屏幕和录制声音命令

使用CSS+HTML实现macOS红绿灯应用标题栏

使用CSS+HTML实现macOS红绿灯应用标题栏

macOS 催化剂上钥匙串项目的 PersistentRef