java - Java Swing 中上下文相关的键盘绑定(bind)

标签 java swing keyboard-shortcuts shortcut

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

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

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

我已经为这个选项卡定义了键绑定(bind):

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 上发生的操作依赖于当前聚焦的组件?

最佳答案

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

关于java - Java Swing 中上下文相关的键盘绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342033/

相关文章:

c# - 如何创建非窗口绑定(bind)的键盘快捷键

html - intellij通过选择器跳转到html元素

java - 解析日期显示错误日期

java - 想要创建一个接受鼠标输入的框架并实现drawLines()

Java 滚动面板/JPanel

java - 如何从多个类更新 GUI?

c++ - 如何在 C/C++ 程序中使用键盘的特殊键,例如 Command、Shift、Alt、Tab 或功能键?

java - Spring Boot JPA如何处理子表更新

java - Clojure 中 -toString 与 .toString 的区别

java - 有些手机需要 READ_CONTACTS 权限才能从联系人选择器中读取