Action配置方法

来源:互联网 发布:asp商城源码 编辑:程序博客网 时间:2024/06/16 22:57

 

这些protected方法完成了支持Action的大多数工作,希望使用Action更改其行为的的子类应该覆盖这些方法。
protected PropertyChangeListener createActionPropertyChangeListener(Action a)
     返回将负责重新配置按钮以响应按钮action中发生的变化的PropertyChangeListener。
protected void configurePropertiesFromAction(Action a)
      有几个属性值来自给定的Action,并且被应用到这个按钮中。下表列出了这些专用属性,AbstractAction的具体子类可以并且确实是从这个列表中添加和删除的。

 

按钮属性

Action中获得的值

Actionnull时的属性值

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);

  }

}

 

 

原创粉丝点击