Java Drawing DrawTop

Language

JP  US  UK

 

プルダウンメニューボタン

 H. Jyounishi, Tokyo Japan
 

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

要旨:クリックするとプルダウンメニューを表示するボタンを作成する。
 
このページで説明するクラス: ButtonOfPulldownMenu, PulldownMenuAction, JMenuEx

1. 概要

プルダウンメニューボタンは外観はボタンであるがJMenubarの拡張クラスとして作成する。 JMenuBar-JMenu-JMenuItemの階層でプルダウンメニューボタンを構成する。
アクションコマンドを始めとするほとんどの設定はJMenuに設定する。 JMenu はAbstractButtonの拡張クラスなのでボタン属性の設定ができるが、 JMenuBarはJComponentの拡張クラスなのでボタン属性の設定ができないためである。

2. ButtonOfPulldownMenuクラス 戻る=>page top
ppublic class ButtonOfPulldownMenu extends JMenuBar
フィールド
説明
menu
JMenu menu
このボタンのJMenuオブジェクト(JMenuExを含む)を設定する
menuAction
PulldownMenuAction menuAction=new PulldownMenuAction()
JMenuとメニューアイテムに設定するActionListener (PulldownMenuAction)。

メソッド
説明
コンストラクタ (1)
public ButtonOfPulldownMenu(String commandName, String tip)
ボタンにはテキストを表示する。コンストラクタではボタンの設定だけを行い、setMenuItemsメソッドでメニューアイテムの設定を行う。
引数:
commandName - コマンド名。
tip - tool tipに表示する文字列。
処理:
次のメソッドを呼んで設定を行う。

this.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));
this.setName(commandName);
this.setOpaque(false);
this.menu=new JMenuEx();
this.add(this.menu);
this.menu.setName(commandName);
this.menu.setActionCommand(commandName);
this.menu.addActionListener(this.menuAction);
this.menu.setText(commandName);
this.menu.setToolTipText(tip);
this.setStandardButtonStyle();

コンストラクタ (2)
public ButtonOfPulldownMenu(String commandName, ImageIcon imageIcon, String tip)
Creates a button with the specified ImageIcon on the button. The text (commandName) is not displayed on the button.
引数:
commandName - コマンド名。
imageIcon - ボタンに表示するImageIcon。
tip - tool tipに表示する文字列。
処理:
次のメソッドを呼んで設定を行う。

this.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));
this.setName(commandName);
this.setOpaque(false);
this.menu=new JMenu();
this.add(this.menu);
this.menu.setName(commandName);
this.menu.setActionCommand(commandName);
this.menu.addActionListener(this.menuAction);
if(imageIcon!=null) this.menu.setIcon(imageIcon);
this.menu.setToolTipText(tip);
this.setStandardButtonStyle();

setStandardButtonStyle
public void setStandardButtonStyle()
ボタンのテキスト位置、境界の表示、ForeGround, Background Colorなど標準的な属性を指定する。
setSelected
public void setSelected(boolean selected)
引数selectedをmenuに設定する。
isSelected
public boolean isSelected()
menuのisSelectedメソッドの値を返す。
setMenuItems
public void setMenuItems(String[] menuItemNames, ImageIcon[] imageIcons, String[] accelerators)
テキストとImageIconからなるメニューアイテムの設定を行う。
ボタンやチェックボックスを設定するメニューアイテムはこのメソッドを使わずに独自に設定する。引数は配列になっており、メニューアイテムの数だけ指定する。
引数:
menuItemNames - メニューアイテム名の配列。
imageIcons - メニューアイテムに表示するImageIconの配列。
accelerators - メニューアイテムに設定するアクセラレータの配列。
処理:
①メニューアイテム名とアクセラレータを表示する最大幅と最大高さを計算。
②メニューアイテムを設定する。
メニューアイテム名の文字列とIcon画像の表示位置を確実に整列させるため、各々をLabelに張りつけ、LabelのサイズをsetPreferredSizeメソッドで指定する。文字列を貼り付けるLabelのサイズは①で求めた文字列の最大表示幅にマージンを加えた値、ImageIconを貼り付けるLabelのサイズは、原画像のサイズから決める。
getTextLayoutSize
private Dimension getTextSize(String text, Font font)
引数textで指定されるテキストを、引数fontで描画するときのテキストのサイズをDimensionオブジェクトで返す。
TextLayoutオブジェクトを作成し、getAdvance、getAscent、getDescentメソッドを使ってテキストのサイズを取得する。
setSelectedMenuItem
public void setSelectedMenuItem(String menuItemName)
引数
menuItemName - 表示スタイルを変えるメニューアイテム名。
処理
このメソッドは選択図形 の属性をメニューに反映させるために使われる。 例えば選択図形がダッシュで描画されているとき、メニューアイテムを開くとつぎのように表示される。

menuItemNameとメニューアイテムに設定されているアクションコマンド名を比較する。一致すれば、メニューアイテムの背景色を白にし、BorderをLOWEREDに変える。

Border loweredBorder = new BevelBorder(BevelBorder.LOWERED);
menuItem.setBackground(Color.WHITE);
menuItem.setBorder(loweredBorder);

getMenuItem
public JMenuItem getMenuItem(JMenu menu, String menuItemName)
JMenuの下位に設定してあるJMenuItemコンポーネントを名前で検索し返す。
 Component[] components=menu.getMenuComponents();
で下位のコンポーネントの一覧を取得する。JMenuに設定できる下位コンポーネントは、JMenu、JMenuItem、JCheckBoxMenuItemの3種類である。components[i]の名前をcomponents[i].getClass().getSimpleName()で取得する。
引数のmenuItemNameと一致するか否かは次のように比較する。
∙ JMenu
JMenuItemまたはCheckBoxMenuItemが見つかるまでこのメソッドを再帰的に呼び出す。
∙ JMenuItem
JMenuItemに設定されているアクションコマンド名とmenuItemNameを比較し、一位すれば戻り値で返す。
∙ JCheckBoxMenuItem:JMenuItemと同じ
createPageButton
(static)
public static ButtonOfPulldownMenu createPageButton(int width)
引数:
width - ボタンの幅を指定する。幾つかのボタンの幅を同じにしたいときに指定する。
処理:

次の設定を行う。

String commandName=Command.getCommandLowerString(Command.PAGE);
String tip="page";
String[] menuItemNames={"next page", "previous page", "last page", "top page",
"insert new page", "delete page", "page setup"};
String[] imageName={"", "", "", "", "", "", ""};

createTextAlignButton
public static ButtonOfPulldownMenu createTextAlignButton()
処理:

次の設定を行う。

String commandName=Command.getCommandLowerString(Command.TEXT_ALIGN);
String buttonImage="text_align_left32T.png";
String[] menuItemNames={"text align left", "text align center", "text align right"};
String[] imageName={"text_align_left32T.png", "text_align_center32T.png",
"text_align_right32T.png"};

createFillColorChooser
Button
(static)
public static ButtonOfPulldownMenu createFillColorChooserButton(boolean icon)
引数:
icon - trueの時はボタンにIconを表示、falseのときはテキスト表示。
処理:

このボタンのメニューアイテムは2つで、1つ目には”no fill”のテキスト、 2つ目には”fill color”と表示したカラーチューザーボタンを貼り付ける。 この設定はsetMenuItemsではできないので、 このメソッドの中でメニューアイテムを作成する。
カラーチューザーの作成はつぎ。
Component colorChooser=ButtonOfColorChooser.createColorChooserButton("fill color", true, "", "fill color");
その他createXXXButton
=>ソースコード参照


3. PulldownMenuAction 戻る=>page top
class PulldownMenuAction extends AbstractAction

メソッド
説明
buttonOfPulldownMenu
ButtonOfPulldownMenu buttonOfPulldownMenu
このアクションを作成したButtonOfPulldownMenuオブジェクトを設定する。

メソッド
説明
コンストラクタ
PulldownMenuAction(ButtonOfPulldownMenu buttonOfPulldownMenu)
引数をフィールド変数に設定する。
actionPerformed
public void actionPerformed(ActionEvent e)
commandId と引数 (params) を次のように設定しでCommandオブジェクトを作成しExecCommandの exec メソッドを呼ぶ。
∙ commandId

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

∙ 引数

params[0]=e.getActionCommand();
params[1]=e;



5. JMenuEx 戻る=>page top
class JMenuEx extends JMenu
このオブジェクトはJMenuオブジェクトをメタリックなボタンのようにペイントする。
フィールド
説明
baseColor Color baseColor=new Color(0xCDD8F3);
ボタン下部の色。

メソッド
説明
paintComponent
public void paintComponent(Graphics g)
JMenuオブジェクトにペイントを施し、getTextメソッドで取得したテキストを表示する。


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