SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~リッチなGUIを構築する「Vaadin」(2)

第11回

メニューバーの作成

 さまざまな処理を呼び出すためのインターフェースとして、一般のアプリケーションで多用されているのがメニューバーです。Webアプリケーションでも、最近はメニューバーを持つサイトが増えてきました。しかし、メニューバー(特に階層メニュー)は、多数のオブジェクトが入れ子構造になっており、作るのも管理するのも面倒そうです。

 Vaadinでは、非常に簡単にメニューバーを作るコンポーネントが用意されています。「MenuBar」と「MenuItem」というもので、MenuBarがメニューバーを管理するもの、MenuItemが実際にメニューバーに組み込まれるメニュー項目のコンポーネントです。

 MenuBar/MenuItemには「addItem」というメソッドが用意されており、これを呼び出すことでMenuItemを組み込むことができます。MenuBarに組み込んだものはそのままメニューバーにメニューとして表示され、組み込まれたMenuItemにさらにMenuItemを組み込めばそのメニューに表示されるメニュー項目に、さらにその中にMenuItemを組み込めばサブメニューの項目として表示されます。MenuItemを組み込んでいくことで、どんどん階層的なメニューが作成されるわけです。

public void init() {
	mainWindow = new Window("Myvaadin Application");
	VerticalLayout layout = (VerticalLayout)mainWindow.getContent();
	layout.setMargin(true);
	layout.setSpacing(true);
	Command cmd = new Command() {
		@Override
		public void menuSelected(MenuItem selectedItem) {
			mainWindow.showNotification(selectedItem.getText() + " を選択。");
		}
	};
	MenuBar bar = new MenuBar();
	MenuBar.MenuItem menu = bar.addItem("メニュー",null);
	menu.addItem("メニュー項目1", cmd);
	menu.addItem("メニュー項目2", cmd);
	menu.addSeparator();
	MenuBar.MenuItem item  = menu.addItem("メニュー項目3",null);
	item.addItem("サブ項目1", cmd);
	item.addItem("サブ項目2", cmd);
	layout.addComponent(bar);
	setMainWindow(mainWindow);
}

 このサンプルでは[メニュー]というメニューに3つのメニュー項目を用意し、さらに3番目のメニュー項目にはサブメニューを2つ用意しています。各メニューは、選ぶと選択したメニュー名が表示されるようになっています。ここではMenuBarをnewで作成した後、addItemで項目を追加していますが、このメソッドは次のような形で呼び出します。

《MenuBar/MenuItem》.addItem( 表示するテキスト ,《Command》);

 第1引数に指定したテキストがそのままメニューに表示されます。第2引数には、Commandクラスのインスタンスを渡します。これは、メニューを選んだ時に実行する処理を管理するためのインターフェースで、menuSelectedというメソッドを1つ持っています。引数には選択したメニュー項目であるMenuItemインスタンスが渡されます。

 メニューを階層的に組み込むときに注意するべきことは、addItem時の第2引数のCommandです。あるMenuItemに、さらにサブ項目があるとき、そのMenuItemにはCommandを指定してはいけません。例えばこのサンプルでは、"メニュー"と"メニュー項目3"では、addItem時に第2引数にはnullが指定されていることが分かります。

 Commandは、メニューを選択したときに処理を実行することです。サブメニューを持つメニューは、それを選んだ時にサブメニューを表示するだけで何かの処理を実行することはありません。Commandを指定してしまうと、サブメニューの表示よりそのCommandの実行が優先されてしまい、サブメニューが表示されなくなってしまいます。

Panelによる表示

 コンポーネントについて一通り説明しましたので、次はコンテナについて取り上げましょう。コンテナは、自身の中にコンポーネントを組み込み表示するタイプのコンポーネントで、AWT/Swingでもおなじみです。

 コンテナのもっとも基本となるのはパネルというものです。これは「Panel」というクラスとして用意されています。new Panelで新しくインスタンスを作成し、そこに「addComponent」でコンポーネントを組み込んでいきます。

public void init() {
	Window mainWindow = new Window("Myvaadin Application");
	setMainWindow(mainWindow);
	VerticalLayout layout = (VerticalLayout) mainWindow.getContent();
	layout.setMargin(true);
	layout.setSpacing(true);
	Panel panel = new Panel("※これがパネルです。");
	panel.setWidth("300px");
	panel.setHeight("200px");
	VerticalLayout playout = (VerticalLayout) panel.getContent();
	playout.setMargin(true);
	playout.setSpacing(true);
	layout.addComponent(panel);
	String s = "<h2>Panel</h2><p>パネルは、コンポーネントをまとめるコンテナです。</p>";
	Label label = new Label(s,Label.CONTENT_XHTML);
	playout.addComponent(label);
}
Panelの利用例。四角いエリアがPanel
Panelの利用例。四角いエリアがPanel

 実際に使ってみると、Panelの働きがよく分かります。この例では、ページ内に四角いエリアが表示され、その中にテキストが表示されます。このエリアがPanelなのです。Panelを利用することで、ページ内に独立したエリアを用意しコンテンツを配置できます。

次のページ
タブパネルによる切り替え表示

この記事は参考になりましたか?

Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4942 2010/03/11 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー