Java Drawing DrawTop

Language

JP  US  UK

 

カラーチューザーボタン

 H. Jyounishi, Tokyo Japan
 

Frame (Index), No frame                 version:0.3(latest)  

要旨:クリックするとカラーチューザー(CustomColorChooserDialog)を表示するボタンを作成する。
このページで説明するクラス: ButtonOfColorChooser, ColorChooserAction, CustomColorChooserDialog, ColorSelectionListener , ColorSelectionEvent
=>DrawTest Custom Color Chooser

1. 概要
1.1 ButtonOfColorChooserを使うコマンド
(1) fill color
ボタンの"fill color"メニューアイテムにButtonOfColorChooserが設定されている。
(2) line color
ボタンの"line color"メニューアイテムにButtonOfColorChooserが設定されている。
(3) font color:
fontボタン() を押すと下図の"font menu"ダイアログが表示される。 ボタンにButtonOfColorChooserが設定されている。

fill color line color font color
図1 各ボタンの外観


1.2 ButtonOfColorChooseをクリックしたときの処理
(1) ButtonOfColorChooserをクリックする操作は次の3通りである
・fill colorボタンの"fill color"メニューを選んだとき
・line colorボタンの"line color"メニューを選んだとき
ボタンをクリックしたとき
(2) ButtonOfColorChooserをクリックしたときの処理

ButtonOfColorChooserのアクション処理を行うColorChooserAction オブジェクトのactionPerformedメソッドが呼び出される。

public void actionPerformed(ActionEvent e) {
this.commandName=e.getActionCommand();
 ............................
CustomColorChooserDialog dialog=ObjectTable.getCustomColorChooserDialog();
String title="";
if(this.commandName.equals("fill color")) title=" Command: fill color";
if(this.commandName.equals("line color")) title=" Command: line color";
if(this.commandName.equals("font color")) title=" Command: font color";
dialog.commandLabel.setText(title);
dialog.removeColorSelectionListener();
dialog.addColorSelectionListener(this);
dialog.showDialog(this.commandName);
}


[説明]

e.getActionCommand()でコマンド名を取得。"fill color", "line color", "font color"のいずれかである。
ObjectTableからCustomColorChooserDialogオブジェクトを取得し次の処理を行う。

Step1 CustomColorChooserDialogに表示するタイトル("Command: fill color"など)を指定

図(b)上段の黒い帯(パネル)に表示する文字列。


Step2 ColorSelectionListenerを再設定

CustomColorChooserDialogのOKボタンをクリックしたときに色を受け取る オブジェクトであるColorChooserActionオブジェクトを設定する。OKボタンをクリックしたときはそのアクション処理を行う colorSelectedメソッドが呼び出される。


Spep3 showDialogにコマンド名を渡してCustomColorChooserDialogを表示する。

: CustomColorChooserDialogオブジェクト

ButtonOfColorChooserオブジェクトは"fill color", "line color", "font color"コマンドごとに3個作成するが、CustomColorChooserDialogオブジェクトは DrawMainで1個だけ作成し ObjectTableに登録する。
CustomColorChooserDialogオブジェクトを1個しか作成しない理由は次のような点である。
"fill color", "line color", "font color"コマンドのどのコマンドからどういう順序で呼び出されても、 次の2つのデータを継続的に利用できるようにする。
(a)CustomColorChooserDialogにインポートした色情報。
(b)CustomColorChooserDialogの表示位置。

もしCustomColorChooserDialogオブジェクトをコマンドごとに3個作成すると、上記(a), (b)のデータを継続的に利用するためには、(a), (b)のデータを保持するクラスを別途用意する必要がある。これは煩雑である。


1.3 CustomColorChooserDialogのOKボタンをクリックしたときの処理
ColorSelectionListenerをインプリメントしている ColorChooserActionオブジェクトの colorSelectedメソッドが呼び出される(上記(2))。

public void colorSelected(ColorSelectionEvent event) {
Color selectedColor = event.getColor();
if(selectedColor==null) return;
Object[] args = new Object[1];
args[0] = selectedColor;
int commandId = Command.getCommandId(this.commandName);
if (commandId < 0) {
System.err.println("*** Error ColorChooserAction: specified command not found;" + commandName);
return;
}
Command command = new Command(commandId, Command.callFromMenu, args);
ExecCommand execCommand = ObjectTable.getExecCommand("ColorChooserAction");
execCommand.exec(command);
}

[説明]
ColorSelectionEventから色を取り出し、コマンド("fill color", "line color"または "font color"コマンド)を作成してExecCommand.execメソッドを呼び出してコマンドを実行する。


2. ButtonOfColorChooserクラス 戻る=>page top
public class ButtonOfColorChooser extends JToggleButton implements DrawMenuIF

フィールド
説明
action ColorChooserAction action=new ColorChooserAction(this);
このボタンのActionListener.
currentColor
Color currentColor
カラーチューザーで選ばれた色を設定する。

メソッド
説明
コンストラクタ (1)
ColorChooserButton(String commandName, String tip)
ボタンにはテキストを表示する。このボタンを押すとダイアログが開く。
引数:
commandName - コマンド名。
tip - tool tipに表示する文字列
処理
次のメソッドで設定を行う。

this.setActionCommand(commandName);
this.addActionListener(this.action);
this.setName(commandName);
this.setText(commandName);
this.setToolTipText(tip);
this.setStandardButtonStyle();

コンストラクタ (2)
public ButtonOfColorChooser(String commandName, boolean setText, ImageIcon imageIcon, String tip)
引数:
commandName - コマンド名。
setText - trueならばボタンにコマンド名をImageIconの右側に表示する。
imageIcon - ボタンに表示するImageIcon。
tip - tool tipに表示する文字列
処理
次のメソッドで設定を行う。

super(imageIcon);
this.setActionCommand(commandName);
this.addActionListener(this.action);
this.setName(commandName);
if(setText) setText(commandName);
this.setToolTipText(tip);
this.setStandardButtonStyle();

setStandardButtonStyle
public void setStandardButtonStyle()
次のメソッドを呼んで設定を行う。

Border raisedBorder = new BevelBorder(BevelBorder.RAISED);
this.setBorder(raisedBorder);
this.setIconTextGap(0);
this.setHorizontalTextPosition(SwingConstants.CENTER );
this.setVerticalTextPosition(SwingConstants.BOTTOM );
this.setHorizontalAlignment(CENTER);
this.setFont(MenuConstants.MenuFont);
this.setBackground(null);
this.setForeground(Color.BLACK);
this.setOpaque(true);

getCurrentColor
public Color getCurrentColor()
currentColorを返す。
setCurrentColor
public void setCurrentColor(Color color)
パラメータをcurrentColorに設定する。
createColorChooser
Button (1)

public static JButton createColorChooserButton(String commandName, int width, String tip)
コンストラクター(1)を使うメソッド。ボタンにはコマンド名を表示。アクセラレータは複数設定できる。
引数:
commandName - ボタンにつけるコマンド名。この名称をボタンに表示する。
アクションコマンド名として指定する
width - ボタンの幅を指定する。幾つかのボタンの幅を同じにしたいときに指定する。
width<0の場合は、TextLayoutを使ってボタンの幅をテキストの幅から決める。
tip - tool tipに表示する文字列。
createColorChooser
Button (2)

public static JButton createColorChooserButton(String commandName, boolean setText, String imageName, String tip)
コンストラクタ(2)を使うメソッド。ボタンにテキストと画像(ImageIcon)を表示できる。ImageIconを表示するのがデフォールトで、setText=trueならばテキストをも表示する。
引数:
commandName - ボタンにつけるコマンド名。この名称をボタンに表示する。
アクションコマンド名として指定する
setText - setText=trueならばボタンにテキストとIconを表示する。falseならばIconだけを表示する。
imageName - ImageIcon画像のファイル名。

DrawImageIconでパス名を追加するので、ここではパス名は不要。
"rectangle.png", "ellipse.png", "group.png"など

tip - tool tipに表示する文字列。


3. ColorChooserActionクラス 戻る=>page top
 class ColorChooserAction extends AbstractAction implements ColorSelectionListener

メソッド
説明
actionPerformed
public void actionPerformed(ActionEvent e)
∙ CustomColorChooserDialogをshowDialogメソッドで表示する。

CustomColorChooserDialogはDrawMain でオブジェクトが作成されObjectTableに登録されている。

∙ CustomColorChooserDialogを表示させるコマンドの名称をダイアログに表示する。

コマンド名称はfill color, line colorまたはfont color

ColorSelectionListenerをこのオブジェクトに設定する

設定の前に現在登録されているColorSelectionListenerを削除する。
dialog.removeColorSelectionListener();
dialog.addColorSelectionListener(this);
dialog.showDialog();

colorSelected public void colorSelected(ColorSelectionEvent event)
colorSelectedはColorSelectionListenerの定義するメソッド。
CustomColorChooserDialogのOKボタンを押したときの色を取得する。
Color selectedColor = event.getColor();
∙ 次のようにcommandIdと引数を設定してCommandオブジェクトを作成し、 ExecCommandexecメソッドを呼ぶ。
(a)commandId

int commandId
=Command.getCommandId (this.buttonOfPulldownMenu.menu.getActionCommand());

(b)引数

params[0]=selectedColor;



4. CustomColorChooserDialogクラス 戻る=>page top
public class CustomColorChooserDialog extends JDialog implements ActionListener, ComponentListener, WindowListener, SelectionListener
JColorChooser.showDialogで表示されるダイアログに代わるカラーチューザーダイアログ


図(a) JColorChooserのダイアログ 図(b) CustomColorChooserDialogのダイアログ

CustomColorChooserDialogの機能
機能
説明
(1)import colorsボタン
=>図(b)
• 初期状態

DrawTopを開始して初めてカラーチューザダイアログを開いたときは、"imported colors"パネルには何も色は取り込まれていない。但し参考のためWhite, Black, Red, Green, Blueだけを表示している。色の取り込みは次の手順で行う。


• 色の取り込み(Import)

画面上の図形を選択し "imported colors"ボタンをクリックするとすると、 選択図形に設定されている色(fill color, line color)およびテキストの色(font color)を全てImported colorsパネルに取り込む。


• 色を選択図形、選択テキストに指定

図形またはテキストに色を指定するときは、JColorChooserパネルで色を選択するか、 "Imported colors"パネル上の色をクリックして選択する。選択された色はPreviewパネルに表示され、 OKボタンを押すと図形またはテキストに色を設定する。

(2)delete colorsボタン "Imported colors"パネルの色を選択してdelete colorsボタンを押すとパネルの色が削除される。ShiftキーまたはCtrlキーを押しながら続けてクリックすると、複数の色を選択できる。選択された色はダークグレイの枠で表示される。
(3)このダイアログで設定した色の受け取り方 =>1.3
ColorSelectionListenerインターフェイスをインプリメント(implements)。
colorSelectedメソッドをインプリメント。

public void colorSelected(ColorSelectionEvent event) {
Color color = event.getColor();
}


このダイアログから色を受け取るオブジェクトはColorChooserAction


フィールド
説明
commandName String commandName="";
図(b)上段の黒いパネルに表示されている名称。カラーチューザーダイアログを開いたコマンド名で、"fill color", "line color", "font color"のいずれか。
commandLabel JLabel commandLabel;
図(b)上段の黒いパネル。コマンド名を表示する。
colorChooser
JColorChooser colorChooser

図(b)上段のカラーチューザパネルオブジェクト

previewPanel PreviewPanel previewPanel

図(b)下段左のプレビューパネルオブジェクト

importedColorsPanel ImportedColorsPanel importedColorsPanel

図(b)下段右の取り込みパネルオブジェクト

dialogLocation Point dialogLocation=new Point(100, 100);

ダイアログの表示位置。DrawMainのフレームに対する相対位置。

okButton JButton okButton

OKボタンオブジェクト

cancelButtonl JButton cancelButtonl

Cancelボタンオブジェクト

importButton JButton importButton

importedColorsPanel 上のImportボタンオブジェクト

deleteButton JButton deleteButton

importedColorsPanel 上のDeleteボタンオブジェクト

listenerList protected EventListenerList listenerList = new EventListenerList();

ColorSelectionListenerを格納するリスト。 ColorSelectionListenerをインプリメントしたクラスはpreviewPanel


メソッド
説明
コンストラクタ
public CustomColorChooserDialog(JFrame frame)
引数:
frame - このダイアログを設定するのフレーム。
処理: initializeDialogを呼んでこのダイアログを初期化
initializeDialog public void initializeDialog()
このダイアログを初期設定を行う
• colorChooser、importedColorsPanel、previewPanelオブジェクトの作成とフィールド変数への設定
• 各種ボタン類の作成とフィールド変数への設定
showDialog public void showDialog(String commandName)
commadName - "fill color", "line color", "font colorのどれか"
 
このダイアログを表示する。このダイアログをWindowListenerとして設定する。
: colorChooserimportedColorsPanelへの初期設定

this.getColorChooser().setColor(Color.WHITE);
this.getColorChooser().setColor(Color.BLACK);
Color[] colors={Color.WHITE, Color.BLACK, Color.RED, Color.GREEN, Color.BLUE};
this.getImportedColorsPanel().setImportedColors(colors);

getCommandName protected String getCommandName()
commandNameを返す。
getColorChooser protected JColorChooser getColorChooser()

colorChooserを返す。

getPreviewPanel protected PreviewPanel getPreviewPanel()

previewPanelを返す。

getImportedColorsPanel protected ImportedColorsPanel getImportedColorsPanel()

importedColorsPanelを返す。

setPreviewColor public void setPreviewColor(Color color, String command)

previewPanelに色を設定する。

getPreviewColor public Color getPreviewColor(String command)

previewPanelの色を返す。

actionPerformed public void actionPerformed(ActionEvent e)
OK, Cancelボタン、importedColorsPanelのimportチェックボックス、deleteボタンのアクション処理を行う。
(注) importチェックボックス、deleteボタンはimportedColorsPanelのコンポーネントなので、importedColorsPanelでアクション処理を行えばよいわけだが、全体の制御を分かりやすくするため、ここで処理する。
• OKボタン

previewPanelの色を取得し、 fireEventメソッドでColorSelectionEventを作成する。

• Cancelボタン - closeDialogを呼ぶ
• importボタン

選択されている図形の色をインポートする。

• deleteボタン

importedColorsPanelから色を削除する。

importColors public void importColors()
選択されている図形の色をimportedColorsPanelに設定する。
selected public void selected(SelectionEvent event)
SelectionListenerの定義するメソッド
選択した図形から色を取り出す処理を行う
=>(1)import colorsチェックボックス
addColorSelection
Listener
public void addColorSelectionListener(ColorSelectionListener listener)
OKボタンを押したときに、色選択イベントを受け取るために、ColorSelectionListenerをインプリメントしたオブジェクトをlistenerListに登録する。
ColorSelectionListenerをインプリメントするクラスはColorChooserAction
=>(3)このダイアログで設定した色の受け取り方
removeColorSelection
Listener
public void removeColorSelectionListener(ColorSelectionListener listener)
上記登録したオブジェクトをlistenerListから削除する。
removeColorSelection
Listener
public void removeColorSelectionListener()
listenerListからすべてのオブジェクトを削除する。
fireEvent public void fireEvent(ColorSelectionEvent event)
このダイアログが色を選択したときに、listenerListに登録されているオブジェクトに通知する。
closeDialog protected void closeDialog()
このダイアログを閉じる。
removeColorSelectionListenerを呼んで、listenerListからすべてのオブジェクトを削除する。
SelectionLSremoveSelectionListenerを呼んで、このダイアログのSelectionListenerとしての登録を削除する。
windowClosing public void windowClosing(WindowEvent e)
WindowListenerのメソッド。これ以外のメソッドでは何もしない。
このダイアログを閉じる。
componentMoved public void componentMoved(ComponentEvent e)
ComponentListenerのメソッド。これ以外のメソッドでは何もしない。
dialogLocationにダイアログの現在位置をセットする。


5. ColorSelectionListener インターフェイス 戻る=>page top
interface ColorSelectionListener extends EventListener

メソッド
説明
colorSelected
public void colorSelected(ColorSelectionEvent event)
色選択のアクションが発生したときに呼び出されるメソッド。.


6. ColorSelectionEventクラス 戻る=>page top
Class ColorSelectionEvent

フィールド
説明
color
Color color
図形をクリックして選択したとき"clicked"、マウスドラッグで図形を選択したとき"dragged"。

メソッド
説明
コンストラクタ
public ColorSelectionEvent(Object source, Color color)
引数をcolorフィールド変数に設定
getColor public Color getColor()
colorフィールド変数の値を返す。


Copyright (c) 2009-2013
All other trademarks are property of their respective owners.