• java 图形化工具Swing 监听键盘输入字符触发动作getInputMap();getActionMap();


    双缓冲技术的介绍:

    所有的Swing组件默认启用双缓冲绘图技术。使用双缓冲技术能改进频繁重绘GUI组件的显示效果(避免闪烁现象)JComponent组件默认启用双缓冲,无须自己实现双缓冲。如果想关闭双缓冲,可以在组件上调用setDoubleBuffered(false)方法。同学们无需深究双缓冲技术原理是怎么实现的,就记住有这么个技术就好了。

    简单键盘驱动:

    所有的Swing组件都提供了简单的键盘驱动。JComponent类提供了getInputMap()和getActionMap()两个方法。
    其中
    getInputMap()返回一个InputMap对象,该对象用于将 KeyStroke对象(代表键盘或其他类似输入设备的一次输入事件)和名字关联;
    getActionMap() 返回一个ActionMap对象,该对象用于将指定名字和Action (Action接口是ActionListener接口的子接口,可作为一个事件监昕器使用)关联,从而可以允许用户通过键盘操作来替代鼠标驱动GUI上的Swing组件,相当于为GUI组件提供快捷键。
    示例代码:
    /**
    * 文本框输入内容绑定事件
    */
    jTextField.getInputMap().put(KeyStroke.getKeyStroke(' '),"send"); // 绑定获取到输入字符为 即回车键,对应别名为“send"
    jTextField.getActionMap().put("send",sendListener); //指定别名对应触发的监听器
    /**
    完整代码
    package swingtest;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.io.FileFilter;
    
    /**
     * @ClassName BindingKeyTest
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/5/8.
     */
    public class BindingKeyTest {
        public static void main(String[] args) {
            JFrame jFrame = new JFrame("测试键盘驱动");
            /**
             * 文本框
             */
            JTextArea jTextArea = new JTextArea(10,60);
            JScrollPane jScrollPane = new JScrollPane(jTextArea);
            jFrame.add(jScrollPane);
            /**
             * 输入框 和发送按钮
             */
            JTextField jTextField = new JTextField(50);
            JButton sendButton = new JButton("发送");
            JPanel bottomJPanel = new JPanel();
            bottomJPanel.add(jTextField);
            bottomJPanel.add(sendButton);
            jFrame.add(bottomJPanel, BorderLayout.SOUTH);
            /**
             * 发送按钮或者回车要绑定的事件
             */
            Action sendListener = new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    jTextArea.append(jTextField.getText() + "
    ");
                    jTextField.setText(null);
                }
            };
            //发送按钮绑定事件
            sendButton.addActionListener(sendListener);
            /**
             * 文本框输入内容绑定事件
             */
            jTextField.getInputMap().put(KeyStroke.getKeyStroke('
    '),"send"); // 绑定获取到输入字符为
    即回车键,对应别名为“send"
            jTextField.getActionMap().put("send",sendListener); //指定别名对应触发的监听器
            /**
             * jFrame位置、大小和关闭按钮设置
             */
            jFrame.setLocation(400,300);
            jFrame.pack();
            jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);;
            jFrame.setVisible(true);
        }
    }
  • 相关阅读:
    bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】
    bzoj 2055: 80人环游世界【有上下界有源汇最小费用最大流】
    bzoj 2406: 矩阵【二分+有源汇上下界可行流】
    bzoj 4873: [Shoi2017]寿司餐厅【最大权闭合子图】
    bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
    bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】
    bzoj 3996: [TJOI2015]线性代数【最小割】
    bzoj 3158: 千钧一发【最小割】
    bzoj 2597: [Wc2007]剪刀石头布【最小费用最大流】
    bzoj 5120: [2017国家集训队测试]无限之环【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14746800.html
Copyright © 2020-2023  润新知