1. ButtonOfToggleクラス
戻る=>page top
public class ButtonOfToggle extends JToggleButton implements DrawMenuIF,
ItemListener
フィールド
|
説明
|
action |
ButtonOfToggelAction action=new ButtonOfToggelAction();
このボタンのActionListener.
|
raisedBorder
|
protected Border raisedBorder=new BevelBorder(BevelBorder.RAISED);
ボタンが押されていないときの境界。
|
loweredBorder
|
protected Border loweredBorder=new BevelBorder(BevelBorder.LOWERED);
ボタンが押されたときの境界。
|
imageEnabled
|
ImageIcon imageEnabled
ボタンが有効(enable)なときのImageIcon。
外観はitemStateChangedメソッド参照
|
imageDisabled
|
ImageIcon imageDisabled
ボタンが無効なときのImageIcon。
|
メソッド
|
説明
|
コンストラクタ (1)
|
public ButtonOfToggle(String commandName, String tip, String[] accelerators)
ボタンにはテキストを表示。アクセラレータを文字列で指定できる。
引数:
commandName - コマンド名。
tip - tool tipに表示する文字列
accelerators - nullでなければこのボタンにアクセラレータを設定する。
"ctrl X", "ctrl C", "ctrl V", "typed
\b"など。
参照=>アクセラレータ設定の問題点
処理
次のメソッドで設定を行う。
this.setActionCommand(commandName);
this.addActionListener(this.action);
this.setName(commandName);
this.setText(commandName);
this.setToolTipText(tip);
this.setStandardButtonStyle();
this.setAccelerators(accelerators);
this.addItemListener(this);
|
コンストラクタ (2)
|
public ButtonOfToggle(String commandName, boolean setText, ImageIcon imageEnabled,
ImageIcon imageDisabled, String tip, String[] accelerators)
ボタンにはImageIconを表示する。
ImageIconはボタンが選択図形
場合とそうでない場合の2種類を指定できる。
引数:
commandName - コマンド名。
setText - trueならばボタンにコマンド名をImageIconの右側に表示する。
imageEnabled - 有効なボタンに表示するImageIcon。
imageDisabled - 無効なボタンに表示するImageIcon。
tip - tool tipに表示する文字列
accelerators - nullでなければこのボタンにアクセラレータを設定する。
"ctrl X", "ctrl C", "ctrl V", "typed
\b"など。
参照=>アクセラレータ設定の問題点
処理
次のメソッドで設定を行う。
super(imageDisabled, false);
this.setActionCommand(commandName);
this.addActionListener(this.action);
this.setName(commandName);
this.imageEnabled=imageEnabled;
this.imageDisabled=imageDisabled;
if(setText) {
this.setText(commandName);
this.setHorizontalTextPosition(SwingConstants.LEFT);
}
this.setToolTipText(tip);
this.setStandardButtonStyle();
this.setAccelerators(accelerators);
this.addItemListener(this);
|
setStandardButtonStyle
|
public void setStandardButtonStyle()
次のメソッドで設定を行う。
this.setBorder(this.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);
|
setAccelerators
|
public void setAccelerators(String[] accelerators)
∙ ButtonOfToggleActionをこのボタンのActionListenerとして設定する。
∙ KeyStroke, InputMap, ActionMapを使って文字列アクセラレータをButtonOfToggleActionに設定する。
参照=>アクセラレータ設定の問題点
|
setEnabled
|
public void setEnabled(boolean enable)
enable=trueのときimageEnabledのImageIconをボタンに表示、falseのときimageDisabledのImageIconを表示する。
下の図はundo, redoボタンの例。undoはenabel=true、redoはenabel=false。
|
itemStateChanged
|
public void itemStateChanged(ItemEvent e)
ボタンが選択されると loweredBorderの境界をボタンに設定し、選択されていないときはraisedBorderの境界をボタンに設定する。
raisedBorderloweredBorder
|
createButton (1)
(static)
|
public static ButtonOfToggle createButton(String commandName, int width,
String tip, String[] accelerators)
コンストラクター(1)を使うメソッド。ボタンにはコマンド名を表示。アクセラレータは複数設定できる。
引数:
commandName - ボタンにつけるコマンド名。この名称をボタンに表示する。
アクションコマンド名として指定する。
width - ボタンの幅を指定する。幾つかのボタンの幅を同じにしたいときに指定する。
width<0の場合は、TextLayoutを使ってボタンの幅をテキストの幅から決める。
tip - tool tipに表示する文字列。
accelerators - アクセラレータとして設定する文字列の配列。
|
createButton (2)
(static)
|
public static ButtonOfToggle createButton(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に表示する文字列。
|
createButton (3)
(static)
|
public static ButtonOfToggle createButton(String commandName, String imageEnabled,
String imageDisabled, String tip)
コンストラクタ(2)を使うメソッド。ボタンは画像(ImageIcon)表示。アクセラレータは使わない。ボタンのenable状態に応じて異なるImageIconをボタンに表示する。
引数:
commandName - ボタンにつけるコマンド名。この名称をボタンに表示する。
アクションコマンド名として指定する。
setText - setText=trueならばボタンにテキストとIconを表示する。falseならばIconだけを表示する。
imageEnabled - 有効なボタンのImageIcon画像のファイル名。
imageDisabled - 無効なボタンのImageIcon画像のファイル名。
DrawImageIconでパス名を追加するので、ここではパス名は不要。
"rectangle.png", "ellipse.png", "group.png"など
tip - tool tipに表示する文字列。
|
2. ButtonOfToggleAction
戻る=>page top
class ButtonOfToggelAction extends AbstractAction
ボタンが押されたときのアクションを記述する。AbstractActionの拡張クラス。
メソッド
|
説明
|
actionPerformed
|
public void actionPerformed(ActionEvent e)
①ActionEvent eから次の値を取り出す。
∙ アクションコマンド名:String commandName=e.getActionCommand();
∙ アクションの起きたコンポーネント名:String componentName=((Component)e.getSource()).getName();
(注) アクションコマンド名がASCII制御文字ならば、Util.getASCIIControlStringメソッドでチェックし、アクションコマンド名を設定しなおす。
②コマンドディスパッチャーExecCommandへ渡すコマンド列をCommandクラスのコンストラクタで作成し、ディスパッチャーを呼び出す。
∙ コマンドId:int commandId=Command.getCommandId(commandName)で取得。
∙ コマンド列作成:Command command=new Command(commandId, Command.callFromMenu,
null)
ButtonOfToggleではコマンドパラメータ(引数)は作成しないのでnullを指定。
∙ ディスパッチャー呼び出し:execCommand.exec(command)
|
3. ButtonOfAcceleratorsクラス
戻る=>page top
public class ButtonOfAccelerators extends JButton
>
キーボードアクセラレータ (ctrl+x, ctrl+c, ctrl+v, ctrl+a, Delete key etc.)専用のボタンで、
サイズが0のためツールバーに配置しても見えないが、アクセラレータの中継器のように動作する。
ctrl+x, ctrl+c, ctrl+v: Crtl キーを押したまま
x/c/v キー(大文字でも可)を押す。
メソッド
|
説明
|
Constructor
|
public ButtonOfAccelerators(String commandName, String[] accelerators)
引数:
commandName - コマンド名
accelerators - アクセラレータを表す文字列の配列。
"ctrl x", "ctrl c", "ctrl v", "ctrl
h"(Back space), "DELETE" など
=><
アクセラレータ設定の問題点
処理:
this.setName(commandName);
this.setActionCommand(commandName);
|
setAccelerators
|
public void setAccelerators(String accelerators)
引数:
accelerators - アクセラレータを表す文字列の配列。
"ctrl x", "ctrl c", "ctrl v",
"ctrl h"(Back space), "DELETE" など
処理:
アクセラレータの文字列をjavax.swing.KeyStroke, javax.swing.InputMap, javax.swing.ActionMapを使ってボタンに設定する。
KeyStroke stroke = KeyStroke.getKeyStroke(accelerators[i]);
InputMap inputMap = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(stroke, accelerators[i]);
ActionMap actionMap = this.getActionMap();
actionMap.put(accelerators[i], action);
=>
アクセラレータ設定の問題点
|
createEditAccelerators
(static)
|
public static ButtonOfAccelerators createEditAccelerators(String commandName)
編集関連(cut, copy, paste,del)のアクセラレータ」を設定したボタンを作成する。
引数:
commandName - コマンド名
処理:
新しいButtonOfAccelerators object を作成して戻り値で返す。
コンストラクターには次の引数を渡す。
String[] accelerators={"ctrl x", "ctrl c", "ctrl
v", "ctrl a", "delete"};
|
4. AcceleratorsAction
戻る=>page top
class AcceleratorsAction extends AbstractAction
ボタンが押されたときのアクションを記述する。AbstractActionの拡張クラス。
メソッド
|
説明
|
actionPerformed
|
public void actionPerformed(ActionEvent e)
∙ ActionEvent eからアクションコマンドを取り出す。
String commandName=e.getActionCommand();
ここでcommandNameがASCII制御文字ならば、Util.getASCIIControlStringメソッドを使って
"ctrl X", "ctrl C", "ctrl V", "ctrl
A", "delete"などの文字列に変換し、commandNameに設定する。
∙ コマンドをCommandクラスのコンストラクタで作成し、ディスパッチャーを呼び出す。
コマンドId:int commandId=Command.getCommandId(commandName)で取得。
コマンド列作成:Command command=new Command(commandId, Command.callFromMenu, null)
ButtonOfToggleではコマンドパラメータ(引数)は作成しないのでnullを指定。
ディスパッチャー呼び出し:execCommand.exec(command)
|
: アクセラレータ設定の問題点
戻る=>page top
良く使うctrl C(copy), ctrl X(cut), ctrl V(paste), typed \b(Backspace)などをアクセラレータとしてボタンに設定する。
|