用Java创建一个屏外帧(或者:当所有应用程序窗口关闭时,如何避免Mac上的空白菜单)?

6 java macos hidden window menu

我正在制作Mac应用程序,我希望我的菜单栏看起来正确.

任何Mac用户都知道菜单栏应该在顶部屏幕菜单中.在属性列表文件中设置apple.laf.useScreenMenuBartrue删除框内菜单栏并将当前聚焦窗口的菜单栏移动到屏幕菜单.

但是,当所有窗口都隐藏或没有窗口时,没有菜单栏移动到顶部,你只需要一个空白菜单.我听说解决这个问题的方法是创建一个在没有其他人的时候聚焦的屏幕外窗口.它的唯一目的是它的菜单,以便当其他菜单消失时它可以填写.

但是,我遇到了很多问题.我似乎无法将窗口移出屏幕,因为Macs不允许您将坐标设置为超出屏幕大小的位置; 它只是将它切断并将其定位在边缘.制作屏幕外窗口还有什么我需要做的吗?

tra*_*god 4

您绝对应该考虑 WizardOfOdds 非常有用的答案。正确使用“应用程序菜单”将会有所帮助,并且很容易设置一个最小的Info.plist开始。持久File菜单将允许您的应用程序在其他窗口关闭时打开一个新窗口。这个答案链接到一个简单的例子

尽管 Apple 的人机界面指南是了解用户期望的出色指南,但您当然可以尝试您在问题中建议的方法。特别是,你可以尝试setLocation(Short.MIN_VALUE, Short.MIN_VALUE)一下隐形窗户。此外,WindowEvent如果 a 发出最后一个可见窗口关闭的信号,您可能希望以某种特殊方式对其进行响应。

附录:当您的侦听器看到最后一个可见窗口关闭时,创建一个新的空应用程序窗口。或者,将不可见的窗口移动到屏幕上并使其可见,直到用户决定如何继续。

附录:Mac OS X 有助于防止可见窗口窗体移出屏幕,但很容易将不可见窗口置于困境中,如下所示。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

public class FrameTest extends JFrame {

    private static FrameTest marco;
    private static FrameTest polo;

    private static class MyPanel extends JPanel {

        public MyPanel() {
            super(true);
            final JToggleButton b = new JToggleButton("Test");
            b.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (b.isSelected()) {
                        polo.setLocation(100, 100);
                        polo.setVisible(true);
                    }
                    else {
                        polo.setVisible(false);
                        polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
                    }
                }
            });
            this.add(b);
        }
    }

    public FrameTest(String title) {
        super(title);
        this.setLayout(new BorderLayout());
        this.add(new MyPanel());
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                marco = new FrameTest("Marco");
                marco.setLocationRelativeTo(null);
                marco.setVisible(true);
                polo = new FrameTest("Polo");
                polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)