Java/Swing JFC/Color Chooser
Содержание
- 1 Adding a Custom Color Chooser Panel to a JColorChooser Dialog
- 2 A quick test of the JColorChooser dialog
- 3 Choose foreground or background color
- 4 Color Chooser Demo
- 5 ColorChooser Demo 2
- 6 ColorChooser Sample 1
- 7 Creating a JColorChooser Dialog
- 8 Customizing the Preview Panel of a JColorChooser Dialog
- 9 extends AbstractColorChooserPanel
- 10 Getting and Setting the Selected Color in a JColorChooser Dialog
- 11 JColorChooser demo
- 12 JColorChooser dialog with a custom preview pane.
- 13 JColorChooser dialog with the custom GrayScalePanel picker tab.
- 14 Listening for Changes to the Selected Color in a JColorChooser Dialog
- 15 Listening for OK and Cancel Events in a JColorChooser Dialog
- 16 Preview pane simply displays the currently selected color.
- 17 Removing a Color Chooser Panel from a JColorChooser Dialog
- 18 Removing the Preview Panel from a JColorChooser Dialog
- 19 Retrieving the Color Chooser Panels in a JColorChooser Dialog
- 20 Setting the Order of the Color Chooser Panel Tabs in a JColorChooser Dialog
- 21 Swing ColorChooser Demo
- 22 System Color Chooser
Adding a Custom Color Chooser Panel to a JColorChooser Dialog
<source lang="java">
import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.colorchooser.AbstractColorChooserPanel; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); chooser.addChooserPanel(new MyChooserPanel()); }
} class MyChooserPanel extends AbstractColorChooserPanel {
public void buildChooser() { setLayout(new GridLayout(0, 3)); makeAddButton("Red", Color.red); makeAddButton("Green", Color.green); makeAddButton("Blue", Color.blue); } public void updateChooser() { } public String getDisplayName() { return "MyChooserPanel"; } public Icon getSmallDisplayIcon() { return null; } public Icon getLargeDisplayIcon() { return null; } private void makeAddButton(String name, Color color) { JButton button = new JButton(name); button.setBackground(color); button.setAction(setColorAction); add(button); } Action setColorAction = new AbstractAction() { public void actionPerformed(ActionEvent evt) { JButton button = (JButton) evt.getSource(); getColorSelectionModel().setSelectedColor(button.getBackground()); } };
}
</source>
A quick test of the JColorChooser dialog
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFrame; public class ColorPicker extends JFrame {
public ColorPicker() { super("JColorChooser Test Frame"); setSize(200, 100); final Container contentPane = getContentPane(); final JButton go = new JButton("Show JColorChooser"); go.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Color c; c = JColorChooser.showDialog(((Component) e.getSource()) .getParent(), "Demo", Color.blue); contentPane.setBackground(c); } }); contentPane.add(go, BorderLayout.SOUTH); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String args[]) { ColorPicker cp = new ColorPicker(); cp.setVisible(true); }
}
</source>
Choose foreground or background color
<source lang="java">
/*
* Created on 17.12.2004 * */
/* This file is part of BORG.
BORG is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. BORG is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with BORG; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright 2003 by Mike Berger
*/
import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFrame;
/**
* GUI control to easy choose foreground or background color. * Indicates color to be stored by its own foreground or background. * * @author bsv * */
public class JButtonKnowsBgColor extends JButton {
// colorProperty is ONE color, but can be indicated by fore or back color protected Color colorProperty; // bg=true means "choosed color is background color" // bg=false means "choosed color is foreground color" protected boolean bg; public JButtonKnowsBgColor( String p_text, Color p_color, boolean p_bg ){ setText( p_text ); setColorProperty( p_color ); setBg( p_bg ); setColorByProperty(); addActionListener(new ModalListener()); } public void setColorByProperty(){ if( isBg() ){ setBackground( getColorProperty() ); } else { setForeground( getColorProperty() ); } } // for testing purposes only public static void main(String[] args) { JButtonKnowsBgColor jbkbc = new JButtonKnowsBgColor( "choose back", Color.RED, true ); JButtonKnowsBgColor jbkbc1 = new JButtonKnowsBgColor( "choose fore", Color.BLUE, false ); JFrame jf = new JFrame(); jf.setLayout( new BorderLayout() ); jf.getContentPane().add( jbkbc, BorderLayout.NORTH ); jf.getContentPane().add( jbkbc1, BorderLayout.CENTER ); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize( 100, 200 ); jf.setVisible(true); } /** * @return Returns the color. */ public Color getColorProperty() { return colorProperty; } /** * @param color The color to set. */ public void setColorProperty(Color color) { this.colorProperty = color; } /** * @return Returns the bg. */ protected boolean isBg() { return bg; } /** * @param bg The bg to set. */ protected void setBg(boolean bg) { this.bg = bg; } private class ModalListener implements ActionListener{ public void actionPerformed(ActionEvent event){ Color selected = JColorChooser.showDialog( null, isBg()?"Set background":"Set foreground", getColorProperty()); setColorProperty(selected); setColorByProperty(); } }
}
</source>
Color Chooser Demo
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.colorchooser.ColorSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class ColorSample {
public static void main(String args[]) { JFrame frame = new JFrame("JColorChooser Popup"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); final JLabel label = new JLabel("I Love Swing", JLabel.CENTER); label.setFont(new Font("Serif", Font.BOLD | Font.ITALIC, 48)); contentPane.add(label, BorderLayout.SOUTH); final JColorChooser colorChooser = new JColorChooser(label .getBackground()); colorChooser.setBorder(BorderFactory .createTitledBorder("Pick Foreground Color")); ColorSelectionModel model = colorChooser.getSelectionModel(); ChangeListener changeListener = new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { Color newForegroundColor = colorChooser.getColor(); label.setForeground(newForegroundColor); } }; model.addChangeListener(changeListener); contentPane.add(colorChooser, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); }
}
</source>
ColorChooser Demo 2
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToggleButton; import javax.swing.border.Border; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /*
* ColorChooserDemo2.java is a 1.4 application that requires these files: * CrayonPanel.java images/red.gif images/yellow.gif images/green.gif * images/blue.gif */
public class ColorChooserDemo2 extends JPanel implements ActionListener,
ChangeListener { public JLabel banner; public JColorChooser tcc; public ColorChooserDemo2() { super(new BorderLayout()); //Set up banner to use as custom preview panel banner = new JLabel("Welcome to the Tutorial Zone!", JLabel.CENTER); banner.setForeground(Color.yellow); banner.setBackground(Color.blue); banner.setOpaque(true); banner.setFont(new Font("SansSerif", Font.BOLD, 24)); banner.setPreferredSize(new Dimension(100, 65)); JPanel bannerPanel = new JPanel(new BorderLayout()); bannerPanel.add(banner, BorderLayout.CENTER); bannerPanel.setBorder(BorderFactory.createTitledBorder("Banner")); //Set up color chooser for setting background color JPanel panel = new JPanel(); //use FlowLayout JButton bcc = new JButton("Show Color Chooser..."); bcc.addActionListener(this); panel.add(bcc); panel.setBorder(BorderFactory .createTitledBorder("Choose Background Color")); //Set up color chooser for setting text color tcc = new JColorChooser(); tcc.getSelectionModel().addChangeListener(this); tcc.setBorder(BorderFactory.createTitledBorder("Choose Text Color")); //Remove the preview panel tcc.setPreviewPanel(new JPanel()); //Override the chooser panels with our own AbstractColorChooserPanel panels[] = { new CrayonPanel() }; tcc.setChooserPanels(panels); tcc.setColor(banner.getForeground()); add(bannerPanel, BorderLayout.PAGE_START); add(panel, BorderLayout.CENTER); add(tcc, BorderLayout.PAGE_END); } public void actionPerformed(ActionEvent e) { Color newColor = JColorChooser.showDialog(ColorChooserDemo2.this, "Choose Background Color", banner.getBackground()); if (newColor != null) { banner.setBackground(newColor); } } public void stateChanged(ChangeEvent e) { Color newColor = tcc.getColor(); banner.setForeground(newColor); } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("ColorChooserDemo2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new ColorChooserDemo2(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }
} class CrayonPanel extends AbstractColorChooserPanel implements ActionListener {
JToggleButton redCrayon; JToggleButton yellowCrayon; JToggleButton greenCrayon; JToggleButton blueCrayon; public void updateChooser() { Color color = getColorFromModel(); if (Color.red.equals(color)) { redCrayon.setSelected(true); } else if (Color.yellow.equals(color)) { yellowCrayon.setSelected(true); } else if (Color.green.equals(color)) { greenCrayon.setSelected(true); } else if (Color.blue.equals(color)) { blueCrayon.setSelected(true); } } protected JToggleButton createCrayon(String name, Border normalBorder) { JToggleButton crayon = new JToggleButton(); crayon.setActionCommand(name); crayon.addActionListener(this); //Set the image or, if that"s invalid, equivalent text. ImageIcon icon = createImageIcon("images/" + name + ".gif"); if (icon != null) { crayon.setIcon(icon); crayon.setToolTipText("The " + name + " crayon"); crayon.setBorder(normalBorder); } else { crayon.setText("Image not found. This is the " + name + " button."); crayon.setFont(crayon.getFont().deriveFont(Font.ITALIC)); crayon.setHorizontalAlignment(JButton.HORIZONTAL); crayon.setBorder(BorderFactory.createLineBorder(Color.BLACK)); } return crayon; } protected void buildChooser() { setLayout(new GridLayout(0, 1)); ButtonGroup boxOfCrayons = new ButtonGroup(); Border border = BorderFactory.createEmptyBorder(4, 4, 4, 4); redCrayon = createCrayon("red", border); boxOfCrayons.add(redCrayon); add(redCrayon); yellowCrayon = createCrayon("yellow", border); boxOfCrayons.add(yellowCrayon); add(yellowCrayon); greenCrayon = createCrayon("green", border); boxOfCrayons.add(greenCrayon); add(greenCrayon); blueCrayon = createCrayon("blue", border); boxOfCrayons.add(blueCrayon); add(blueCrayon); } /** Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = CrayonPanel.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn"t find file: " + path); return null; } } public void actionPerformed(ActionEvent e) { Color newColor = null; String command = ((JToggleButton) e.getSource()).getActionCommand(); if ("green".equals(command)) newColor = Color.green; else if ("red".equals(command)) newColor = Color.red; else if ("yellow".equals(command)) newColor = Color.yellow; else if ("blue".equals(command)) newColor = Color.blue; getColorSelectionModel().setSelectedColor(newColor); } public String getDisplayName() { return "Crayons"; } public Icon getSmallDisplayIcon() { return null; } public Icon getLargeDisplayIcon() { return null; }
}
</source>
ColorChooser Sample 1
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFrame; public class ColorChooserSample {
public static void main(String args[]) { JFrame f = new JFrame("JColorChooser Sample"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container content = f.getContentPane(); final JButton button = new JButton("Pick to Change Background"); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { Color initialBackground = button.getBackground(); Color background = JColorChooser.showDialog(null, "JColorChooser Sample", initialBackground); if (background != null) { button.setBackground(background); } } }; button.addActionListener(actionListener); content.add(button, BorderLayout.CENTER); f.setSize(300, 200); f.setVisible(true); }
}
</source>
Creating a JColorChooser Dialog
<source lang="java">
import java.awt.Color; import javax.swing.JColorChooser; public class Main {
public static void main(String[] argv) { Color initialColor = Color.red; Color newColor = JColorChooser.showDialog(null, "Dialog Title", initialColor); }
}
</source>
Customizing the Preview Panel of a JColorChooser Dialog
<source lang="java">
import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.colorchooser.ColorSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); final MyPreviewPanel pre = new MyPreviewPanel(chooser); chooser.setPreviewPanel(pre); ColorSelectionModel model = chooser.getSelectionModel(); model.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ColorSelectionModel model = (ColorSelectionModel) evt.getSource(); pre.curColor = model.getSelectedColor(); } }); }
} class MyPreviewPanel extends JComponent {
Color curColor; public MyPreviewPanel(JColorChooser chooser) { curColor = chooser.getColor(); setPreferredSize(new Dimension(50, 50)); } public void paint(Graphics g) { g.setColor(curColor); g.fillRect(0, 0, getWidth() - 1, getHeight() - 1); }
}
</source>
extends AbstractColorChooserPanel
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToggleButton; import javax.swing.border.Border; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /*
* ColorChooserDemo2.java requires these files: CrayonPanel.java images/red.gif * images/yellow.gif images/green.gif images/blue.gif */
public class ColorChooserDemo2 extends JPanel implements ActionListener,
ChangeListener { public JLabel banner; public JColorChooser tcc; public ColorChooserDemo2() { super(new BorderLayout()); // Set up banner to use as custom preview panel banner = new JLabel("Welcome to the Tutorial Zone!", JLabel.CENTER); banner.setForeground(Color.yellow); banner.setBackground(Color.blue); banner.setOpaque(true); banner.setFont(new Font("SansSerif", Font.BOLD, 24)); banner.setPreferredSize(new Dimension(100, 65)); JPanel bannerPanel = new JPanel(new BorderLayout()); bannerPanel.add(banner, BorderLayout.CENTER); bannerPanel.setBorder(BorderFactory.createTitledBorder("Banner")); // Set up color chooser for setting background color JPanel panel = new JPanel(); // use FlowLayout JButton bcc = new JButton("Show Color Chooser..."); bcc.addActionListener(this); panel.add(bcc); panel .setBorder(BorderFactory.createTitledBorder("Choose Background Color")); // Set up color chooser for setting text color tcc = new JColorChooser(); tcc.getSelectionModel().addChangeListener(this); tcc.setBorder(BorderFactory.createTitledBorder("Choose Text Color")); // Remove the preview panel tcc.setPreviewPanel(new JPanel()); // Override the chooser panels with our own AbstractColorChooserPanel panels[] = { new CrayonPanel() }; tcc.setChooserPanels(panels); tcc.setColor(banner.getForeground()); add(bannerPanel, BorderLayout.PAGE_START); add(panel, BorderLayout.CENTER); add(tcc, BorderLayout.PAGE_END); } public void actionPerformed(ActionEvent e) { Color newColor = JColorChooser.showDialog(ColorChooserDemo2.this, "Choose Background Color", banner.getBackground()); if (newColor != null) { banner.setBackground(newColor); } } public void stateChanged(ChangeEvent e) { Color newColor = tcc.getColor(); banner.setForeground(newColor); } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("ColorChooserDemo2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. JComponent newContentPane = new ColorChooserDemo2(); newContentPane.setOpaque(true); // content panes must be opaque frame.setContentPane(newContentPane); // Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }
} /*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of Sun Microsystems nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */
class CrayonPanel extends AbstractColorChooserPanel implements ActionListener {
JToggleButton redCrayon; JToggleButton yellowCrayon; JToggleButton greenCrayon; JToggleButton blueCrayon; public void updateChooser() { Color color = getColorFromModel(); if (Color.red.equals(color)) { redCrayon.setSelected(true); } else if (Color.yellow.equals(color)) { yellowCrayon.setSelected(true); } else if (Color.green.equals(color)) { greenCrayon.setSelected(true); } else if (Color.blue.equals(color)) { blueCrayon.setSelected(true); } } protected JToggleButton createCrayon(String name, Border normalBorder) { JToggleButton crayon = new JToggleButton(); crayon.setActionCommand(name); crayon.addActionListener(this); // Set the image or, if that"s invalid, equivalent text. ImageIcon icon = createImageIcon("images/" + name + ".gif"); if (icon != null) { crayon.setIcon(icon); crayon.setToolTipText("The " + name + " crayon"); crayon.setBorder(normalBorder); } else { crayon.setText("Image not found. This is the " + name + " button."); crayon.setFont(crayon.getFont().deriveFont(Font.ITALIC)); crayon.setHorizontalAlignment(JButton.HORIZONTAL); crayon.setBorder(BorderFactory.createLineBorder(Color.BLACK)); } return crayon; } protected void buildChooser() { setLayout(new GridLayout(0, 1)); ButtonGroup boxOfCrayons = new ButtonGroup(); Border border = BorderFactory.createEmptyBorder(4, 4, 4, 4); redCrayon = createCrayon("red", border); boxOfCrayons.add(redCrayon); add(redCrayon); yellowCrayon = createCrayon("yellow", border); boxOfCrayons.add(yellowCrayon); add(yellowCrayon); greenCrayon = createCrayon("green", border); boxOfCrayons.add(greenCrayon); add(greenCrayon); blueCrayon = createCrayon("blue", border); boxOfCrayons.add(blueCrayon); add(blueCrayon); } /** Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = CrayonPanel.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn"t find file: " + path); return null; } } public void actionPerformed(ActionEvent e) { Color newColor = null; String command = ((JToggleButton) e.getSource()).getActionCommand(); if ("green".equals(command)) newColor = Color.green; else if ("red".equals(command)) newColor = Color.red; else if ("yellow".equals(command)) newColor = Color.yellow; else if ("blue".equals(command)) newColor = Color.blue; getColorSelectionModel().setSelectedColor(newColor); } public String getDisplayName() { return "Crayons"; } public Icon getSmallDisplayIcon() { return null; } public Icon getLargeDisplayIcon() { return null; }
}
</source>
Getting and Setting the Selected Color in a JColorChooser Dialog
<source lang="java">
import java.awt.Color; import javax.swing.JColorChooser; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); // Set the selected color chooser.setColor(Color.red); // Get current selected color Color color = chooser.getColor(); }
}
</source>
JColorChooser demo
<source lang="java">
import java.awt.Color; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFrame; public class ColorChooserDemo extends JFrame {
public ColorChooserDemo() { super(); createUI(); setVisible(true); } protected void createUI() { setSize(400, 400); getContentPane().setLayout(new GridBagLayout()); JButton colorButton = new JButton("Choose a color..."); getContentPane().add(colorButton); colorButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { Color c = JColorChooser.showDialog(ColorChooserDemo.this, "Choose a color...", getBackground()); if (c != null) getContentPane().setBackground(c); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } }); } public static void main(String[] args) { new ColorChooserDemo(); }
}
</source>
JColorChooser dialog with a custom preview pane.
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// ColorPicker3.java //A quick test of the JColorChooser dialog. This example adds a custom //preview pane. // import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class ColorPicker3 extends JFrame {
Color c; public ColorPicker3() { super("JColorChooser Test Frame"); setSize(200, 100); final JButton go = new JButton("Show JColorChoser"); final Container contentPane = getContentPane(); go.addActionListener(new ActionListener() { final JColorChooser chooser = new JColorChooser(); boolean first = true; public void actionPerformed(ActionEvent e) { if (first) { first = false; GrayScalePanel gsp = new GrayScalePanel(); chooser.addChooserPanel(gsp); chooser.setPreviewPanel(new CustomPane()); } JDialog dialog = JColorChooser.createDialog(ColorPicker3.this, "Demo 3", true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { c = chooser.getColor(); } }, null); dialog.setVisible(true); contentPane.setBackground(c); } }); contentPane.add(go, BorderLayout.SOUTH); // addWindowListener(new BasicWindowMonitor()); // 1.1 & 1.2 setDefaultCloseOperation(EXIT_ON_CLOSE); } public class CustomPane extends JPanel { JLabel j1 = new JLabel("This is a custom preview pane", JLabel.CENTER); JLabel j2 = new JLabel("This label previews the background", JLabel.CENTER); public CustomPane() { super(new GridLayout(0, 1)); j2.setOpaque(true); add(j1); add(j2); } public void setForeground(Color c) { super.setForeground(c); if (j1 != null) { j1.setForeground(c); j2.setBackground(c); } } } public static void main(String args[]) { ColorPicker3 cp3 = new ColorPicker3(); cp3.setVisible(true); }
} //GrayScalePanel.java //A simple implementation of the AbstractColorChooserPanel class. This class //provides a slider and a textfield for picking out a shade of gray. // class GrayScalePanel extends AbstractColorChooserPanel implements
ChangeListener, ActionListener { JSlider scale; JTextField percentField; // Set up our list of grays. We"ll assume we have all 256 possible shades, // and we"ll do it when the class is loaded. static Color[] grays = new Color[256]; static { for (int i = 0; i < 256; i++) { grays[i] = new Color(i, i, i); } } public GrayScalePanel() { setLayout(new GridLayout(0, 1)); // create the slider and attach us as a listener scale = new JSlider(JSlider.HORIZONTAL, 0, 255, 128); scale.addChangeListener(this); // Set up our display for the chooser add(new JLabel("Pick your shade of gray:", JLabel.CENTER)); JPanel jp = new JPanel(); jp.add(new JLabel("Black")); jp.add(scale); jp.add(new JLabel("White")); add(jp); JPanel jp2 = new JPanel(); percentField = new JTextField(3); percentField.setHorizontalAlignment(SwingConstants.RIGHT); percentField.addActionListener(this); jp2.add(percentField); jp2.add(new JLabel("%")); add(jp2); } // We did this work in the constructor so we can skip it here. protected void buildChooser() { } // Make sure the slider is in sync with the other panels. public void updateChooser() { Color c = getColorSelectionModel().getSelectedColor(); scale.setValue(toGray(c)); } protected int toGray(Color c) { int r = c.getRed(); int g = c.getGreen(); int b = c.getBlue(); // Grab the luminance the same way GIMP does... return (int) Math.round(0.3 * r + 0.59 * g + 0.11 * b); } // Pick a name for our tab in the chooser public String getDisplayName() { return "Gray Scale"; } // No need for an icon. public Icon getSmallDisplayIcon() { return null; } public Icon getLargeDisplayIcon() { return null; } // And lastly, update the selection model as our slider changes. public void stateChanged(ChangeEvent ce) { getColorSelectionModel().setSelectedColor(grays[scale.getValue()]); percentField.setText("" + (100 - (int) Math.round(scale.getValue() / 2.55))); } public void actionPerformed(ActionEvent ae) { int val = 100 - Integer.parseInt(ae.getActionCommand()); getColorSelectionModel().setSelectedColor(grays[(int) (val * 2.55)]); }
}
</source>
JColorChooser dialog with the custom GrayScalePanel picker tab.
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// ColorPicker2.java //A quick test of the JColorChooser dialog. This one installs the custom //GrayScalePanel picker tab. // import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class ColorPicker2 extends JFrame {
Color c; public ColorPicker2() { super("JColorChooser Test Frame"); setSize(200, 100); final JButton go = new JButton("Show JColorChoser"); final Container contentPane = getContentPane(); go.addActionListener(new ActionListener() { final JColorChooser chooser = new JColorChooser(); boolean first = true; public void actionPerformed(ActionEvent e) { if (first) { first = false; GrayScalePanel gsp = new GrayScalePanel(); chooser.addChooserPanel(gsp); } JDialog dialog = JColorChooser.createDialog(ColorPicker2.this, "Demo 2", true, chooser, new ActionListener() { public void actionPerformed(ActionEvent e) { c = chooser.getColor(); } }, null); dialog.setVisible(true); contentPane.setBackground(c); } }); contentPane.add(go); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String args[]) { ColorPicker2 cp2 = new ColorPicker2(); cp2.setVisible(true); }
} //GrayScalePanel.java //A simple implementation of the AbstractColorChooserPanel class. This class //provides a slider and a textfield for picking out a shade of gray. // class GrayScalePanel extends AbstractColorChooserPanel implements
ChangeListener, ActionListener { JSlider scale; JTextField percentField; // Set up our list of grays. We"ll assume we have all 256 possible shades, // and we"ll do it when the class is loaded. static Color[] grays = new Color[256]; static { for (int i = 0; i < 256; i++) { grays[i] = new Color(i, i, i); } } public GrayScalePanel() { setLayout(new GridLayout(0, 1)); // create the slider and attach us as a listener scale = new JSlider(JSlider.HORIZONTAL, 0, 255, 128); scale.addChangeListener(this); // Set up our display for the chooser add(new JLabel("Pick your shade of gray:", JLabel.CENTER)); JPanel jp = new JPanel(); jp.add(new JLabel("Black")); jp.add(scale); jp.add(new JLabel("White")); add(jp); JPanel jp2 = new JPanel(); percentField = new JTextField(3); percentField.setHorizontalAlignment(SwingConstants.RIGHT); percentField.addActionListener(this); jp2.add(percentField); jp2.add(new JLabel("%")); add(jp2); } // We did this work in the constructor so we can skip it here. protected void buildChooser() { } // Make sure the slider is in sync with the other panels. public void updateChooser() { Color c = getColorSelectionModel().getSelectedColor(); scale.setValue(toGray(c)); } protected int toGray(Color c) { int r = c.getRed(); int g = c.getGreen(); int b = c.getBlue(); // Grab the luminance the same way GIMP does... return (int) Math.round(0.3 * r + 0.59 * g + 0.11 * b); } // Pick a name for our tab in the chooser public String getDisplayName() { return "Gray Scale"; } // No need for an icon. public Icon getSmallDisplayIcon() { return null; } public Icon getLargeDisplayIcon() { return null; } // And lastly, update the selection model as our slider changes. public void stateChanged(ChangeEvent ce) { getColorSelectionModel().setSelectedColor(grays[scale.getValue()]); percentField.setText("" + (100 - (int) Math.round(scale.getValue() / 2.55))); } public void actionPerformed(ActionEvent ae) { int val = 100 - Integer.parseInt(ae.getActionCommand()); getColorSelectionModel().setSelectedColor(grays[(int) (val * 2.55)]); }
}
</source>
Listening for Changes to the Selected Color in a JColorChooser Dialog
<source lang="java">
import java.awt.Color; import javax.swing.JColorChooser; import javax.swing.colorchooser.ColorSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); ColorSelectionModel model = chooser.getSelectionModel(); model.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ColorSelectionModel model = (ColorSelectionModel) evt.getSource(); Color newColor = model.getSelectedColor(); } }); }
}
</source>
Listening for OK and Cancel Events in a JColorChooser Dialog
<source lang="java">
import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JColorChooser; import javax.swing.JDialog; public class Main {
public static void main(String[] argv) { final JColorChooser chooser = new JColorChooser(); ActionListener okListener = new ActionListener() { public void actionPerformed(ActionEvent evt) { Color newColor = chooser.getColor(); } }; ActionListener cancelListener = new ActionListener() { public void actionPerformed(ActionEvent evt) { Color newColor = chooser.getColor(); } }; boolean modal = false; JDialog dialog = JColorChooser.createDialog(null, "Dialog Title", modal, chooser, okListener, cancelListener); dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { Color newColor = chooser.getColor(); } }); }
}
</source>
Preview pane simply displays the currently selected color.
<source lang="java">
class MyPreviewPane extends JLabel{
Color curColor; public MyPreviewPane(JColorChooser chooser) { curColor = chooser.getColor(); ColorSelectionModel model = chooser.getSelectionModel(); model.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent evt) { ColorSelectionModel model = (ColorSelectionModel) evt.getSource(); curColor = model.getSelectedColor(); } }); setPreferredSize(new Dimension(50, 50)); } public void paint(Graphics g) { g.setColor(curColor); g.fillRect(0, 0, getWidth() - 1, getHeight() - 1); }
}
</source>
Removing a Color Chooser Panel from a JColorChooser Dialog
<source lang="java">
import javax.swing.JColorChooser; import javax.swing.colorchooser.AbstractColorChooserPanel; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); AbstractColorChooserPanel[] oldPanels = chooser.getChooserPanels(); for (int i = 0; i < oldPanels.length; i++) { String clsName = oldPanels[i].getClass().getName(); if (clsName.equals("javax.swing.colorchooser.DefaultSwatchChooserPanel")) { chooser.removeChooserPanel(oldPanels[i]); } else if (clsName.equals("javax.swing.colorchooser.DefaultRGBChooserPanel")) { chooser.removeChooserPanel(oldPanels[i]); } else if (clsName.equals("javax.swing.colorchooser.DefaultHSBChooserPanel")) { chooser.removeChooserPanel(oldPanels[i]); } } }
}
</source>
Removing the Preview Panel from a JColorChooser Dialog
<source lang="java">
import javax.swing.JColorChooser; import javax.swing.JPanel; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); chooser.setPreviewPanel(new JPanel()); }
}
</source>
Retrieving the Color Chooser Panels in a JColorChooser Dialog
<source lang="java">
import javax.swing.JColorChooser; import javax.swing.colorchooser.AbstractColorChooserPanel; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); findPanel(chooser, "javax.swing.colorchooser.DefaultSwatchChooserPanel"); findPanel(chooser, "javax.swing.colorchooser.DefaultHSBChooserPanel"); findPanel(chooser, "javax.swing.colorchooser.DefaultRGBChooserPanel"); } public static AbstractColorChooserPanel findPanel(JColorChooser chooser, String name) { AbstractColorChooserPanel[] panels = chooser.getChooserPanels(); for (int i = 0; i < panels.length; i++) { String clsName = panels[i].getClass().getName(); if (clsName.equals(name)) { return panels[i]; } } return null; }
}
</source>
Setting the Order of the Color Chooser Panel Tabs in a JColorChooser Dialog
<source lang="java">
import javax.swing.JColorChooser; import javax.swing.colorchooser.AbstractColorChooserPanel; public class Main {
public static void main(String[] argv) { JColorChooser chooser = new JColorChooser(); int numPanels = chooser.getChooserPanels().length; AbstractColorChooserPanel[] newPanels = new AbstractColorChooserPanel[numPanels]; newPanels[0] = findPanel(chooser, "javax.swing.colorchooser.DefaultHSBChooserPanel"); newPanels[1] = findPanel(chooser, "javax.swing.colorchooser.DefaultRGBChooserPanel"); newPanels[2] = findPanel(chooser, "javax.swing.colorchooser.DefaultSwatchChooserPanel"); chooser.setChooserPanels(newPanels); } public static AbstractColorChooserPanel findPanel(JColorChooser chooser, String name) { AbstractColorChooserPanel[] panels = chooser.getChooserPanels(); for (int i = 0; i < panels.length; i++) { String clsName = panels[i].getClass().getName(); if (clsName.equals(name)) { return panels[i]; } } return null; }
}
</source>
Swing ColorChooser Demo
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /* SwingColorChooserDemo.java is a 1.4 application that requires no other files. */ public class SwingColorChooserDemo extends JPanel implements ChangeListener {
protected JColorChooser tcc; protected JLabel banner; public SwingColorChooserDemo() { super(new BorderLayout()); //Set up the banner at the top of the window banner = new JLabel("Welcome to the Tutorial Zone!", JLabel.CENTER); banner.setForeground(Color.yellow); banner.setBackground(Color.blue); banner.setOpaque(true); banner.setFont(new Font("SansSerif", Font.BOLD, 24)); banner.setPreferredSize(new Dimension(100, 65)); JPanel bannerPanel = new JPanel(new BorderLayout()); bannerPanel.add(banner, BorderLayout.CENTER); bannerPanel.setBorder(BorderFactory.createTitledBorder("Banner")); //Set up color chooser for setting text color tcc = new JColorChooser(banner.getForeground()); tcc.getSelectionModel().addChangeListener(this); tcc.setBorder(BorderFactory.createTitledBorder("Choose Text Color")); add(bannerPanel, BorderLayout.CENTER); add(tcc, BorderLayout.PAGE_END); } public void stateChanged(ChangeEvent e) { Color newColor = tcc.getColor(); banner.setForeground(newColor); } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("SwingColorChooserDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new SwingColorChooserDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }
}
</source>
System Color Chooser
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Container; import java.awt.Graphics; import java.awt.Polygon; import java.awt.SystemColor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.colorchooser.ColorSelectionModel; public class CustomPanelPopup {
public static void main(String args[]) { JFrame frame = new JFrame("JColorChooser Custom Panel Sample"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); final JButton button = new JButton("Pick to Change Background"); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { Color initialBackground = button.getBackground(); final JColorChooser colorChooser = new JColorChooser( initialBackground); SystemColorChooserPanel newChooser = new SystemColorChooserPanel(); // AbstractColorChooserPanel chooserPanels[] = {newChooser}; // colorChooser.setChooserPanels(chooserPanels); colorChooser.addChooserPanel(newChooser); // For okay button selection, change button background to // selected color ActionListener okActionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { Color newColor = colorChooser.getColor(); if (newColor.equals(button.getForeground())) { System.out.println("Color change rejected"); } else { button.setBackground(colorChooser.getColor()); } } }; // For cancel button selection, change button background to red ActionListener cancelActionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { button.setBackground(Color.red); } }; final JDialog dialog = JColorChooser.createDialog(null, "Change Button Background", true, colorChooser, okActionListener, cancelActionListener); // Wait until current event dispatching completes before showing // dialog Runnable showDialog = new Runnable() { public void run() { dialog.show(); } }; SwingUtilities.invokeLater(showDialog); } }; button.addActionListener(actionListener); contentPane.add(button, BorderLayout.CENTER); frame.setSize(300, 100); frame.setVisible(true); }
} class SystemColorChooserPanel extends AbstractColorChooserPanel implements
ItemListener { private static int NOT_FOUND = -1; JComboBox comboBox; String labels[] = { "black", "blue", "cyan", "darkGray", "gray", "green", "lightGray", "magenta", "orange", "pink", "red", "white", "yellow", "activeCaption", "activeCaptionBorder", "activeCaptionText", "control", "controlDkShadow", "controlHighlight", "controlLtHighlight", "controlShadow", "controlText", "desktop", "inactiveCaption", "inactiveCaptionBorder", "inactiveCaptionText", "info", "infoText", "menu", "menuText", "scrollbar", "text", "textHighlight", "textHighlightText", "textInactiveText", "textText", "window", "windowBorder", "windowText", "<Custom>" }; Color colors[] = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow, SystemColor.activeCaption, SystemColor.activeCaptionBorder, SystemColor.activeCaptionText, SystemColor.control, SystemColor.controlDkShadow, SystemColor.controlHighlight, SystemColor.controlLtHighlight, SystemColor.controlShadow, SystemColor.controlText, SystemColor.desktop, SystemColor.inactiveCaption, SystemColor.inactiveCaptionBorder, SystemColor.inactiveCaptionText, SystemColor.info, SystemColor.infoText, SystemColor.menu, SystemColor.menuText, SystemColor.scrollbar, SystemColor.text, SystemColor.textHighlight, SystemColor.textHighlightText, SystemColor.textInactiveText, SystemColor.textText, SystemColor.window, SystemColor.windowBorder, SystemColor.windowText, null }; // Change combo box to match color, if possible private void setColor(Color newColor) { int position = findColorPosition(newColor); comboBox.setSelectedIndex(position); } // Given a label, find the position of the label in the list private int findColorLabel(Object label) { String stringLabel = label.toString(); int position = NOT_FOUND; for (int i = 0, n = labels.length; i < n; i++) { if (stringLabel.equals(labels[i])) { position = i; break; } } return position; } // Given a color, find the position whose color matches // This could result in a position different from original if two are equal // Since color is same, this is considered to be okay private int findColorPosition(Color color) { int position = colors.length - 1; // Cannot use equals() to compare Color and SystemColor int colorRGB = color.getRGB(); for (int i = 0, n = colors.length; i < n; i++) { if ((colors[i] != null) && (colorRGB == colors[i].getRGB())) { position = i; break; } } return position; } public void itemStateChanged(ItemEvent itemEvent) { int state = itemEvent.getStateChange(); if (state == ItemEvent.SELECTED) { int position = findColorLabel(itemEvent.getItem()); // last position is bad (not selectable) if ((position != NOT_FOUND) && (position != labels.length - 1)) { ColorSelectionModel selectionModel = getColorSelectionModel(); selectionModel.setSelectedColor(colors[position]); } } } public String getDisplayName() { return "SystemColor"; } public Icon getSmallDisplayIcon() { return new DiamondIcon(Color.blue); } public Icon getLargeDisplayIcon() { return new DiamondIcon(Color.green); } protected void buildChooser() { comboBox = new JComboBox(labels); comboBox.addItemListener(this); add(comboBox); } public void updateChooser() { Color color = getColorFromModel(); setColor(color); }
} class DiamondIcon implements Icon {
private Color color; private boolean selected; private int width; private int height; private Polygon poly; private static final int DEFAULT_WIDTH = 10; private static final int DEFAULT_HEIGHT = 10; public DiamondIcon(Color color) { this(color, true, DEFAULT_WIDTH, DEFAULT_HEIGHT); } public DiamondIcon(Color color, boolean selected) { this(color, selected, DEFAULT_WIDTH, DEFAULT_HEIGHT); } public DiamondIcon(Color color, boolean selected, int width, int height) { this.color = color; this.selected = selected; this.width = width; this.height = height; initPolygon(); } private void initPolygon() { poly = new Polygon(); int halfWidth = width / 2; int halfHeight = height / 2; poly.addPoint(0, halfHeight); poly.addPoint(halfWidth, 0); poly.addPoint(width, halfHeight); poly.addPoint(halfWidth, height); } public int getIconHeight() { return height; } public int getIconWidth() { return width; } public void paintIcon(Component c, Graphics g, int x, int y) { g.setColor(color); g.translate(x, y); if (selected) { g.fillPolygon(poly); } else { g.drawPolygon(poly); } g.translate(-x, -y); }
}
</source>