|
1. Source code download
=>
CustomColorChooser1.zip,
CustomColorChooser2.zip
The two zip files are corresponding to the test code (1) and
the test code (2) described below. They must be executed in different projects.
2. Features of CustomColorChooser
|
|
(a) Dialog of javax.swing.JColorChooser |
(b) Dialog of CustomColorChooserDialog |
Features
|
Description
|
(1)Importing colors
|
The purpose of a custom color chooser is to be able to reuse the colors
of drawings already designed. For this purpose we add an ability to
the current color chooser which ability can import colors from existing
drawings.
The "Imported colors" panel at the lower right of the Figure (b) is such an example.
As a method for importing colors, there may be several ways as
follows.
(a) Import all the colors used in the drawings file.
(b) Import all the colors used in a page of drawings file.
(c) Import the colors of selected shapes.
In this article, we will configure test codes aiming at the method (c).
:The colors that should be imported must be the outline colors of
shapes, the fill color of shapes and the text colors if the shapes have
texts.
|
(2)Reusing colors |
The following functions are required.
(a) If a color is clicked on the color palette of "Imported colors"
panel, the color must be displayed on the preview panel immediately.
(b) If a color is clicked on the color palette of the javax.swing.JColorChooser (the upper side of the figure (b) ), the color must be also displayed on a preview panel.
(c) If the OK button is pressed, the color on the preview panel must be
passed to the application that set the color to the selected shapes or
the selected text.
|
3. Test code (1)
❐ Key components
Component
|
Description
|
CustomColor Chooser1
|
public class CustomColorChooser1
The class implementing the main method. This object receives a selected
color from the CustomColorChooserDialog as follows.
Color color=CustomColorChooserDialog.showDialog(frame, colors);
The colors is an array of colors to be passed from the application, those colors are displayed in the "Imported colors" panel in the figure (b).
The above CustomColorChooserDialog.showDialog static method works completely like the JColorChooser.showDialog method.
|
CustomColor ChooserDialog |
class CustomColorChooserDialog extends JDialog implements ActionListener, ComponentListener
The dialog shown in figure (b).
(1) Set up the JColorChooser, PreviewPanel, ImportedColorsPanel, OK button
and Cancel button in this dialog.
this.colorChooser = new JColorChooser();
this.colorChooser.setBorder(BorderFactory.createTitledBorder("Color
chooser"));
this.colorChooser.setPreviewPanel(new JLabel("Preview", JLabel.CENTER));
The above third line sets a dummy to the PreviewPanel of the
JColorChooser. The new PreviewPanel is added to the CustomColorChooserDialog
(JDialog extended).
(2) Return of the showDialog method
return dialog.getPreviewColor();
The getPreviewColor method returns the color displayed in the Preview Panel.
In the case of the Figure (b), the method returns red.
|
PreviewPanel |
class PreviewPanel extends JComponent implements ChangeListener, ColorSelectionListener,
MouseListener
The new PreviewPanel which is different from the PreviewPanel attached to JColorChooser. This new PreviewPanel displays the color to the panel which was selected on the JColorChooser or the ImportedColorsPanel.
(1) Receiving the selected color from the JColorChooser
Register this object to the ColorSelectionModel of the JColorChooser
as a ChangeListener.
Add the following line to the Constructor of this class.
dialog.getColorChooser().getSelectionModel().addChangeListener(this);
:The dialog represents the CustomColorChooserDialog object.
(2) Receiving the selected color from the ImportedColorsPanel.
Register this object to the ImportedColorsPanel as a ColorSelectionListener by the addColorSelectionListener method of the ImportedColorsPanel.
Add the following line to the Constructor of this class.
dialog.getImportedColorsPanel().addColorSelectionListener(this);
|
ImportedColorsPanel |
class ImportedColorsPanel extends JComponent implements MouseListener
Receive an array of colors from an external application and display them
on the color palette on this panel.
A color on the color palette can be selected with a mouse click and the
selected color must be reported to the PreviewPanel. So the color selection
mechanism and color reporting mechanism to other object is required for
this panel.
(1) Receive an array of colors from the external application
Receive them by the following line (=> CustomColorChooser1)
Color color=CustomColorChooserDialog.showDialog(frame, colors);
The argument colors is the array of colors from an external application.
(2)Display the colors
The colors are displayed in the same way as that of SwatchPanel in the javax.swing.colorchooser.DefaultSwatchChooserPanel.java
(3) Select a color with a mouse
This class is implemented with the MouseListener in order to be able to select a color using the mousePressed method.
(4) Notification to the selected color to the PreviewPanel
Create a ColorSelectionEvent and notify a color selection event to other object with the ColorSelectionEvent
by the fireEvent method of this class.
For this reason, the addColorSelectionListener and the removeColorSelectionListener
methods are required in this object to register a ColorSelectionListener and remove it.
The recipient (in this case, the PreviewPanel) must implements the colorSelected method defined by the ColorSelectionListener to receive the selected color.
|
❐ColorSelectionListener
Item
|
Description
|
code
|
interface ColorSelectionListener extends EventListener {
public void colorSelected(ColorSelectionEvent event);
} |
implementation |
Implement to PreviewPanel. |
❐ColorSelectionEvent
Item
|
Description
|
code
|
class ColorSelectionEvent extends EventObject {
Color color=null;
public ColorSelectionEvent(Object source, Color color) {
super(source);
this.color=color;
}
public Color getColor(){
return this.color;
}
} |
❐SwatchPanel
javax.swing.colorchooser.DefaultSwatchChooserPanel.javaのSwatchPanel class
Display colors by the paintComponent method.
Item
|
Description
|
code
|
public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
for (int row = 0; row < numSwatches.height; row++) {
for (int column = 0; column < numSwatches.width; column++)
{
g.setColor(getColorForCell(column, row));
int x;
if ((!this.getComponentOrientation().isLeftToRight())
&& (this instanceof RecentSwatchPanel))
{
x = (numSwatches.width - column - 1) * (swatchSize.width
+ gap.width);
} else {
x = column * (swatchSize.width + gap.width);
}
int y = row * (swatchSize.height + gap.height);
g.fillRect(x, y, swatchSize.width, swatchSize.height);
g.setColor(Color.black);
g.drawLine(x + swatchSize.width - 1, y, x + swatchSize.width
- 1,
y + swatchSize.height - 1);
g.drawLine(x, y + swatchSize.height - 1, x + swatchSize.width
- 1,
y + swatchSize.height - 1);
}
}
}
|
4. Test code (2)
❐Dialog
Item
|
Description
|
"Imported colors"
panel
|
In the CustomColorChooser1, an array of the colors imported from an
application is passed to the argument of the showDialog method as folloes.
Color color=CustomColorChooserDialog.showDialog(frame, colors);
Since this method may have little flexibility, we implement the "Import
colors" button which imports an array of colors into the palette of
the "Imported colors" panel, and the "delete colors"
button which deletes a imported color from the palette.
For importing an array of colors, we select shapes on the canvas and click the
"Import colors" button , then the colors of the selected shapes
will be imported.
However this is a test code and shape selection mechanism is not implemented,
so when the button is clicked, an array of colors prepared beforehand are
imported.
|
|
Figure (c) Dialog of the CustomColorChooserDialog |
❐ Changed points of the key components
Component
|
Description
|
CustomColor Chooser2
|
public class CustomColorChooser2 implements ColorSelectionListener
This object receives a selected color from the CustomColorChooserDialog
as follows.
In the Test code (1), the modal color-chooser dialog shown by the JColorChooser.showDialog
method blocks until the dialog is hidden.
=> (3)Receiving the selected color from javax.swing.JColorChooser
This method doesn't allow selection mechanism of shapes by clicking the mouse button
on the canvas. Therefor, we implement the ColorSelectionListener to an application (in this case, the application is CustomColorChooser2)
and the application receives the array of colors by the colorSelected method.
(2)Code
public static void main(String[] args)
..............................
CustomColorChooser2 chooser=new CustomColorChooser2();
CustomColorChooserDialog dialog=new CustomColorChooserDialog(frame);
dialog.addColorSelectionListener(chooser);
dialog.showDialog();
}
public void colorSelected(ColorSelectionEvent event) {
Color color = event.getColor();
System.out.println("** CustomColorChooser colorSelected event.getColor()="
+ event.getColor());
}
|
CustomColor ChooserDialog |
class CustomColorChooserDialog extends JDialog implements ActionListener
Additional parts to the Test code (1) are as follows.
(1) "Import colors" button and "delete colors" button
(2) actionPerformed method
In this method, the action processing for the events from the
"Import colors" button and "delete colors" button are
described.
|
PreviewPanel |
class PreviewPanel extends JComponent implements ChangeListener, ColorSelectionListener,
MouseListener
Same as the Test code (1) |
ImportedColorsPanel |
class ImportedColorsPanel extends JComponent implements MouseListener
Additional parts to the Test code (1) are as follows.
(1) Implement the method to import an array of colors when the "Import
colors" button is clicked.
public void setImportedColors(Color[] colors)
: Implement a color duplication check and color sorting functions to the
setImportedColors method.
(2) Implement a color selection method by a mouse click.
This method can be easily implemented using the MouseListener's methods.
In addition, implementing the following two functions will be better.
• Deselect a color which is already selected.
• Select multiple colors with holding down the Shift-key or Ctrl-key.
In addition, the dark gray frames will be displayed around the selected colors.
(3)Implement a method to delete selected colors from the color palette.
public void removeCurrentColors()
|
|