Java Drawing DrawTop

Language

JP  US  UK

 

ボタン

 H. Jyounishi, Tokyo Japan
 

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

要旨:トグルボタン(JToggleButton)を作成する。アクション処理はButtonOfToggleActionのactionPerformedメソッドで行う。またアクセラレータ専用のボタン(ButtonOfAccelerators)を作成する。
このページで説明するクラス: ButtonOfToggle, ButtonOfToggleAction, ButtonOfAccelerators, AcceleratorsAction
特記事項アクセラレータ設定の問題点


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)などをアクセラレータとしてボタンに設定する。

課題
説明
(a)設定法
=> "Drag Picture Demo" http://www.java2s.com/Code/Java/Swing-JFC/DragPictureDemo.htm
InputMapとActionMapを使ったctrl C(copy), ctrl X(cut), ctrl V(paste)の設定方法がそのまま載っている。
(b)TabbedPaneとの関係
[問題点]
本アプリケーションのメニュー表示にはTabbedPaneを使う。
ctrl C、ctrl Xなどをキーインしたときに、アクセラレータが設定されたボタンのあるTabbedPaneが開かれていなければアクセラレータは効かない。
[解決法]
サイズが0の特別なボタン (ButtonOfAccelerators) をTabbedPaneに配置する. このボタンはサイズが0なので見えないが、アクセラレータのレシーバーとしては機能する。
(c)キー入力、アクション処理の問題点
[Action処理での問題点]
(a)で説明した方法でアクセラレータを設定すると、ボタンのアクションを受けるactionPerformedメソッドで次の問題が起きる。

ctrl Cを入力するとアクションイベントが発生する。このとき、 e.getActionCommand()でアクションコマンド名を取得すると、ASCII制御コードのctrl C(0x03)やctrl X(0x18)が戻るため、チェックガ必要になる。

[解決法]
=> ButtonOfToggleAction.actionPerFomed, AcceleratorsAction.actionPerFomed, Util.getASCIIControlString メソッド.


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