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