首页 > 代码库 > Swing——动作(Action)

Swing——动作(Action)

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41258997

    Action接口扩展于ActionListener接口。

      public Object getValue(String key); 

      public void putValue(String key, Object value);

      public void setEnabled(boolean b); 

      public boolean isEnabled(); 

      public void addPropertyChangeListener(PropertyChangeListener listener);

      public void removePropertyChangeListener(PropertyChangeListener listener);

    实现Action接口的所有类必须实现上面的7个方法,AbstractAction类实现了该接口除了actionPerformed方法之外的所有方法。

    可以直接扩展AbstractAction类,并在扩展中实现actionPerformed方法
    
    Action redAction = new ColorAction1("red",new ImageIcon("red.gif"),Color.red);

    将这个动作与一个按钮关联起来

    JButton redButton = new JButton(redAction);

     想要将动作添加到击键中,以便用户通过敲击键盘命令来执行这项动作    

     首先,需要生成KeyStroke类对象,该对象封装了对键的说明,调用其静态方法: KeyStroke ctrlBKey = KeyStroke.getKeyStroke("ctrl B");

     可以使用getInputMap方法从组件中得到输入映射:InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);//当这个组件拥有键盘焦点时

     InputMap不能直接将KeyStroke对象映射到Action对象,而是先映射到任意对象上,然后由ActionMap类实现将对象映射到动作上的第二个映射

     这样可实现来自不同输入映射的击键共享一个动作

     每个组件都可以有三个输入映射和一个动作映射,将键与动作关联起来:

     imap.put(KeyStroke.getKeyStroke("ctrl Y"),"panel.yellow");

     ActionMap amap = panel.getActionMap();

     amap.put("panel.yellow",yellowAction);

     使用字符串none表示空动作,可以轻松地取消一个键动作

     imap.put(KeyStroke.getKeyStroke("ctrl C"),"none");  
    
    用同一个动作响应按钮、菜单项或击键的方式: 

    (1)实现一个扩展于AbstractAction类的类,多个相关的动作可以使用同一个类。

    (2)构造一个动作类对象。 

    (3)使用动作对象创建按钮或菜单项。构造器将从动作对象中读取标签文本和图标。

    (4)为通过击键触发动作,首先,定位顶层窗口组件;然后,得到顶层组件的WHEN_ANCESTOR_OF_FOCUS_COMPONENT输入映射。为需要的击键创建一个

KeyStrike对象。创建一个描述动作字符串这样的动作键对象,将动作键添加到输入映射中;最后,得到顶层组件的动作映射,将动作键添加到映射中。


Action动作和击键操作的实例如下:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class TestAction {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				ActionFrame frame = new ActionFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}

		});
	}
}

class ActionFrame extends JFrame {
	private JPanel buttonPanel;

	public ActionFrame() {
		setTitle("test");
		setSize(200, 200);

		buttonPanel = new JPanel();

		Action yellowAction = new ColorAction("yellow", new ImageIcon("yellow.gif"), 
				Color.YELLOW);
		Action blueAction = new ColorAction("blue", new ImageIcon("blue.gif"),
				Color.BLUE);
		Action redAction = new ColorAction("red", new ImageIcon("red.gif"),
				Color.RED);

		buttonPanel.add(new JButton(yellowAction));
		buttonPanel.add(new JButton(blueAction));
		buttonPanel.add(new JButton(redAction));

		InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_FOCUSED);// 当这个组件拥有键盘焦点时
		imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
		imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
		imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");

		ActionMap amap = buttonPanel.getActionMap();
		amap.put("panel.yellow", yellowAction);
		amap.put("panel.blue", blueAction);
		amap.put("panel.red", redAction);

	}
}

class ColorAction extends AbstractAction {
	private JPanel buttonPanel;

	public ColorAction(String name, Icon icon, Color c) {
		putValue(Action.NAME, name);
		putValue(Action.SMALL_ICON, icon);
		putValue("color", c);
		putValue(Action.SHORT_DESCRIPTION,
				"set panel color to" + name.toLowerCase());
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Color c = (Color) getValue("color");
		buttonPanel.setBackground(c);
	}
}


Swing——动作(Action)