关于 java swing 中的按钮 如何实现用键盘来操作 急 !急 ! 能举个例子 更好 不知道怎么 用键盘来操作 按钮如果我做了 一个登陆界面 当 我按下 (比如说是 )回车键的时候 就能够登陆 该怎么实现呢?这个问题捆扰 我很久 了 !哪位 朋友 帮帮忙 ! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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 InputMapfocusIm = son.getInputMap();focusFatherIm = new InputMap();focusIm.setParent(focusFatherIm);//get WHEN_ANCESTOR_OF_FOCUSED_COMPONENT inputMapancestorIm = son.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);//get WHEN_IN_FOCUSED_WINDOW inputMapwindowIm = 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(); }} 在登录框里有JTextField吧.接收他的键盘事件就可以了JTextField text = new JTextField("",5);text.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //做你要做的事 }} 6楼的方法是可以的。但是局限是焦点必须在JTextField上。2楼的方法则没有这个限制,设置为WHEN_IN_FOCUSED_WINDOW,只要焦点在窗体之内,就可以触发ActionMap中记录的响应方法。 package jtable;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class JbuttonTest { private static JFrame frame; public static void main(String []args){ frame=new JFrame("JButton Test"); JButton jbutton=new JButton("Test"); jbutton.setMnemonic(KeyEvent.VK_I[b]);//这里就是用键盘对Button进行操作 alt+I就可以 jbutton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ frameChange(evt); } }); Container con=frame.getContentPane(); con.add(jbutton,new BorderLayout().CENTER); frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent evt){ System.exit(0); } }); frame.setSize(200, 300); frame.setVisible(true); } public static void frameChange(ActionEvent evt){ frame.setTitle("frame title have change"); }} 求救,TOMCAT在AIX上乱码... odbc java swing 事件向上传递 JDBC和sqlserver连接,查询的异常 关于javamail的问题,大家帮忙看看! 请教关于jdbc Statement 的问题? 如何读取jar包里的图片文件? 数学题 初学者的问题,请帮帮忙排错?? 简单的问题。在java中求正玄,余玄,正切,余切之类的函数是什么? 我在书上看到说jvm.dll就是java虚拟机,那么这个虚拟机是作什么用的呢? 花上100分,请教一下当当网中的经典“购物车”的实现过程
{
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();
}
}
JTextField text = new JTextField("",5);
text.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//做你要做的事
}
}
2楼的方法则没有这个限制,设置为WHEN_IN_FOCUSED_WINDOW,只要焦点在窗体之内,就可以触发ActionMap中记录的响应方法。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class JbuttonTest {
private static JFrame frame;
public static void main(String []args){
frame=new JFrame("JButton Test");
JButton jbutton=new JButton("Test");
jbutton.setMnemonic(KeyEvent.VK_I[b]);//这里就是用键盘对Button进行操作 alt+I就可以 jbutton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
frameChange(evt);
}
});
Container con=frame.getContentPane();
con.add(jbutton,new BorderLayout().CENTER);
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt){
System.exit(0);
}
});
frame.setSize(200, 300);
frame.setVisible(true);
}
public static void frameChange(ActionEvent evt){
frame.setTitle("frame title have change");
}
}