這篇文章給大家分享的是有關(guān)Java Swing中如何定義鍵盤事件的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、大足網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開發(fā)、大足網(wǎng)絡(luò)營(yíng)銷、大足企業(yè)策劃、大足品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供大足建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com在jdk1.2中,分別針對(duì)Jcomponent和Text類的對(duì)象定制了不同的處理鍵盤事件的方法:在Jcomponent中,定義了registerKeyboardAction方法,使用這個(gè)方法來將需要處理的鍵盤事件以及處理事件的行為綁定在一起。Text類中具有keymap對(duì)象,同Jcomponent中的處理方法類似,這個(gè)對(duì)象保存著需要處理的鍵盤事件和對(duì)應(yīng)的行為。
而在jdk1.3中,使用一種新的方法來處理鍵盤事件,它將jdk1.2的兩種方法整合在一起。不需要區(qū)分被處理的是Jcomponent還是Text類型的組件。它定義了兩個(gè)新的類:InputMap和ActionMap。他們均是簡(jiǎn)單的表或映射。一個(gè)InputMap將一個(gè)Keystroke對(duì)應(yīng)到一個(gè)對(duì)象,ActionMap將一個(gè)對(duì)象對(duì)應(yīng)到一個(gè)行為(Action)。通常InputMap中KeyStroke所對(duì)應(yīng)的對(duì)象是一個(gè)字符串,通過這個(gè)字符串可以在ActionMap中查找到相應(yīng)的行為。
InputMap和ActionMap中均有put方法。InputMap的put方法可以將Keystroke對(duì)應(yīng)到一個(gè)對(duì)象,而ActionMap的put方法可以將一個(gè)對(duì)象對(duì)應(yīng)到一個(gè)行為。
在每一個(gè)Jcomponent組件中,會(huì)有三個(gè)缺省的InputMap和一個(gè)缺省的ActionMap。他們可以通過調(diào)用getInputMap(int condition)和getActionMap()得到。三個(gè)InputMap分別是當(dāng)組件本身擁有焦點(diǎn)時(shí)的InputMap(WHEN_FOCUSED),當(dāng)組件的祖先擁有焦點(diǎn)時(shí)的InputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)和組件所在的窗體具有焦點(diǎn)時(shí)的InputMap(WHEN_IN_FOCUSED_WINDOW)(括號(hào)內(nèi)表示為了得到這些InputMap,應(yīng)該在getInputMap中設(shè)置的參數(shù))。以下分別說明這三種InputMap:
1. 組件本身擁有焦點(diǎn)時(shí)的InputMap:當(dāng)組件擁有焦點(diǎn)時(shí),鍵盤按鍵按下,則java在這個(gè)InputMap中查找鍵盤事件所對(duì)應(yīng)的KeyStroke對(duì)象。
2. 組件的祖先擁有焦點(diǎn)時(shí)的InputMap:當(dāng)組件的祖先擁有焦點(diǎn)時(shí),鍵盤按鍵按下,則java查找這個(gè)InputMap。
3. 組件所在的窗口擁有焦點(diǎn)時(shí)的InputMap:當(dāng)組件所在的窗口具有焦點(diǎn)時(shí),鍵盤按鍵按下,則java查找這個(gè)InputMap。
當(dāng)一個(gè)鍵被按下,這個(gè)事件被轉(zhuǎn)化成一個(gè)KeyStroke對(duì)象,java會(huì)查找這個(gè)Jcomponent的相應(yīng)InputMap(例如,當(dāng)組件的祖先具有焦點(diǎn)時(shí),java就查找這個(gè)Jcomponent的祖先擁有焦點(diǎn)的InputMap)中是否有這個(gè)KeyStroke,如果有,取出它所對(duì)應(yīng)的對(duì)象(通常是字符串),利用這個(gè)對(duì)象在這個(gè)Jcomponent的ActionMap中查找,如果找到對(duì)應(yīng)的行為(Action),則java執(zhí)行這個(gè)行為的actionPerformed方法(隨后介紹這個(gè)方法)。從而達(dá)到處理鍵盤事件的目的。
每一個(gè)InputMap可以具有parent屬性,這個(gè)屬性的值是一個(gè)InputMap。當(dāng)在一個(gè)InputMap中查找不到鍵盤事件的KeyStroke時(shí),java會(huì)自動(dòng)在它的parent屬性指定的InputMap中查找,依次向上查找,直至找到。使用parent的好處是:當(dāng)有一些固定的,不希望用戶進(jìn)行改動(dòng)的鍵盤映射可以存放在parent屬性所指定的InputMap中,從而避免被意外修改;另外可以將多個(gè)Jcomponent的缺省InputMap設(shè)置具有相同的parent,使得可以共享一些鍵盤綁定的設(shè)置??梢酝ㄟ^InputMap類的setparent()方法設(shè)置它的parent屬性。ActionMap也具有相同的parent屬性,使用方法也相同。
以上是如何將一個(gè)鍵盤事件對(duì)應(yīng)到一個(gè)行為,以下就簡(jiǎn)單介紹行為(Action)。
行為是一個(gè)實(shí)現(xiàn)了Action接口的類。在Action接口中定義了7個(gè)方法。其中最關(guān)鍵的是actionPerformed()方法。這個(gè)方法描述了這個(gè)行為的具體操作過程。其他幾個(gè)方法包括setEnabled,isEnabled,putValue,getValue,addPropertyChangeListener,和removePropertyChangeListener方法。他們分別用來設(shè)置行為是否可用、判斷行為可用的狀態(tài)、設(shè)置和取得行為的一些屬性,最后兩個(gè)方法用來允許其他對(duì)象在行動(dòng)對(duì)象的屬性發(fā)生變化后得到通知。
通常我們使用一個(gè)實(shí)現(xiàn)了Action接口的大部分方法的抽象類AbstractAction類作為基類,重載actionPerformed方法以實(shí)現(xiàn)我們的行為。
我們用一個(gè)例子來具體說明如何進(jìn)行實(shí)際的操作。
首先編寫一個(gè)具體的行為,對(duì)指定的鍵盤事件進(jìn)行處理:
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);
}
}
建立四個(gè)TextAction對(duì)象:
TextAction whenFocusSon = new TextAction("focus son");
TextAction whenFocusFather = new TextAction("focus father");
TextAction window = new TextAction("window");
TextAction ancestor = new TextAction("ancestor");
隨后,在一個(gè)窗體中加入兩個(gè)面板,名為sonPanel和parentPanel,使得parentPanel是sonPanel的祖先。并在sonPanel中加入一個(gè)名為son的button,在parentPanel中加入名為parent的button。在fatherPanel外加入幾個(gè)button。
得到son組件的三個(gè)InputMap,并創(chuàng)建一個(gè)名為focusFatherIm的InputMap,使得這個(gè)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,并將已經(jīng)建立的行為與特定的對(duì)象(字符串)進(jìn)行綁定:
am = son.getActionMap();
am.put("actionFocusSon",whenFocusSon);
am.put("actionFocusFather",whenFocusFather);
am.put("actionAncestor",ancestor);
am.put("actionWindow",window);
運(yùn)行程序及其相應(yīng)結(jié)果:
1. 單擊son按鈕,這時(shí)如果按下f,F(xiàn),a,w,程序均會(huì)有相應(yīng)的輸出。這是因?yàn)?,此時(shí)的焦點(diǎn)在son按鈕上,而son按鈕組件的三個(gè)InputMap都是有效的。所以他們對(duì)應(yīng)的事件都會(huì)發(fā)生。
2. 單擊parent按鈕,這時(shí)按下w,程序會(huì)有相應(yīng)的輸出。而按下f,F(xiàn),a,程序沒有反應(yīng)。這是因?yàn)閜arent按鈕具有焦點(diǎn),這個(gè)按鈕不是son按鈕的祖先,而son所在的窗口具有焦點(diǎn),所以只有組件所在窗口具有焦點(diǎn)的InputMap是有效的。
3. 單擊其他的按鈕(parentPanel外的按鈕),這時(shí)按下w,程序會(huì)有相應(yīng)的輸出。而按下f,F(xiàn),a,程序沒有反應(yīng)。這是因?yàn)檫@些按鈕具有焦點(diǎn),他們不是son按鈕的祖先,而son所在的窗口具有焦點(diǎn),所以只有組件所在窗口具有焦點(diǎn)的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();
}
}
感謝各位的閱讀!關(guān)于“Java Swing中如何定義鍵盤事件”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!