Java Tutorial/Swing/JColorChooser
Содержание
- 1 Adding a Custom Color Chooser Panel to a JColorChooser Dialog
- 2 Changing the Color Chooser Panels
- 3 Choose foreground or background color
- 4 Creating a JColorChooser Dialog
- 5 Creating and Showing a JColorChooser Pop-Up Window
- 6 Customizing Action Listeners on JColorChooser Buttons
- 7 Customizing a JColorChooser Look and Feel
- 8 Customizing the Preview Panel of a JColorChooser Dialog
- 9 Display Color chooser dialog
- 10 Dragging-and-Dropping Colors Across JColorChooser Components
- 11 Getting and Setting the Selected Color in a JColorChooser Dialog
- 12 JColorChooser with custom preview panel
- 13 Linking JColorChooser with component"s color
- 14 Listening for OK and Cancel Events in a JColorChooser Dialog
- 15 Listening to Color Selection Changes
- 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 Use a 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>
Changing the Color Chooser Panels
- Create your own by subclassing the AbstractColorChooserPanel class.
- To add a new panel to the existing set, call: public void addChooserPanel(AbstractColorChooserPanel panel)
- To remove it: public AbstractColorChooserPanel removeChooserPanel(AbstractColorChooserPanel panel)
- To replace the existing set of panels: setChooserPanels(AbstractColorChooserPanel panels[ ])
<source lang="java">
public abstract class AbstractColorChooserPanel extends JPanel {
public AbstractColorChooserPanel(); protected abstract void buildChooser(); protected Color getColorFromModel(); public ColorSelectionModel getColorSelectionModel(); public int getDisplayMnemonicIndex(); public abstract String getDisplayName(); public abstract Icon getLargeDisplayIcon(); public int getMnemonic(); public abstract Icon getSmallDisplayIcon(); public void installChooserPanel(JColorChooser); public void paint(Graphics); public void uninstallChooserPanel(JColorChooser); public abstract void updateChooser();
}</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>
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>
Creating and Showing a JColorChooser Pop-Up Window
<source lang="java">
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; public class ColorSamplePopup {
public static void main(String args[]) { JFrame frame = new JFrame("JColorChooser Sample Popup"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 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, "Change Button Background", initialBackground); if (background != null) { button.setBackground(background); } } }; button.addActionListener(actionListener); frame.add(button, BorderLayout.CENTER); frame.setSize(300, 100); frame.setVisible(true); }
}</source>
Customizing Action Listeners on JColorChooser Buttons
<source lang="java">
import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JColorChooser; import javax.swing.JDialog; public class CreateColorSamplePopup {
public static void main(String args[]) { final JColorChooser colorChooser = new JColorChooser(Color.RED); ActionListener okActionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { System.out.println("Color change rejected"); } }; // For cancel selection, change button background to red ActionListener cancelActionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { System.out.println("cancled"); } }; final JDialog dialog = JColorChooser.createDialog(null, "Change Button Background", true, colorChooser, okActionListener, cancelActionListener); dialog.setVisible(true); }
}</source>
Customizing a JColorChooser Look and Feel
Property StringObject TypeColorChooser.backgroundColorColorChooser.cancelTextStringColorChooser.fontFontColorChooser.foregroundColorColorChooser.hsbBlueTextStringColorChooser.hsbBrightnessTextStringColorChooser.hsbDisplayedMnemonicIndexIntegerColorChooser.hsbGreenTextStringColorChooser.hsbHueTextStringColorChooser.hsbMnemonicIntegerColorChooser.hsbNameTextStringColorChooser.hsbRedTextStringColorChooser.hsbSaturationTextStringColorChooser.okTextStringColorChooser.panelsAbstractColorChooserPanel[ ]ColorChooser.previewTextStringColorChooser.resetMnemonicIntegerColorChooser.resetTextStringColorChooser.rgbBlueDisplayedMnemonicIndexIntegerColorChooser.rgbBlueMnemonicIntegerColorChooser.rgbBlueTextStringColorChooser.rgbGreenDisplayedMnemonicIndexIntegerColorChooser.rgbGreenMnemonicIntegerColorChooser.rgbGreenTextStringColorChooser.rgbMnemonicIntegerColorChooser.rgbNameTextStringColorChooser.rgbRedDisplayedMnemonicIndexIntegerColorChooser.rgbRedMnemonicIntegerColorChooser.rgbRedTextStringColorChooser.sampleTextStringColorChooser.showPreviewPanelTextBooleanColorChooser.swatchesDefaultRecentColorColorColorChooser.swatchesDisplayedMnemonicIndexIntegerColorChooser.swatchesMnemonicIntegerColorChooser.swatchesNameTextStringColorChooser.swatchesRecentSwatchSizeDimensionColorChooser.swatchesRecentTextStringColorChooser.swatchesSwatchSizeDimensionColorChooserUIString
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>
Display Color chooser dialog
<source lang="java">
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; public class ColorSample {
public static void main(String args[]) { JFrame f = new JFrame("JColorChooser Sample"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 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); f.add(button, BorderLayout.CENTER); f.setSize(300, 200); f.setVisible(true); }
}</source>
Dragging-and-Dropping Colors Across JColorChooser Components
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JColorChooser; import javax.swing.JFrame; public class DoubleColor {
public static void main(String args[]) { JFrame frame = new JFrame("Double Color Choosers"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JColorChooser left = new JColorChooser(); left.setDragEnabled(true); frame.add(left, BorderLayout.WEST); JColorChooser right = new JColorChooser(); right.setDragEnabled(true); frame.add(right, BorderLayout.EAST); frame.pack(); frame.setVisible(true); }
}</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 with custom preview panel
- To turn off the preview panel, change the previewPanel to a not-null component.
- When the property is set to null, the default preview panel for the look and feel is shown.
- Setting the property to an empty JPanel serves the purpose of not showing the preview panel.
<source lang="java">
import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; public class JColorChooserWithCustomPreviewPanel {
public static void main(String[] a) { final JLabel previewLabel = new JLabel("I Love Swing", JLabel.CENTER); previewLabel.setFont(new Font("Serif", Font.BOLD | Font.ITALIC, 48)); previewLabel.setSize(previewLabel.getPreferredSize()); previewLabel.setBorder(BorderFactory.createEmptyBorder(0,0,1,0)); JColorChooser colorChooser = new JColorChooser(); colorChooser.setPreviewPanel(previewLabel); JDialog d = colorChooser.createDialog(null,"",true,colorChooser,null,null); d.setVisible(true); }
}</source>
Linking JColorChooser with component"s color
<source lang="java">
import java.awt.BorderLayout; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JLabel; public class JColorChooserSample {
public static void main(String args[]) { JFrame frame = new JFrame("JColorChooser Popup"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JLabel label = new JLabel("www.jexp.ru", JLabel.CENTER); label.setFont(new Font("Serif", Font.BOLD | Font.ITALIC, 48)); frame.add(label, BorderLayout.SOUTH); final JColorChooser colorChooser = new JColorChooser(label.getBackground()); colorChooser.setBorder(BorderFactory.createTitledBorder("Pick Foreground Color")); frame.add(colorChooser, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); }
}</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>
Listening to Color Selection Changes
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; 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 ListeningJColorChooserSample {
public static void main(String args[]) { JFrame frame = new JFrame("JColorChooser Popup"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JLabel label = new JLabel("www.jexp.ru", JLabel.CENTER); label.setFont(new Font("Serif", Font.BOLD | Font.ITALIC, 48)); frame.add(label, BorderLayout.SOUTH); final JColorChooser colorChooser = new JColorChooser(label.getBackground()); ColorSelectionModel model = colorChooser.getSelectionModel(); ChangeListener changeListener = new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { Color newForegroundColor = colorChooser.getColor(); label.setForeground(newForegroundColor); } }; model.addChangeListener(changeListener); frame.add(colorChooser, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); }
}</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>
Use a Color Chooser
<source lang="java">
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; import javax.swing.JLabel; import javax.swing.JPanel; public class ColorChooser_01 extends JFrame {
private JLabel sampleText = new JLabel("Label"); private JButton chooseButton = new JButton("Choose Color"); public static void main(String[] args) { new ColorChooser_01(); } public ColorChooser_01() { this.setSize(300, 100); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel1 = new JPanel(); sampleText.setBackground(null); panel1.add(sampleText); chooseButton.addActionListener(new ButtonListener()); panel1.add(chooseButton); this.add(panel1); this.setVisible(true); } private class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { Color c = JColorChooser.showDialog(null, "Choose a Color", sampleText.getForeground()); if (c != null) sampleText.setForeground(c); } }
}</source>