我的应用程序在左侧有一个树形控件,在右侧有一些窗体、选项卡等。当用户按下 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/