Q140:複数のコンボボックスの処理に悩んでいます。多数の選択候補の中から複数を選択する方法としてどのようなものがあるか。
Q140-1:
自分が作成した検索ソフトでコンボボックスが複数個あると思いますが、利活用研究会ではこの複数のコンボボックスの処理に悩んでいます。グループコードや材質は「or」で繋いで検索するのですが、数個程度のコンボボックスを「or」で繋ぐようでしたら、チェックボックスが良いのではないかと思います。ただ、実際グループコード(弊社でいう営業所)は数か所なので問題ないのですが、材質は数十種類はあるので、コンボボックスや、チェックボックスでは実用的ではありません。実務では例えば、SS400やS50C、S45C・・・すべてをorで繋ぐといったことも多く、チェックボックスでも対応できるか微妙です。
自分としましては、Excel 2007でオートフィルタを使った時に出てくるコンボボックス+チェックボックスのようなコンポーネントがあると良いと思うのですがそういったもの、もしくはそれに代わる機能を使うことは可能でしょうか?
A140-1:
お問い合わせの件、多数の選択候補の中から複数を選択する方法としてどのようなものがあるか、というご質問と理解してお答えいたします。
もっとも簡単なのはリストコンポーネントを使うことです。リストコンポーネントでは、CtrlキーあるいはShiftキーを押しながらクリックすることで複数項目を選択することが可能です。選択されている項目の一覧は、「選択されている項目の名称をリストで取得する()」メソッドにより取得できます。
コンボボックスのように、選択候補の一覧を開いたり閉じたりすることが必要であれば、テーブルコンポーネントのサイズを動的に変更することで、コンボボックス風の動作を行うことができます。ご参考までにサンプルを用意しましたので、ご覧ください。
このサンプルアプリケーションでは、テーブルのヘッダ部分をクリックするたびにサイズが変わり、コンボボックスのような動作を示します。
関連ファイル:コンボボックス風テーブル.mzax
Q140-2:
コンボボックス風テーブルのサンプルを以前頂き、理解しようとしていたのですが、ほとんどの処理は理解できるのですが、一点躓く点があったので質問させて下さい。(回答はゆっくりお待ちします)
大まかな処理の流れを追っていった時に、最初のテーブルヘッダのクリックでは、テーブルの大きさは変化しないように思えるのですがどこの部分で変化するのでしょうか?
つまり、最初にテーブルの大きさを寸法格納変数に入れて、否定演算のオペランドをtrueに設定し、テーブルがクリックされたらFalseにして、変化があった場合のテーブルの高さを取得、設定し、それをテーブルコンポーネントに設定して大きさを決めています。
ここで疑問なのが、最初のクリックの時はテーブルの大きさを取得し、そのまま設定しているだけなので、大きさは変化しないはずなんです。
でも実際は最初のクリックで大きさが高さ150に変化します。
否定演算のオペランドの初期値をfalseにすると、自分が思い描いた処理の流れになり、反対に感じます。どこがおかしいのでしょうか?
A140-2:
テーブルの高さを誤解されているのではないでしょうか。お送りしたアプリケーションでは、テーブルの高さを以下の2通り用意し、クリックするたびに変更しています。
(a) テーブル列ヘッダの高さ(メソッド戻り値: getColumnHeaderHeight)
(b) 150
初期状態ではテーブルの高さは150で、最初のクリックで列ヘッダの高さに縮むようになっています。すなわち、テーブルの高さは大きい方の値が150で、小さい方の値がgetColumnHeaderHeightメソッドの戻り値です。
したがって、最初にクリックしたときの動作は「テーブルの大きさを取得し、そのまま設定している」のではなく、幅はそのままで、高さを列ヘッダ分にしているということです。
Q140-3:
前回の回答により、テーブルの大きさと縮んだ時の大きさを逆だと勘違いしていたのは分かりました。
テーブルってパネルのような部分を表しているということでデータが入っている背景が白の部分ではないということですね。
それで、テーブルヘッダの高さというのが縮んだ高さということで理解しました。
そうすると、アプリケーションが開始された時の処理で一点疑問があります。
最初にテーブルの推奨サイズを取得し、それを寸法格納変数に格納しています。
今回のサンプルでは、テーブルの高さは150なんですし、この処理を行う意味が分かりません。<質問@>
テーブルの高さが、背景が白の部分なら「実行設定可」の画面で増減させることが可能なので、取得する意味があると思うのですが。。
また、メソッドの説明にある、推奨サイズというのはいったい何でしょうか?<質問A>
A140-3:
> 最初にテーブルの推奨サイズを取得し、それを寸法格納変数に格納しています。
>
> 今回のサンプルでは、テーブルの高さは150なんですし、この処理を行う意味が分かりません。<質問@>
この処理の意味は2つあります。1つは幅を設定することです。もう1つは、寸法格納変数のデータの初期設定です。寸法格納変数を含め、変数コンポーネントのデータは初期状態ではNULLですので、最初にデータを設定しておく必要があります。
もちろん、幅はテーブルの「getWidth()」メソッドで取得することもできますので、初期設定では空の寸法を設定しておき、「寸法(Dimension)にサイズ(int)を設定する(int,int)」メソッド実行時に、「getWidth()」メソッドの戻り値を幅として引数に与えても同じ結果が得られます。
> また、メソッドの説明にある、推奨サイズというのはいったい何でしょうか?<質問A>
推奨サイズ(PreferredSize)というのは「できることならこの幅と高さになってほしい値」として指定する寸法のことです。これはJava由来の属性で、画面配置を手動配置や横方向整列、縦方向整列にしているときには、この寸法が画面表示寸法となります。(画面配置につきましては、開発チュートリアル(応用編)Lesson.7 Step.7に説明がございます。)
一方、領域配置や矩形分割配置のように、ウィンドウや他のコンポーネントのサイズに合わせて大きさが変更されるような配置方法の場合には、必ずしも推奨サイズで指定された寸法にはなりません。
備考:「コンボボックス」の「Q&A16」にも掲載。