Java 在秋千中找不到jtoolbar的快捷键?

Java 在秋千中找不到jtoolbar的快捷键?,java,swing,Java,Swing,我没有任何关于代码的线索,任何帮助都将不胜感激 我正在上传一张需求图片,您可以看到,对于特定的工具栏,我想实现所有可用的快捷键,但我不知道从哪里开始,首先想到:“这很简单,RTFT”,吐出第一个代码片段: Action action = new AbstractAction("clear text") { @Override public void actionPerformed(ActionEvent e) { System.o

我没有任何关于代码的线索,任何帮助都将不胜感激

我正在上传一张需求图片,您可以看到,对于特定的工具栏,我想实现所有可用的快捷键,但我不知道从哪里开始,首先想到:“这很简单,RTFT”,吐出第一个代码片段:

    Action action = new AbstractAction("clear text") {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("triggered the action");
        }

    };
    action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F1"));

    JToolBar bar = new JToolBar();
    bar.add(action);
    // set toolbar to frame and be happy
猜猜按F1会发生什么。。。对,没什么

事实证明,工具栏中的按钮与菜单中的按钮不同,默认情况下不支持快捷键。这对我(其他人?)来说是出乎意料的,可能有几个原因

  • 这是摇摆队的疏忽
  • 本机应用程序也不支持它们
第二种情况很可能是典型的情况,工具栏按钮类似于“双”菜单项:在这种情况下,加速器设置在菜单项上(如果所有设置都正确,并且两者使用相同的操作),它会自动神奇地触发

现在的问题是,OP的应用程序中是否也有菜单/栏。完整的答案取决于:如果是这样,只需使用与上述相同的操作即可

    menu.add(action);
如果它真的是一个独立的工具栏,而不是由菜单支持,则需要做更多的工作,基本上就是显式地将键绑定添加到添加到工具栏的按钮上,类似于:

    JToolBar bar = new JToolBar();
    JButton toolBarButton = bar.add(action);
    toolBarButton.getActionMap().put("myAction", action);
    toolBarButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
            (KeyStroke) action.getValue(Action.ACCELERATOR_KEY), "myAction");
如果这是许多按钮给定上下文的标准要求,则子类JToolBar将覆盖add(Action)方法,并在调用super后在那里执行该操作:

    public class JXToolBar extends JToolBar {

         public JButton add(Action action) {
              JButton button = super.add(action);
              KeyStroke stroke = (KeyStroke) action.getValue(Action.ACCELERATOR_KEY);
              if (stroke != null) {
                  // do the input/actionMap config here
              }
         }
    }

我投票决定结束这个问题。。。投票结束了这个问题,但是。。。这并不像我预期的那么简单-似乎无法撤销关闭,嗯。你承诺的图像在哪里?投票表决试图防止完全崩溃:-)我很想听到更多关于要求+1的细节,没有在按钮上显示加速器的视觉方式(不像JMenuItem),因此,我想不把它作为支持行为是有道理的。还同意该操作应与JMenuItem共享以获得此默认行为。@camickr很好-显示加速器的唯一方法是(手动配置)工具提示。这需要将鼠标移到它上面才能看到,因此它不是真正的视觉线索-但屏幕阅读器可能需要它。请记住AbstractButton提供了一个
configurePropertiesFromAction
方法,该方法最好覆盖以设置绑定(和工具提示?)。JMenuItem当前覆盖此方法以设置加速器。@kleopatra谢谢,它工作正常