Java Swing中的键盘事件处理

保姆级教程:在Rockchip RK3588 SDK中,如何为你的新硬件板子创建第一个DTS文件 本文提供在Rockchip RK3588 SDK中为自定义硬件创建首个DTS文件的详细教程。通过分析DTS在RK3588开发中的角色、快速定位参考设计、实操步骤及调试验证方法,帮助开发者高效完成硬件板级配置,特别适合嵌入式Linux系统开发者参考。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>   在java Swing编程过程中,经常需要处理键盘事件,例如处理快捷键等。这里就介绍如何定义键盘事件,以及如何处理这些事件。   在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jcomponent中,定义了registerKeyboardAction方法,使用这个方法来将需要处理的键盘事件以及处理事件的行为绑定在一起。Text类中具有keymap对象,同Jcomponent中的处理方法类似,这个对象保存着需要处理的键盘事件和对应的行为。   而在jdk1.3中,使用一种新的方法来处理键盘事件,它将jdk1.2的两种方法整合在一起。不需要区分被处理的是Jcomponent还是Text类型的组件。它定义了两个新的类:InputMap和ActionMap。他们均是简单的表或映射。一个InputMap将一个Keystroke对应到一个对象,ActionMap将一个对象对应到一个行为(Action)。通常InputMap中KeyStroke所对应的对象是一个字符串,通过这个字符串可以在ActionMap中查找到相应的行为。   InputMap和ActionMap中均有put方法。InputMap的put方法可以将Keystroke对应到一个对象,而ActionMap的put方法可以将一个对象对应到一个行为。   在每一个Jcomponent组件中,会有三个缺省的InputMap和一个缺省的ActionMap。他们可以通过调用getInputMap(int condition)和getActionMap()得到。三个InputMap分别是当组件本身拥有焦点时的InputMap(WHEN_FOCUSED),当组件的祖先拥有焦点时的InputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)和组件所在的窗体具有焦点时的InputMap(WHEN_IN_FOCUSED_WINDOW)(括号内表示为了得到这些InputMap,应该在getInputMap中设置的参数)。以下分别说明这三种InputMap:   1, 组件本身拥有焦点时的InputMap:当组件拥有焦点时,键盘按键按下,则java在这个InputMap中查找键盘事件所对应的KeyStroke对象。   2, 组件的祖先拥有焦点时的InputMap:当组件的祖先拥有焦点时,键盘按键按下,则java查找这个InputMap。   3, 组件所在的窗口拥有焦点时的InputMap:当组件所在的窗口具有焦点时,键盘按键按下,则java查找这个InputMap。   当一个键被按下,这个事件被转化成一个KeyStroke对象,java会查找这个Jcomponent的相应InputMap(例如,当组件的祖先具有焦点时,java就查找这个Jcomponent的祖先拥有焦点的InputMap)中是否有这个KeyStroke,如果有,取出它所对应的对象(通常是字符串),利用这个对象在这个Jcomponent的ActionMap中查找,如果找到对应的行为(Action),则java执行这个行为的actionPerformed方法(随后介绍这个方法)。从而达到处理键盘事件的目的。   每一个InputMap可以具有parent属性,这个属性的值是一个InputMap。当在一个InputMap中查找不到键盘事件的KeyStroke时,java会自动在它的parent属性指定的InputMap中查找,依次向上查找,直至找到。使用parent的好处是:当有一些固定的,不希望用户进行改动的键盘映射可以存放在parent属性所指定的InputMap中,从而避免被意外修改;另外可以将多个Jcomponent的缺省InputMap设置具有相同的parent,使得可以共享一些键盘绑定的设置。可以通过InputMap类的setparent()方法设置它的parent属性。ActionMap也具有相同的parent属性,使用方法也相同。   以上是如何将一个键盘事件对应到一个行为,以下就简单介绍行为(Action)。   行为是一个实现了Action接口的类。在Action接口中定义了7个方法。其中最关键的是actionPerformed()方法。这个方法描述了这个行为的具体操作过程。其他几个方法包括setEnabled,isEnabled,putValue,getValue,addPropertyChangeListener,和removePropertyChangeListener方法。他们分别用来设置行为是否可用、判断行为可用的状态、设置和取得行为的一些属性,最后两个方法用来允许其他对象在行动对象的属性发生变化后得到通知。   通常我们使用一个实现了Action接口的大部分方法的抽象类AbstractAction类作为基类,重载actionPerformed方法以实现我们的行为。   我们用一个例子来具体说明如何进行实际的操作。   首先编写一个具体的行为,对指定的键盘事件进行处理:



public class TextAction extends AbstractAction

{

 private String a;

 public TextAction(String a)

 { this.a = a; }

  public void actionPerformed(ActionEvent parm1)

  {

   String b = parm1.getActionCommand(); //得到行为的命令字符串

   System.out.println("command=" b);

   System.out.println("prompt=" this.a);

  }

 } 



  建立四个TextAction对象:



TextAction whenFocusSon = new TextAction("focus son");

TextAction whenFocusFather = new TextAction("focus father");

TextAction window = new TextAction("window");

TextAction ancestor = new TextAction("ancestor"); 



  随后,在一个窗体中加入两个面板,名为sonPanel和parentPanel,使得parentPanel是sonPanel的祖先。并在sonPanel中加入一个名为son的button,在parentPanel中加入名为parent的button。在fatherPanel外加入几个button。



  得到son组件的三个InputMap,并创建一个名为focusFatherIm的InputMap,使得这个InputMap成为focusIm的parent:



//get default inputMap (when focus inputmap) and set a parent InputMap

focusIm = son.getInputMap();

focusFatherIm = new InputMap();

focusIm.setParent(focusFatherIm);



//get WHEN_ANCESTOR_OF_FOCUSED_COMPONENT inputMap 

ancestorIm = son.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);



//get WHEN_IN_FOCUSED_WINDOW inputMap

windowIm = son.getInputMap(WHEN_IN_FOCUSED_WINDOW);

在这些InputMap中分别加入键盘绑定:

focusIm.put(KeyStroke.getKeyStroke('f'),"actionFocusSon");

focusFatherIm.put(KeyStroke.getKeyStroke('F'),"actionFocusFather");

ancestorIm.put(KeyStroke.getKeyStroke('a'),"actionAncestor");

windowIm.put(KeyStroke.getKeyStroke('w'),"actionWindow");

得到son组件的缺省的ActionMap,并将已经建立的行为与特定的对象(字符串)进行绑定:

am = son.getActionMap();



am.put("actionFocusSon",whenFocusSon);

am.put("actionFocusFather",whenFocusFather);

am.put("actionAncestor",ancestor);

am.put("actionWindow",window); 



运行程序及其相应结果:   1, 单击son按钮,这时如果按下'f','F','a','w',程序均会有相应的输出。这是因为,此时的焦点在son按钮上,而son按钮组件的三个InputMap都是有效的。所以他们对应的事件都会发生。   2, 单击parent按钮,这时按下'w',程序会有相应的输出。而按下'f','F','a',程序没有反应。这是因为parent按钮具有焦点,这个按钮不是son按钮的祖先,而son所在的窗口具有焦点,所以只有组件所在窗口具有焦点的InputMap是有效的。   3, 单击其他的按钮(parentPanel外的按钮),这时按下'w',程序会有相应的输出。而按下'f','F','a',程序没有反应。这是因为这些按钮具有焦点,他们不是son按钮的祖先,而son所在的窗口具有焦点,所以只有组件所在窗口具有焦点的InputMap是有效的。 附:主要程序代码:



import java.awt.*;

import javax.swing.*;

import com.borland.jbcl.layout.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import com.sun.java.swing.plaf.motif.*;



public class EventPanel extends JPanel implements ActionListener

{

 JButton btnYellow = new JButton();

 JButton btnBlue = new JButton();

 JButton btnRed = new JButton();

 JPanel parentPanel = new JPanel();

 JPanel sonPanel = new JPanel();

 XYLayout xYLayout1 = new XYLayout();

 JButton son = new JButton();

 JButton parent = new JButton();

 public EventPanel()

 {

  try{

   jbInit();

  }catch(Exception ex)

  { ex.printStackTrace(); }

  }

 void jbInit() throws Exception

 {

  btnYellow.setText("Yellow");

  btnYellow.setBounds(new Rectangle(35, 23, 97, 29));

  this.setLayout(null);

  btnBlue.setBounds(new Rectangle(154, 21, 97, 29));

  btnBlue.setText("Blue");

  btnRed.setBounds(new Rectangle(272, 24, 97, 29));

  btnRed.setText("Red");

  parentPanel.setBorder(BorderFactory.createRaisedBevelBorder());

  parentPanel.setBounds(new Rectangle(27, 68, 358, 227));

  parentPanel.setLayout(xYLayout1);

  sonPanel.setBorder(BorderFactory.createLoweredBevelBorder());

  son.setText("son");

  parent.setText("parent");

  this.add(btnYellow, null);

  this.add(btnBlue, null);

  this.add(btnRed, null);

  this.add(parentPanel, null);

  parentPanel.add(sonPanel, new XYConstraints(58, 22, 229, 125));

  sonPanel.add(son, null);

  parentPanel.add(parent, new XYConstraints(150, 167, -1, -1));

  btnYellow.addActionListener(this);

  btnRed.addActionListener(this);

  btnBlue.addActionListener(this);



  InputMap focusIm,focusFatherIm,ancestorIm,windowIm;

  ActionMap am;

  //create four TextAction for diff purpose

  TextAction whenFocusSon = new TextAction("focus son");

  TextAction whenFocusFather = new TextAction("focus father");

  TextAction window = new TextAction("window");

  TextAction ancestor = new TextAction("ancestor");

  //get default inputMap (when focus inputmap) and set a parent InputMap

  focusIm = son.getInputMap();

  focusFatherIm = new InputMap();

  focusIm.setParent(focusFatherIm);

  //get WHEN_ANCESTOR_OF_FOCUSED_COMPONENT inputMap

  ancestorIm = son.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

  //get WHEN_IN_FOCUSED_WINDOW inputMap

  windowIm = son.getInputMap(WHEN_IN_FOCUSED_WINDOW);

  //put the keyStroke to the InputMap

  focusIm.put(KeyStroke.getKeyStroke('f'),"actionFocusSon");

  focusFatherIm.put(KeyStroke.getKeyStroke('F'),"actionFocusFather");

  ancestorIm.put(KeyStroke.getKeyStroke('a'),"actionAncestor");

  windowIm.put(KeyStroke.getKeyStroke('w'),"actionWindow");

  //get the actionMap

  am = son.getActionMap();

  am.put("actionFocusSon",whenFocusSon);

  am.put("actionFocusFather",whenFocusFather);

  am.put("actionAncestor",ancestor);

  am.put("actionWindow",window);

 }

 public void actionPerformed(ActionEvent e)

 {

  //this code is used to change the backgracolor

  Object source=e.getSource();

  Color color=null;//=getBackground();

  if (source==btnYellow) color=Color.yellow;

  else if (source==btnRed) color = Color.red;

  else if (source == btnBlue) color = Color.blue;

  setBackground(color);

  repaint();

 }

}

51单片机基础知识 前言 周末闲着无聊,以后定时更新一期关于51单片机的学习案例,以供大家平时参考使用。至于单片机,你可以理解为人的大脑,而人各项身体器官的运作需要意识给到大脑,然后大脑再驱动我们的中枢神经进行相应的动作,这里的意识可以理解为我们要写的程序,而人的器官相当于各种输出设备,例如我们以后要学的LED、电机、各种传感器等等。学好单片机能让你找到一份相对不错的工作,当然越可观的东西也是要付出相应努力的。 一、51单片机是什么? 通常我们一说到 51 单片机,指的都是兼容IntelMCS-51体系架构的一系列单片机,而 阅读详情

相关推荐

将Python爬取的数据导入钉钉多维表

摘要:本文介绍将Python爬取的数据导入钉钉多维表的完整解决方案。首先通过requests库爬取数据并解析为结构化格式,然后使用钉钉开放平台API对接多维表。关键步骤包括获取app_key、app_secret等凭证,通过OAuth2获取access_token,以及批量写入记录。文章详细说明了参数获取位置、字段类型匹配、权限配置等注意事项,并提供了错误处理建议和性能优化方法。适用于需要将网络数据同步到钉钉多维表的开发场景。

IT深耕十余载,大道之简 2131

Java.Swing.button绑定快捷键的3种办法

1.使用button.setMnemonic方法,例如:jbtRemove.setMnemonic(java.awt.event.KeyEvent.VK_D);      注意使用这个方法只能用alt+d才可以使用快捷键,可以看作是绑定了热键。 2.使用button.registerKeyboardAction()方法,这里可以用button.registerKeyboardActio

于先森 1万+

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

【Java/Swing】让窗格响应键盘事件

System.out.println("左箭头");System.out.println("右箭头");System.out.println("上箭头");System.out.println("下箭头");System.out.println("空格");有些键比如空格和箭头键一直都能出来,而-+等需要按下shift才能出来。1.使JFrame实现KeyListener接口;// 需要按shift一次。// 需要按shift一次。* 使窗格相应键盘事件。:按一下键盘上的某个键。:一直按着某个键不松开。

一念非凡 595

Mission Planner连接Autopilot保姆级教程:从USB到无线全搞定

本文提供Mission Planner连接Autopilot的全面指南,涵盖USB直连、无线数传、蓝牙适配等多种连接方案。详细讲解驱动安装、波特率匹配、性能优化等关键步骤,并分享多链路冗余配置与故障转移的高阶技巧,助你快速解决连接问题。

weixin_28455801的博客 380

Xilnx大学计划/XUP ZYNQ ZU开发板

TUL PYNQ™-ZU板,基于Xilinx Zynq UltraScale+ MPSoC,是为Xilinx大学项目设计的,以支持Xilinx PYNQ (Python Productivi-ty for Zynq)开源框架和嵌入式系统开发。

weixin_57025922的博客 948

java事件处理机制---键盘事件

java键盘监听事件的初步了解

weixin_46080096的博客 2513

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1458

java_键盘事件

package org.du.win; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyAdapter; import java.awt....

adu_add的博客 505

【图像去噪】论文精读:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising

论文题目:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising —— AKDT:用于有效图像去噪的自适应核膨胀Transformer图像去噪是一项基本但具有挑战性的任务,特别是在处理高分辨率图像和复杂的噪声模式时。大多数现有方法依赖于标准的 Transformer 架构,该架构通常计算复杂度高,并且对不同噪声水平的适应性有限。在本文中,我们介绍了自适应核膨胀Transformer(AKDT)

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1048

Python爬虫实战:如何抓取POI信息(公共场所)位置信息

获取公共场所的信息:如餐厅、商店、医院、景点等。抓取POI的基本信息:如名称、类别、地址、评分等。获取POI的地理坐标:经度和纬度信息。存储POI数据:将抓取到的POI信息存储到本地数据库中。通过本篇文章,我们详细介绍了如何使用Python爬虫抓取POI信息。通过Google Maps API和OpenStreetMap(Overpass API),我们展示了如何获取餐厅、商店、医院等公共场所的位置信息,并进一步探讨了如何处理分页、存储数据以及反爬虫策略。

2201_76125261的博客 380

Java Swing中的键盘事件处理技巧

在Java Swing编程过程中,经常需要处理键盘事件,例如处理快捷键等。这里就介绍如何定义键盘事件,以及如何处理这些事件。 在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jcomponent中,定义了registerKeyboardAction方法,使用这个方法来将需要处理的键盘事件以

zhaolulu916619的专栏 709

基于 Simulink 的**单相全桥 LLC 谐振双向 DC-DC 变换器(带软开关特性)**实战教程

原边(Primary):全桥逆变电路(4个 MOSFET/IGBT),将直流斩波为高频方波。变压器:提供电气隔离和电压变比。副边(Secondary):全波或全桥整流电路(同步整流或二极管)。

xiaoheshang_123的博客 54

java中键盘处理事件方法_Java Swing中键盘事件的处理

在Java Swing编程过程中,经常需要处理键盘事件,例如处理快捷键等。这里就介绍如何定义键盘事件,以及如何处理这些事件。在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jcomponent中,定义了registerKeyboardAction方法,使用这个方法来将需要处理的键盘事件以及处理事件的行为绑定在一起。Text类中具有keymap对象,...

weixin_34515452的博客 601

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java swing 键盘事件_Java Swing中键盘事件的处理(转)

在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jcomponent中,定义了registerKeyboardAction方法,使用这个方法来将需要处理的键盘事件以及处理事件的行为绑定在一起。Text类中具有keymap对象,同Jcomponent中的处理方法类似,这个对象保存着需要处理的键盘事件和对应的行为。而在jdk1.3中,使用一种新的方法来...

weixin_33784667的博客 723

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[转]Java Swing中的键盘事件处理

[转]Java Swing中的键盘事件处理 在java Swing编程过程中,经常需要处理键盘事件,例如处理快捷键等。这里就介绍如何定义键盘事件,以及如何处理这些事件。   在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jcomponent中,定义了registerKeyboardAction方法,使用这个方法来将需要处理的键盘事件以及处理事件...

Brook Tran 的博客 200

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java Swing界面编程(24)---事件处理:键盘事件及监听处理

在Swing的事件处理中也可以对键盘的操作进行监听,直接使用KeyListener接口即可。 package com.beyole.util; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.

Aaron-Crystal 1万+

Java Swing中键盘事件的处理

在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jcomponent中,定义了registerKeyboardAction方法,使用这个方法来将需要处理的键盘事件以及处理事件的行为绑定在一起。Text类中具有keymap对象,同Jcomponent中的处理方法类似,这个对象保存着需要处理的键盘事件和对应的行为。  而在jdk1.3中

yyoanlp的专栏 654
上一篇: 使用设计模式改善程序结构
下一篇: Java的支持者将推出Web服务开发工具和技术
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值