Java 怎样运用Action

package com.han;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.net.URL;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

/**
 * An Action can be used to separate functionality and state from a component.
 * For example, if you have two or more components that perform the same
 * function, consider using an Action object to implement the function. An
 * Action object is an action listener that provides not only action-event
 * handling, but also centralized handling of the state of action-event-firing
 * components such as tool bar buttons, menu items, common buttons, and text
 * fields. The state that an action can handle includes text, icon, mnemonic,
 * enabled, and selected status.
 * <p>
 * This relies on having the Java Look and Feel Graphics Repository
 * (jlfgr-1_0.jar) in the class path. You can download this file from:
 * 
 * <pre>
 * {@link http://www.oracle.com/technetwork/java/repository-140393.html}
 * </pre>
 * 
 * Put it in the class path using one of the following commands<br>
 * (assuming jlfgr-1_0.jar is in a subdirectory named jars):<br>
 * 
 * java -cp .;jars/jlfgr-1_0.jar ActionDemo [Microsoft Windows]<br>
 * java -cp .:jars/jlfgr-1_0.jar ActionDemo [UNIX]<br>
 * 
 * @author HAN
 * 
 */
@SuppressWarnings("serial")
public class ActionDemo extends JPanel implements ItemListener {
	// Define some properties associated with buttons/"mainMenu".
	private String[] names = { "Go left", "Do something", "Go right" };
	private Integer[] mnemonics = { new Integer(KeyEvent.VK_L),
			new Integer(KeyEvent.VK_M), new Integer(KeyEvent.VK_R) };
	private String[] toolTipTexts = { "This is the left button",
			"This is the middle button", "This is the right button" };

	// Define the names for AbleMenu items.
	private static String[] namesAbleMenu = { "First action enabled",
			"Second action enabled", "Third action enabled" };

	// Define properties related to image icons.
	private String imageDir = "/images/jlfgr-1_0/toolbarButtonGraphics/navigation/";
	private String[] icon24Names = { "Back24.gif", "Up24.gif", "Forward24.gif" };
	private String[] icon24Captions = icon24Names;
	private String[] icon16Names = { "Back16.gif", "Up16.gif", "Forward16.gif" };
	private String[] icon16Captions = icon16Names;

	/**
	 * There are three actions: leftAction, middleAction, rightAction.
	 */
	private static Action[] actions = new Action[3];

	ActionDemo() {
		super(new BorderLayout());// because by default JPanel uses FlowLayout.

		// Create a scrolled text area.
		JTextArea textArea = new JTextArea();
		textArea.setEditable(false);
		textArea.setLineWrap(false);
		textArea.setWrapStyleWord(false);
		JScrollPane scrollPane = new JScrollPane(textArea);

		// Create the actions shared by the tool bar and menu.
		for (int i = 0; i < names.length; i++) {
			Icon icon24 = createImageIcon(imageDir + icon24Names[i],
					icon24Captions[i]);
			Icon icon16 = createImageIcon(imageDir + icon16Names[i],
					icon16Captions[i]);
			actions[i] = new SharedAction(names[i], icon24, icon16,
					toolTipTexts[i], mnemonics[i], textArea);
		}

		// Create a tool bar.
		JToolBar toolBar = createToolBar();

		// Lay out the content pane.
		add(scrollPane, BorderLayout.CENTER);
		add(toolBar, BorderLayout.NORTH);
		setPreferredSize(new Dimension(450, 150));
	}

	private JToolBar createToolBar() {
		// TODO Auto-generated method stub
		// JToolBar uses the BoxLayout by default.
		JToolBar toolBar = new JToolBar("Navigation tool bar");
		for (int i = 0; i < actions.length; i++) {
			JButton button = new JButton(actions[i]);
			toolBar.add(button);
		}
		return toolBar;
	}

	private static JMenuBar createMenuBar() {
		// TODO Auto-generated method stub
		JMenuBar menuBar = new JMenuBar();
		JMenu mainMenu = new JMenu("Menu");
		JMenu ableMenu = new JMenu("Action state");
		menuBar.add(mainMenu);
		menuBar.add(ableMenu);

		// Declare and allocate memory address for "cbmis".
		JCheckBoxMenuItem[] cbmis = new JCheckBoxMenuItem[3];

		for (int i = 0; i < actions.length; i++) {
			// add JMenuItem to "mainMenu".
			mainMenu.add(new JMenuItem(actions[i]));

			// Initialize "cbmis" and add them to "ableMenu".
			cbmis[i] = new JCheckBoxMenuItem(new AbleMenuAction(
					namesAbleMenu[i], cbmis, actions));
			ableMenu.add(cbmis[i]);
		}
		return menuBar;
	}

	/**
	 * Return an Icon, or {@code null} if the path is invalid.
	 * 
	 * @param path
	 *            - the image icon path
	 * @param caption
	 *            - the image description, which would allow assistive
	 *            technologies to help visually impaired user understand what
	 *            information the icon conveys.
	 * @return an Icon object, or <code>null</code> if the given path is not
	 *         valid.
	 */
	private Icon createImageIcon(String path, String caption) {
		// TODO Auto-generated method stub
		URL imgURL = getClass().getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL, caption);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}

	@Override
	public void itemStateChanged(ItemEvent e) {
		// TODO Auto-generated method stub
		// You can put the responses to the item selection action. However,
		// since we have used the Action object for the JCheckBoxMenuItem, the
		// items' selection state can be listened and processed in the Action.
	}

	/**
	 * Define actions for the mainMenu and toolBar buttons.
	 * 
	 * @author HAN
	 * 
	 */
	private class SharedAction extends AbstractAction {
		private JTextArea textArea;
		private String newline = System.getProperty("line.separator");

		SharedAction(String text, Icon buttonIcon, Icon menuIcon,
				String toolTipText, Integer mnemonic, JTextArea textArea) {
			this.textArea = textArea;

			putValue(NAME, text);
			putValue(LARGE_ICON_KEY, buttonIcon);
			putValue(SMALL_ICON, menuIcon);
			putValue(SHORT_DESCRIPTION, toolTipText);
			putValue(MNEMONIC_KEY, mnemonic);
		}

		// Methods inherited from interface must be overridden.
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			// Display some informations as we want to the text area.
			textArea.append("Action event detected: ");
			Object triggerComponent = e.getSource();
			if (triggerComponent instanceof JButton) {
				if (((JButton) triggerComponent).getText().equals(names[0])) {
					textArea.append("Action for first button");
				} else if (((JButton) triggerComponent).getText().equals(
						names[1])) {
					textArea.append("Action for second button");
				} else if (((JButton) triggerComponent).getText().equals(
						names[2])) {
					textArea.append("Action for third button");
				}
			} else if (triggerComponent instanceof JMenuItem) {
				if (((JMenuItem) triggerComponent).getText().equals(names[0])) {
					textArea.append("Action for first mainMenu item");
				} else if (((JMenuItem) triggerComponent).getText().equals(
						names[1])) {
					textArea.append("Action for second mainMenu item");
				} else if (((JMenuItem) triggerComponent).getText().equals(
						names[2])) {
					textArea.append("Action for third mainMenu item");
				}
			}
			textArea.append(newline);
			textArea.setTabSize(4);
			textArea.append("\t");
			textArea.append("Event source: " + e.getSource());
			textArea.append(newline);
		}

	}

	/**
	 * Create and show GUI. For thread safety, this method should be invoked
	 * from the event-dispatching thread.
	 */
	private static void createAndShowGUI() {
		// Create and set up the window.
		JFrame frame = new JFrame("Action demo apps");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Set up the content pane, where the "main GUI" lives.
		frame.setContentPane(new ActionDemo());

		// Set up the menu bar and add it to frame.
		JMenuBar menuBar = createMenuBar();
		frame.setJMenuBar(menuBar);

		// Show the window.
		frame.pack();
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		// Schedule a job for the event-dispatching thread:
		// creating and showing this application's GUI.
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				createAndShowGUI();
			}
		});
	}
}

/**
 * Define actions for the ableMenu.
 * 
 * @author HAN
 * 
 */
@SuppressWarnings("serial")
class AbleMenuAction extends AbstractAction {
	private JCheckBoxMenuItem[] cbmis;
	private Action[] actions;

	AbleMenuAction(String name, JCheckBoxMenuItem[] cbmis, Action[] actions) {
		super(name);
		this.cbmis = cbmis;
		this.actions = actions;

		putValue(SELECTED_KEY, true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem) e.getSource();
		boolean isSelected = cbmi.isSelected();
		if (cbmi == cbmis[0]) {
			actions[0].setEnabled(isSelected);
		} else if (cbmi == cbmis[1]) {
			actions[1].setEnabled(isSelected);
		} else if (cbmi == cbmis[2]) {
			actions[2].setEnabled(isSelected);
		}
	}

}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值