Create customized menu for color choosing in Java

Description

The following code shows how to create customized menu for color choosing.

Example


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;
//ww w. j  a  v a2  s . co m
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 Main extends JFrame {

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

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);
    }
  }
}

The code above generates the following result.

Create customized menu for color choosing in Java




















Home »
  Java Tutorial »
    Swing »




Action
Border
Color Chooser
Drag and Drop
Event
Font Chooser
JButton
JCheckBox
JComboBox
JDialog
JEditorPane
JFileChooser
JFormattedText
JFrame
JLabel
JList
JOptionPane
JPasswordField
JProgressBar
JRadioButton
JScrollBar
JScrollPane
JSeparator
JSlider
JSpinner
JSplitPane
JTabbedPane
JTable
JTextArea
JTextField
JTextPane
JToggleButton
JToolTip
JTree
Layout
Menu
Timer