【问题标题】:Java: How to check whether a JFrame's menu bar is displayed in the systems menubar or in the frame itself?Java:如何检查 JFrame 的菜单栏是显示在系统菜单栏中还是显示在框架本身中?
【发布时间】:2013-12-08 11:14:47
【问题描述】:

JFrame in (From Swing) 允许您设置菜单栏(MenuBar 的实例使用 JFrame.setMenuBar(mb);)。此菜单栏可能会出现在不同的位置,具体取决于它所运行的系统。如果运行应用程序的操作系统在屏幕顶部有一个菜单栏,则在JFrame 中设置的这个菜单栏通常会出现在这个菜单栏中。如果不支持,菜单栏将显示在框架本身的顶部。

您可以在下面的示例中看到不同系统上的不同行为:

这是我用来设置菜单栏的代码示例:

// Initialize a menu bar
MenuBar mb = new MenuBar();

// Initialize the menu and some menu items, add these to the menu bar
Menu m = new Menu("Menu 1");
MenuItem mi1 = new MenuItem("Menu Item 1");
MenuItem mi2 = new MenuItem("Menu Item 2");
MenuItem mi3 = new MenuItem("Menu Item 3");
m.add(mi1);
m.add(mi2);
m.addSeparator();
m.add(mi3);
mb.add(m);

// Set the menu bar
setMenuBar(mb);

我的问题是: 如何检查菜单栏是显示在框架本身还是系统的菜单栏中(如果支持)?如果有任何可能的方法可以在不初始化和定义菜单栏的情况下检查这一点,那就太好了。 也许这是不可能的,如果是这样,是否可以在定义菜单栏后检查同样的问题?

【问题讨论】:

    标签: java swing menu menubar


    【解决方案1】:

    here 所示,apple.laf.useScreenMenuBar 指定了一种 Mac OS 功能,该功能在 Mac 用户希望看到的屏幕顶部显示现有的JMenuBar。尽管它应该与您的应用程序无关,但只有在您将其放在那里时才会显示菜单栏。一个合适的跨平台谓词可能如下所示:

    if (System.getProperty("os.name").startsWith("Mac OS X")) {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        System.setProperty("apple.awt.graphics.UseQuartz", "true");
        // etc.
    }
    

    【讨论】:

    • 谢谢,这很好用。不过我有个问题,apple.awt.graphics.UseQuartz 是干什么用的?我看了一下这个页面:https://developer.apple.com/library/mac/documentation/java/conceptual/java14development/07-nativeplatformintegration/nativeplatformintegration.html 但我仍然不清楚。我将值都更改为truefalse,但我没有注意到菜单外观有任何不同。
    • 这只是另一个 Mac 特定属性的示例;它可能与您的应用程序无关。我用它来改进大点大小的字形渲染。
    • @TimVisee:另见Java Runtime System Properties
    • @trashgod 谢谢!这应该很有帮助。
    • @TimVisee:一段时间后,您可以通过点击左侧的empty check mark 来接受答案。
    【解决方案2】:

    是否可以在定义菜单栏后检查同样的问题?

    我只使用 windows,所以我不知道它在其他操作系统上是如何工作的。

    我认为在框架可见之前您无法找到此信息。那么你应该可以使用:

    Point location =  menuBar.getLocatonOnScreen();
    

    然后您可以将该位置与框架的位置进行比较,以查看它是否包含在框架的边界内。

    if (frame.getBounds().contains(location))
        ....
    

    问题是您为什么需要这些信息?也许我们可以建议一种替代方法。

    【讨论】:

    • 我喜欢你的思维方式,这会奏效,但在某些情况下可能会失败。例如,如果窗口位于 (0,0),则此方法将失败。我正在开发一个应用程序,其中包含自定义组件和许多特殊特性和功能。如果可用,我想使用系统的顶部菜单栏,如果不可用,我不希望显示此菜单,而是显示其他一些组件。这只是对我的问题的基本描述,但我认为这清楚地向您展示了我想要实现的目标。顺便说一句,我在我的问题中添加了示例图片。
    • +1 用于建议搜索替代方法;菜单栏的显示位置无关紧要;更多here.
    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多