はじめに
前回の記事では、findComponentをみてみました。
GUI上のコンポーネントのアクセスを、検索し使用するという方法がfindComponentでした。
ビルダーツールでコンポーネントで配置し、コンポーネントのプロパティに名前を設定します。検索する条件は名前のついたコンポーネントです。《意味のあるコンポーネントには名前がついている》というルールにしたがい、findComponentは対象となるコンポーネントをみつけだします。
図1 find foo

その際のGUI上のコンポーネントのアクセスをfindComponentで統一させしまうと、使用するたびに検索してしまうことです。
解決方法
単純な解決方法は、見つけ出したコンポーネントを連想配列(Map)に格納してしまうことです。
Mapには、キーに《コンポーネントの名前》、値にコンポーネントを格納します。
図2

下記はユーテリティメソッドの実装です。
toMapメソッド
public static Map<String, Component> toMap(Component[] components) {
Map<String, Component> map = new HashMap<String, Component>();
for (Component component : components) {
map.put(component.getName(), component);
}
return map;
}
この実装ですと、同じ名前を設定しているコンポーネントが複数ある場合は、正しく動作しません。
つぎに、単純にキーを複数もてるMapを採用してみます。ひとつのキーで複数の値を扱うためにorg.apache.commons.collections.map.MultiValueMap(参考文献)を採用してみます。MultiValueMapは値が一つでもListに値を格納してから返すので若干使いづらいかもしれません。
MultiValueMap採用版
//import org.apache.commons.collections.map.MultiValueMap;
public static <T extends Component> Map<String, List<T>> toMap(
Component[] components) {
Map<String, List<T>> map = new HashMap<String, List<T>>();
MultiValueMap multiValueMap = MultiValueMap.decorate(map);
for (Component component : components) {
multiValueMap.put(component.getName(), component);
}
return multiValueMap;
}
参考文献(書籍、ハイパーリンク)
- MultiValueMapはjakarta commonsのコレクション操作のためのライブラリに含まれています。