Java Swing中依赖于上下文的键盘绑定

时间:2011-03-17 16:24:50

标签: java swing keyboard-shortcuts shortcut

我的应用程序左侧有一个树形控件,右侧有许多表单,标签等。当用户按 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 上发生的操作取决于当前关注的组件?

1 个答案:

答案 0 :(得分:0)

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);
    }
}