接下来我们介绍刚刚所提到使用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(); } }