ITEEDU

13-2-2:建立JColorChooser对象输出颜色选择对话框:

接下来我们介绍刚刚所提到使用JColorChooser的第二种方式,也就是使用createDialog()静态方法来输出颜色选择对话框.使 用这种方式的好处是颜色选择对话框可以做出多样性的变化,例如你可以使用JDialog中的setMenuBar()方法在颜色选择对话框中加 入菜单栏,或是利用JDialog的getContentPane()方法取得JDialog的ContentPane,然后对此ContentPane来做处理.下面范例我们修改 上个范例程序,并利用createDialog()方式来输出JColorChooser:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ColorChooserDemo2 extends MouseAdapter implements ActionListener {
	JFrame f = null;
	JLabel label = null;
	JLabel label1 = null;
	JLabel label2 = null;
	Rectangle rec1 = null;
	Rectangle rec2 = null;
	JDialog dialog = null;
	JColorChooser colorChooser = null;

	public ColorChooserDemo2() {
		f = new JFrame("ColorChooser Example");
		Container contentPane = f.getContentPane();
		contentPane.addMouseListener(this);

		label = new JLabel(" ", JLabel.CENTER);
		label.setPreferredSize(new Dimension(300, 20));

		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(1, 2));

		label1 = new JLabel("左Label", JLabel.CENTER);
		label1.setBackground(Color.red);
		label1.setForeground(Color.black);
		label1.setOpaque(true);
		label1.setBounds(0, 0, 150, 150);
		panel.add(label1);

		label2 = new JLabel("右Label", JLabel.CENTER);
		label2.setBackground(Color.green);
		label2.setForeground(Color.black);
		label2.setOpaque(true);
		label2.setBounds(150, 0, 150, 150);
		panel.add(label2);

		rec1 = label1.getBounds();
		rec2 = label2.getBounds();

		contentPane.add(panel, BorderLayout.CENTER);
		contentPane.add(label, BorderLayout.SOUTH);

		// 建立一个新的JColorChooser对象,默认颜色为白色.
		colorChooser = new JColorChooser();
		/*
		 * 利用JColorChooser的createDialog()静态方法取得JDialog对象,createDialog()方法的最后两个参数是用来处理颜色
		 * 选择对话框的"OK"与"Cancel"键的ActionEvent事件.读者可发现,这边并没有对颜色选择对话框的"Reset"做处理,因为
		 * 内部系统会自动处理此事件,如此可减轻程序设计师的负担.
		 */
		dialog = colorChooser.createDialog(f, // parent component
				"Change Color", // title
				true, // modal
				colorChooser, // JColorChooser
				this,// okListenr
				this);// cancelListener

		f.setSize(new Dimension(300, 150));
		f.setVisible(true);

		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	public static void main(String[] arg) {
		new ColorChooserDemo2();
	}

	public void mousePressed(MouseEvent e) {
		label.setText("目前鼠标坐标(X,Y)为:(" + e.getX() + "," + e.getY() + ")");
	}

	boolean flag = true;

	public void mouseClicked(MouseEvent e) {
		Point point = e.getPoint();
		// 判断Double
		// Click鼠标时的所在位置,若在label1或label2上则设置对话框的Title,并用show()方法将此对话框显示出来.
		if (e.getClickCount() == 2) {
			if (rec1.contains(point)) {
				flag = true;
				dialog.setTitle("Change label1 Color");
				dialog.show();
			}
			if (rec2.contains(point)) {
				flag = false;
				dialog.setTitle("Change label2 Color");
				dialog.show();
			}
		}
	}

	/*
	 * 处理用户对颜色选择对话框中的按钮事件.当用户按下"OK"键时,便将label的背景颜色改变成用户所选择的颜色.当用户
	 * 按下"Cancel"键时,则会用Dialog类所提供的dispose()方法就可以关闭颜色选择对话框了.
	 */
	public void actionPerformed(ActionEvent ae) {
		if (ae.getActionCommand().equals("OK")) {
			if (flag == true)
				label1.setBackground(colorChooser.getColor());
			else
				label2.setBackground(colorChooser.getColor());
		}
		if (ae.getActionCommand().equals("Cancel"))
			dialog.dispose();
	}
}