java – 当我点击一个不相关的按钮时,为什么我的键绑定无法工作?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 当我点击一个不相关的按钮时,为什么我的键绑定无法工作?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3298字,纯文字阅读大概需要5分钟。
内容图文
![java – 当我点击一个不相关的按钮时,为什么我的键绑定无法工作?](/upload/InfoBanner/zyjiaocheng/725/65c7375c16d3488bbff65c251d7b3c08.jpg)
我创建了一个简单的演示.如果在mainPanel上触发特定键Stroke事件,将显示消息“a is typed”.但是,按下主面板下面的按钮后它不起作用.
这是KeybindingTest类及其内部类:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class KeybindingTest {
private JFrame frame;
private MainPanel mainPanel;
private ButtonPanel buttonPanel;
public static void main(String[] args) {
KeybindingTest test = new KeybindingTest();
test.createUI();
}
public void createUI(){
frame = new JFrame("Keybing Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainPanel = new MainPanel();
buttonPanel = new ButtonPanel();
frame.add(mainPanel,BorderLayout.CENTER);
frame.add(buttonPanel,BorderLayout.SOUTH);
KeybindingListener.getInstance().keybinding(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@SuppressWarnings("serial")
class MainPanel extends JPanel{
@Override
public Dimension getPreferredSize() {
// TODO Auto-generated method stub
return new Dimension(400, 300);
}
}
@SuppressWarnings("serial")
class ButtonPanel extends JPanel{
public ButtonPanel(){
setBackground(Color.green);
JButton enableButton = new JButton("enable");
enableButton.addActionListener(new EnableButtonListener());
JButton disableButton = new JButton("disable");
disableButton.addActionListener(new DisableButtonListener());
add(enableButton);
add(disableButton);
}
}
class EnableButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("enabled");
}
}
class DisableButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("disabled");
}
}
}
这是KeybindingListener类及其内部类:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class KeybindingListener {
private static KeybindingListener keybindingListener;
private final String mapKey = "a";
private KeybindingListener(){
//singleton
}
public static KeybindingListener getInstance(){
if (keybindingListener == null) {
keybindingListener = new KeybindingListener();
return keybindingListener;
}else {
return keybindingListener;
}
}
public void keybinding(JPanel mainPanel){
mainPanel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A , 0),mapKey);
mainPanel.getActionMap().put(mapKey, new keyAction());
}
@SuppressWarnings("serial")
class keyAction extends AbstractAction{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("a is typed");
}
}
}
提前谢谢你的帮助.
解决方法:
如this answer中所述,JComponent#getInputMap()是JComponent#getInputMap(WHEN_FOCUSED)的便捷方法.由于您要将键绑定添加到JPanel,这意味着您的面板必须具有正确工作的焦点,这是不可能的.
您可以将键绑定按原样添加到面板中的所有组件,也可以将键绑定添加到面板,如下所示:
public void keybinding(JPanel mainPanel){
mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A , 0),mapKey);
mainPanel.getActionMap().put(mapKey, new keyAction());
}
有关此问题的更好解释,请参阅How Key Bindings Work.
内容总结
以上是互联网集市为您收集整理的java – 当我点击一个不相关的按钮时,为什么我的键绑定无法工作?全部内容,希望文章能够帮你解决java – 当我点击一个不相关的按钮时,为什么我的键绑定无法工作?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。