import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Hashtable;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.MenuSelectionManager;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
public class ColorChooserMenu extends JFrame {
public ColorChooserMenu() {
super("Color Chooser Menu");
setSize(450, 350);
JMenuBar menuBar = createMenuBar();
setJMenuBar(menuBar);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
protected JMenuBar createMenuBar() {
final JMenuBar menuBar = new JMenuBar();
ColorMenu cm = new ColorMenu("Foreground");
cm.setMnemonic('f');
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
ColorMenu m = (ColorMenu) e.getSource();
System.out.println(m.getColor());
}
};
cm.addActionListener(lst);
menuBar.add(cm);
return menuBar;
}
public static void main(String argv[]) {
new ColorChooserMenu();
}
}
class ColorMenu extends JMenu {
protected Border unselectedBorder;
protected Border selectedBorder;
protected Border activeBorder;
protected Hashtable paneTable;
protected ColorPane colorPane;
public ColorMenu(String name) {
super(name);
unselectedBorder = new CompoundBorder(new MatteBorder(1, 1, 1, 1,
getBackground()), new BevelBorder(BevelBorder.LOWERED,
Color.white, Color.gray));
selectedBorder = new CompoundBorder(new MatteBorder(1, 1, 1, 1,
Color.red), new MatteBorder(1, 1, 1, 1, getBackground()));
activeBorder = new CompoundBorder(new MatteBorder(1, 1, 1, 1,
Color.blue), new MatteBorder(1, 1, 1, 1, getBackground()));
JPanel p = new JPanel();
p.setBorder(new EmptyBorder(5, 5, 5, 5));
p.setLayout(new GridLayout(8, 8));
paneTable = new Hashtable();
int[] values = new int[] { 0 ,128, 192, 255 };
for (int r = 0; r < values.length; r++) {
for (int g = 0; g < values.length; g++) {
for (int b = 0; b < values.length; b++) {
Color c = new Color(values[r], values[g], values[b]);
ColorPane pn = new ColorPane(c);
p.add(pn);
paneTable.put(c, pn);
}
}
}
add(p);
}
public void setColor(Color c) {
Object obj = paneTable.get(c);
if (obj == null)
return;
if (colorPane != null)
colorPane.setSelected(false);
colorPane = (ColorPane) obj;
colorPane.setSelected(true);
}
public Color getColor() {
if (colorPane == null)
return null;
return colorPane.getColor();
}
public void doSelection() {
fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
getActionCommand()));
}
class ColorPane extends JPanel implements MouseListener {
protected Color color;
protected boolean isSelected;
public ColorPane(Color c) {
color = c;
setBackground(c);
setBorder(unselectedBorder);
String msg = "R " + c.getRed() + ", G " + c.getGreen() + ", B "
+ c.getBlue();
setToolTipText(msg);
addMouseListener(this);
}
public Color getColor() {
return color;
}
public Dimension getPreferredSize() {
return new Dimension(15, 15);
}
public Dimension getMaximumSize() {
return getPreferredSize();
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
public void setSelected(boolean selected) {
isSelected = selected;
if (isSelected)
setBorder(selectedBorder);
else
setBorder(unselectedBorder);
}
public boolean isSelected() {
return isSelected;
}
public void mousePressed(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
setColor(color);
MenuSelectionManager.defaultManager().clearSelectedPath();
doSelection();
}
public void mouseEntered(MouseEvent e) {
setBorder(activeBorder);
}
public void mouseExited(MouseEvent e) {
setBorder(isSelected ? selectedBorder : unselectedBorder);
}
}
}
|