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