ITEEDU

13-2:建立颜色选择对话框(JColorChooer):

JColorChooer的类层次结构图:
    java.lang.Object
     --java.awt.Component
      --java.awt.Container
       --javax.swing.JComponent
        --javax.swing.JColorChooser

Color Chooser可以让你选择所想要的颜色,并更改某个组件的颜色.例如在小画家中,你可以在画板上画上图案,并选择各式各样 的颜色来加以装饰;至于颜色的选择上,你可以在小画家中找到颜色选择对话框.

JColorChooser构造函数:
  • JColorChooser():建立一个JColorChooer对象,默认颜色为白色.
  • JColorChooser(Color initialColor):建立一个JColorChooer对象,并设置初始颜色.
  • JColorChooser(ColorSelectionModel modal):以ColorSelectionModel构造JColorChooser对象.

13-2-1:轻松输出颜色选择对话框:

最常使用JColorChooser的方式是使用JColorChooser的静态方法showDialog().也就是说在大部份的情况下,我们不会new一个 JColorChooser对象,而是直接使用JColorChooser的静态方法(showDialog())来输出颜色选择对话框.利用这个方法我们亦可以得到 用户所选择的颜色,若用户没有选择则返回null值.

另外还有一个使用JColorChooser常用的方式,那就是使用createDialog()静态方法.使用这个静态方法后会得到一个JDialog对 象,我们可以利用这个JDialog对象对颜色选择对话框做更多的设置.不过利用这个方法必须配合JColorChooser对象才行,也就是必须 new出一个JColorChooser对象来.下面范例我们先介绍第一种最简单的也是最实用的JColorChooser选择颜色完毕后就能更改JLabel 上的背景颜色.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import com.incors.plaf.alloy.*;
import com.incors.plaf.alloy.themes.glass.*;

public class ColorChooserDemo1 extends MouseAdapter {
	JFrame f = null;
	JLabel label = null;
	JLabel label1 = null;
	JLabel label2 = null;
	Rectangle rec1 = null;
	Rectangle rec2 = null;

	public ColorChooserDemo1() {
		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);

		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) {
		SwingUtil.setLookAndFeel();
		new ColorChooserDemo1();
	}

	// 实现MouseAdapter中的mousePressed()与mouseClicked()方法.当按下鼠标时,就能知道鼠标光标目前的位置.当连续键击鼠标
	// 两次时,若光标所在位置在label中,就会出现颜色选择对话框,用户可选择任一颜色更改label的颜色.
	public void mousePressed(MouseEvent e) {
		label.setText("目前鼠标坐标(X,Y)为:(" + e.getX() + "," + e.getY() + ")");
	}

	public void mouseClicked(MouseEvent e) {
		Point point = e.getPoint();

		if (e.getClickCount() == 2) {
			if (rec1.contains(point)) { /*
										 * 利用JColorChooser的showDialog()静态方法输出颜色选择对话框
										 * ,showDialog()中的3个参数依次是:
										 * 对话框的父组件,颜色选择对话框标题
										 * ,与对话框默认颜色.当用户选择完颜色之后,按下"OK"按钮则返回
										 * Color对象,若按下"Cancel"按钮则返回null值.
										 */
				Color color = JColorChooser.showDialog(f,
						"Change label1 Color", Color.white);
				if (color != null) // 若为null值表示用户按下Cancel按钮
					label1.setBackground(color);
			}
			if (rec2.contains(point)) {
				Color color = JColorChooser.showDialog(f,
						"Change label2 Color", Color.yellow);
				if (color != null) // 若为null值表示用户按下Cancel按钮
					label2.setBackground(color);
			}
		}
	}
}

class SwingUtil {
	public static final void setLookAndFeel() {
		try {
			Font font = new Font("JFrame", Font.PLAIN, 12);
			Enumeration keys = UIManager.getLookAndFeelDefaults().keys();

			while (keys.hasMoreElements()) {
				Object key = keys.nextElement();
				if (UIManager.get(key) instanceof Font) {
					UIManager.put(key, font);
				}
			}
			AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration",
					"true");
			AlloyTheme theme = new GlassTheme();
			LookAndFeel alloyLnF = new AlloyLookAndFeel(theme);
			UIManager.setLookAndFeel(alloyLnF);
		} catch (UnsupportedLookAndFeelException ex) {
			ex.printStackTrace();
		}
	}
}