Контекстно-зависимые привязки клавиатуры в Java Swing - PullRequest
2 голосов
/ 17 марта 2011

Мое приложение имеет дерево управления слева и ряд форм, вкладок и т. Д. Справа. Когда пользователь нажимает 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 голосов
/ 17 марта 2011
tab.getInputMap(WHEN_FOCUSED)...

Edit:

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