gpt4 book ai didi

java - 在 OS X 上使用屏幕菜单栏时如何使菜单项加速键起作用

转载 作者:行者123 更新时间:2023-11-30 07:22:38 25 4
gpt4 key购买 nike

在 OS X 上,从主 JFrame 中删除 JMenuBar 并使用屏幕菜单栏是有意义的。

我的印象是,在 Apple JDK 的最新版本中,这是使用

Application.getApplication().setDefaultMenuBar( JMenuBar );

打电话。

使用此功能时,加速键似乎不再起作用。

以下程序说明了 OS X 上的问题:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.apple.eawt.Application;

public class MacMenuBarShortcutTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
showUI();
}
});
}

private static void showUI(){
JFrame testFrame = new JFrame("TestFrame");

JLabel content = new JLabel("Press cmd-t to test whether the action is triggered");
testFrame.getContentPane().add(content);

JMenuBar menuBar = new JMenuBar();

Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "It works!");
}
};
action.putValue(Action.NAME, "Test action");
action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
JMenu menu = new JMenu("Menu");
menu.add(new JMenuItem(action));
menuBar.add(menu);

Application.getApplication().setDefaultMenuBar(menuBar);

testFrame.setVisible(true);
testFrame.pack();
testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}

该程序应允许您按 cmd+t,然后会弹出一个对话框,确认该操作的快捷方式有效。

但是这不起作用。按快捷键时菜单项会突出显示,但操作不会执行。

我在 com.apple.eawt.Application 类上没有找到任何我忘记调用的相关方法。查看 rather outdated article on the Apple website 中的代码建议快捷方式应该可以工作。

使用时请注意

System.setProperty("apple.laf.useScreenMenuBar", "true")

它按预期工作,而不是 Application#setDefaultMenuBar 方法。这是否意味着系统属性仍然是推荐的方式,并且我不应该在 Application 类上使用该方法?

最佳答案

我混合了两种不同的东西:

系统属性

System.setProperty("apple.laf.useScreenMenuBar", "true")

确定 Aqua 外观和感觉是否使用顶级窗口的菜单栏(例如 JFrame )作为应用程序菜单栏。

将其设置为 true将确保当您调用时,例如

JFrame frame = ...;
JMenuBar menu = ...;
frame.setJMenuBar(menu);

当框架具有焦点时,菜单栏将用作应用程序菜单栏,并且菜单栏永远不会被绘制为 JFrame 的一部分。当另一个框架(或顶级组件)获得焦点时,应用程序菜单栏将更新以显示该组件的菜单栏。

例如,当您使用 JOptionPane.showXXX 之一显示模式对话框时方法,应用程序菜单栏将尝试显示该模式对话框的菜单栏。因为这是null ,只要该模式对话框未关闭,应用程序菜单栏就会变空。

这就是 Application.setDefaultMenuBar 的位置方法就发挥作用了。如果您使用非 null 调用此方法菜单栏,当没有菜单栏的顶级组件获得焦点时,该菜单栏将显示为应用程序菜单栏。

因此,问题中的代码片段有两个问题:

  • 它不会将系统属性设置为 true
  • 它只设置了默认的菜单栏,忘记在 JFrame 上设置菜单栏。因为JFrame本身没有菜单栏,显示默认菜单栏,给人的印象是 setDefaultMenuBar方法是系统属性的替代方法。但事实显然并非如此。

结果是快捷方式不起作用,因为 JMenuBar不包含在JFrame中.

关于java - 在 OS X 上使用屏幕菜单栏时如何使菜单项加速键起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37297645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com