【问题标题】:Context dependent keyboard bindings in java Swingjava Swing中的上下文相关键盘绑定
【发布时间】:2011-03-17 16:24:49
【问题描述】:

我的应用程序左侧有一个树形控件,右侧有许多表单、选项卡等。当用户按下 Ctrl+F 时,左侧的树下会出现一个搜索面板,因此用户可以搜索树的内容。

这是通过菜单加速器完成的。

但是,当右侧打开某个选项卡时,我希望 Ctrl+F 在此选项卡中打开一个搜索面板,在该选项卡的内容中进行搜索标签。

我已经为这个标签定义了键绑定:

tab.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK), "showSearch");
tab.getActionMap().put("showSearch", showSearchAction);

showSearchAction 上面打开标签中的搜索面板。

这不起作用。即使选项卡获得焦点,Ctrl+F 仍然会打开树下的搜索面板。

如何使 Ctrl+F 上发生的操作依赖于当前聚焦的组件?

【问题讨论】:

    标签: java swing keyboard-shortcuts shortcut


    【解决方案1】:
    tab.getInputMap(WHEN_FOCUSED)...
    

    编辑:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    
    public class TabbedPaneBinding extends JFrame
    {
        public TabbedPaneBinding()
        {
            JMenuBar menuBar = new JMenuBar();
            setJMenuBar(menuBar);
            JMenu menu = new JMenu( "File" );
            menuBar.add( menu );
            JMenuItem menuItem = new JMenuItem("Search");
            menuItem.setAccelerator( KeyStroke.getKeyStroke("control F") );
            menu.add( menuItem );
    
            menuItem.addActionListener( new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("do Search");
                }
            });
    
            add(new JTextField(10), BorderLayout.NORTH);
    
            JTabbedPane tabbedPane = new JTabbedPane();
            tabbedPane.addTab("Text Field", new JTextField(10));
            tabbedPane.addTab("CheckBox", new JCheckBox());
            add(tabbedPane);
    
            AbstractAction action = new AbstractAction()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("tabbed pane Search");
                }
            };
    
            String keyStrokeAndKey = "control F";
            KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeAndKey);
    //      InputMap im = tabbedPane.getInputMap(JTabbedPane.WHEN_FOCUSED);
            InputMap im = tabbedPane.getInputMap(JTabbedPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            im.put(keyStroke, keyStrokeAndKey);
            tabbedPane.getActionMap().put(keyStrokeAndKey, action);
        }
    
        public static void main(String args[])
        {
            TabbedPaneBinding frame = new TabbedPaneBinding();
            frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
            frame.setSize(200, 150);
            frame.setLocationRelativeTo( null );
            frame.setVisible(true);
        }
    }
    

    【讨论】:

    • 不。仍会打开树搜索。
    • @Alla,在一个简单的 SSCCE 中对我来说效果很好。发布证明问题的 SSCCE。
    • 感谢 SSCCE,现在我明白了。问题是由调用 getInputMap(WHEN_ANCESTOR_OF_FOCUSED) 而不是 getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED) 引起的。改变这个解决了这个问题。它与菜单加速器无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2020-11-18
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多