返回顶部
首页 > 资讯 > 精选 >Java Swing中如何定义键盘事件
  • 143
分享到

Java Swing中如何定义键盘事件

2023-06-03 07:06:40 143人浏览 独家记忆
摘要

这篇文章给大家分享的是有关Java Swing中如何定义键盘事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jc

这篇文章给大家分享的是有关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();
 }
}

感谢各位的阅读!关于“Java Swing中如何定义键盘事件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java Swing中如何定义键盘事件

本文链接: https://lsjlt.com/news/233472.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java Swing中如何定义键盘事件
    这篇文章给大家分享的是有关Java Swing中如何定义键盘事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在jdk1.2中,分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法:在Jc...
    99+
    2023-06-03
  • jQuery如何绑定键盘事件?
    这篇文章将为大家详细讲解有关jQuery如何绑定键盘事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery绑定键盘事件 导言 jQuery提供了一种简便的方法来绑定键盘事件,允许开发者在用户按下...
    99+
    2024-04-02
  • Angularjs如何实现键盘事件的绑定
    这篇文章主要介绍了Angularjs如何实现键盘事件的绑定,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一:ng内置指令<butt...
    99+
    2024-04-02
  • C#中如何自定义事件
    这篇文章将为大家详细讲解有关C#中如何自定义事件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#自定义事件C#语言中有77个关键字,其中delegate和event专门为C#中事件处理系统...
    99+
    2023-06-17
  • C#如何定义事件
    小编给大家分享一下C#如何定义事件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!C#定义事件应用最近公司在上一个wpf项目,熟悉WPF的同学都知道,WPF控件中,"用户控件"这个概念非常常见,我们也经常...
    99+
    2023-06-18
  • jQuery如何监听键盘按键事件?
    这篇文章将为大家详细讲解有关jQuery如何监听键盘按键事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery监听键盘按键事件 jQuery 提供了多种方法来监听键盘按键事件。最常用的方法是使用...
    99+
    2024-04-02
  • pygame键盘事件如何实现
    这篇文章主要介绍了pygame键盘事件如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Pygame事件pygame.event.EventType''&...
    99+
    2023-06-25
  • 如何理解Python 键盘事件
    本篇文章给大家分享的是有关如何理解Python 键盘事件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。键盘事件废话不多说直接上包from selenium.webdr...
    99+
    2023-06-25
  • jQuery如何模拟键盘事件?
    这篇文章将为大家详细讲解有关jQuery如何模拟键盘事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 jQuery 是一套强大的 JavaScript 库,它提供了模拟键盘事件的丰富功能。通过利用这...
    99+
    2024-04-02
  • java swing如何实现加载自定义的字体
    这篇文章主要介绍了java swing如何实现加载自定义的字体,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java swing 加载自定义的字体在实际开发中, 我们需要把字...
    99+
    2023-06-25
  • Java中如何定义函数关键字?
    Java是一门面向对象的编程语言,在Java中,函数被称为方法。方法是类中的一种行为,可以执行一些操作并返回一个结果。在Java中,定义方法有一定的规范和语法,本文将会对Java中如何定义函数关键字进行详细介绍。 一、Java中定义方法的...
    99+
    2023-09-02
    函数 关键字 npm
  • vue中如何监听键盘回车事件
    这篇文章将为大家详细讲解有关vue中如何监听键盘回车事件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。vue运行为v-on在监听键盘事件时,添加了特殊的键盘修饰符:<...
    99+
    2024-04-02
  • Flex中如何使用自定义事件
    Flex中如何使用自定义事件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Flex自定义事件事件是一个非常有用的功能,通常用于信息传递交互大大提高程序编写的灵活性。在高级语言中...
    99+
    2023-06-17
  • Java项目中如何将键盘输入事件保存到txt文件
    本篇文章给大家分享的是有关Java项目中如何将键盘输入事件保存到txt文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:package javatest;i...
    99+
    2023-05-31
    java ava 目中
  • java中如何用swing组件窗口
    要使用Swing组件创建窗口,首先需要导入Swing包,然后创建一个继承自JFrame的类,并在类的构造函数中初始化窗口的属性和组件...
    99+
    2023-10-11
    java swing
  • jQuery如何实现自定义元素右键点击事件
    这篇文章给大家分享的是有关jQuery如何实现自定义元素右键点击事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先要将阻止弹出函数绑定到目标元素上://阻止浏览器默认右键点击...
    99+
    2024-04-02
  • Java Swing中事件处理方法有哪些
    这篇文章将为大家详细讲解有关Java Swing中事件处理方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的强...
    99+
    2023-06-03
  • jquery如何实现键盘事件触发
    这篇文章主要讲解了“jquery如何实现键盘事件触发”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery如何实现键盘事件触发”吧! ...
    99+
    2024-04-02
  • 使用pygame如何捕获键盘事件
    使用pygame如何捕获键盘事件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。方式1:在pygame中使用pygame.event.get()方法捕获键盘事件,...
    99+
    2023-06-14
  • JavaScript如何禁止某些键盘事件
    小编给大家分享一下JavaScript如何禁止某些键盘事件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!禁止某些键盘事件document.addEventList...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作