这些protected方法完成了支持Action的大多数工作,希望使用Action更改其行为的的子类应该覆盖这些方法。
protected PropertyChangeListener createActionPropertyChangeListener(Action a)
返回将负责重新配置按钮以响应按钮action中发生的变化的PropertyChangeListener。
protected void configurePropertiesFromAction(Action a)
有几个属性值来自给定的Action,并且被应用到这个按钮中。下表列出了这些专用属性,AbstractAction的具体子类可以并且确实是从这个列表中添加和删除的。
按钮属性 | 从Action中获得的值 | Action为null时的属性值 |
Text | a.getValue(NAME) | Null |
icon | a.getValue(SMALL_ICON) | Null |
Mnemonic | a.getValue(MNEMONIC_KEY) | KeyEvent.VK_UNDEFINED |
toolTipText | a.getValue(SHORT_DESCRIPTION) | Mull |
actionCommand | a.getValue(ACTION_COMMAND_KEY) | Null |
Enabled | a.isEnabled() | true |
JButton构造函数:
public JButton(Action a)
建立一个包含来自指定Action的属性值(参见上表)的按钮,注册该Action,以便接受按钮触发的ActionEvent,将按钮注册为Action的ChangeListener。该按钮适应对Action进行的任何更进一步的更改。这等同于实例了一个包含默认构造函数JButton,然后调用其setAction()方法。
以下为一个学习应用的例子:
// ActionExample.java
// An application that shows the Action class in, well, action.
//
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ActionExample extends JFrame {
public static final int MIN_CHANNEL = 2;
public static final int MAX_CHANNEL = 13;
private int currentChannel = MIN_CHANNEL;
private int favoriteChannel = 9;
private JLabel channelLabel = new JLabel();
private Action upAction = new UpAction();//new的是谁就调用谁的构造函数对定义的对象实例化
private Action downAction = new DownAction();
private GotoFavoriteAction gotoFavoriteAction = new GotoFavoriteAction();
private Action setFavoriteAction = new SetFavoriteAction();
public class UpAction extends AbstractAction { //必须为AbstractAction,不能是Action
public UpAction() { //构造函数....
putValue(NAME, "Channel Up"); //putValue(String key, Object value)
putValue(SMALL_ICON, new ImageIcon("images/up.gif"));//使用关联的键设置此对象的一个属性
putValue(SHORT_DESCRIPTION, "Increment the channel number");
putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_U));//把new Integer去掉,效果没变,
} //不过还是应该加上
public void actionPerformed(ActionEvent ae) {
setChannel(currentChannel+1);
}
}
public class DownAction extends AbstractAction {
public DownAction() {
putValue(NAME, "Channel Down");
putValue(SMALL_ICON, new ImageIcon("images/down.gif"));
putValue(SHORT_DESCRIPTION, "Decrement the channel number");
putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_D));
}
public void actionPerformed(ActionEvent ae) {
setChannel(currentChannel-1);
}
}
public class GotoFavoriteAction extends AbstractAction {
public GotoFavoriteAction() {
putValue(SMALL_ICON, new ImageIcon("images/fav.gif"));
putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_G));
updateProperties();
}
public void updateProperties() {
putValue(NAME, "Go to channel "+favoriteChannel);
putValue(SHORT_DESCRIPTION, "Change the channel to "+favoriteChannel);
}
public void actionPerformed(ActionEvent ae) {
setChannel(favoriteChannel);
}
}
public class SetFavoriteAction extends AbstractAction {
public SetFavoriteAction() {
putValue(NAME, "Set 'Go to' channel");
putValue(SMALL_ICON, new ImageIcon("images/set.gif"));
putValue(SHORT_DESCRIPTION,"Make current channel the Favorite channel");
putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_S));
}
public void actionPerformed(ActionEvent ae) {
favoriteChannel = currentChannel;
gotoFavoriteAction.updateProperties();
setEnabled(false);
gotoFavoriteAction.setEnabled(false);
}
}
public ActionExample() {
super("ActionExample");
setChannel(currentChannel); // enable/disable the Actions as appropriate
channelLabel.setHorizontalAlignment(JLabel.CENTER);
channelLabel.setFont(new Font("Serif", Font.PLAIN, 32));
getContentPane().add(channelLabel, BorderLayout.NORTH);
JPanel buttonPanel = new JPanel(new GridLayout(2, 2, 16, 6));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(6, 16, 16, 16));
getContentPane().add(buttonPanel, BorderLayout.CENTER);
buttonPanel.add(new JButton(upAction));
buttonPanel.add(new JButton(gotoFavoriteAction));
buttonPanel.add(new JButton(downAction));
buttonPanel.add(new JButton(setFavoriteAction));
JMenuBar mb = new JMenuBar();
JMenu menu = new JMenu("Channel");
menu.add(new JMenuItem(upAction));
menu.add(new JMenuItem(downAction));
menu.addSeparator(); //分隔线
menu.add(new JMenuItem(gotoFavoriteAction));
menu.add(new JMenuItem(setFavoriteAction));
mb.add(menu);
setJMenuBar(mb);
}
public void setChannel(int chan) {
currentChannel = chan;
channelLabel.setText("Now tuned to channel: "+currentChannel);
// enable/disable the Actions as appropriate
downAction.setEnabled(currentChannel > MIN_CHANNEL);
upAction.setEnabled(currentChannel < MAX_CHANNEL);
gotoFavoriteAction.setEnabled(currentChannel != favoriteChannel);
setFavoriteAction.setEnabled(currentChannel != favoriteChannel);
}
public static void main(String argv[]) { //args==argv!!!
JFrame f = new ActionExample();
f.setSize(400, 180);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}