- - PR -
UI プロパティの取得方法
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-05-21 19:11
お世話になっております。まさです。
テーブルのヘッダをクリックされたときに ボタンと同じく、くぼんだように見えるボーダを レンダリングしたいと思っています。 ボタンと同じように見せるというより、 ボタンが押されたときに使用される ボーダそのものを取ってきたいのですが、 UI プロパティ(言い方あってますか?)の 名前がわかりません。 <質問 その1> ボタンがクリックされたときに使用されるボーダの取得方法を教えてください。 <質問 その2> 毎回似たような事で質問するのもアホなので、 現在設定されている LookAndFeel の UI プロパティ名の一覧が取れる方法があったら教えてください。 「ヘッダにボタンそのものを置いてしまえ」て言うのは無しでお願いします(w よろしくお願いします。 | ||||||||||||
|
投稿日時: 2003-05-21 22:20
まささんこんにちは。
的確な答えにはなってないと思いますが、 その1> javax.swing.plaf.metal.MetalBorders.ButtonBorderクラス? UIマネージャのButton.border定数? その2> javax.swing.UIManager.getDefault()またはgetLookAndFeelDefaults() --> javax.swing.UIDefaultsのkeySet() ではどうでしょうか? でも、テーブルセルに比べてヘッダのレンダリングって少し面倒ですよ。 | ||||||||||||
|
投稿日時: 2003-05-21 23:05
さくらばです。
UIManager#getLookAndFeelDefaults メソッドで UIDefaults オブジェクトを 取得できるので、get メソッドで引数を "Button.border" にすれば取得でき ます。 これで取れるのは CompoundBorder クラスを派生したクラスになります。 CompountBorder の内側は MarginBorder で、外側が metal の場合は javax.swing.plaf.metal.MetalBorders クラスの内部クラスの ButtonBorder になります。このクラスはマウスの状態に応じて、描画する border を変化 させています。MetaBorders クラスは J2SDK に付属する src.zip の中に ソースがあるので参照してみてください。
UIDefaults オブジェクトから get していけばいいのですが、UIDefaults クラスの get メソッドは、メソッドの中で remove や add が行われている ため、Iteration で順に get していくと、 ConcurrentModificationException が発生してしまいます。 これを回避するために、下に示したサンプルでは UIDefaults クラスを直接 使用するのではなく、Map にコピーしています。
| ||||||||||||
|
投稿日時: 2003-05-22 13:14
Kissinger さん、さくらばさん
返信ありがとうございます。 > その1> > javax.swing.plaf.metal.MetalBorders.ButtonBorderクラス? > UIマネージャのButton.border定数? > んあああ…!そんなクラスがあったのですね… 〜ButtonUI しか目に入っていませんでした。 > その2> > javax.swing.UIManager.getDefault()またはgetLookAndFeelDefaults() > --> javax.swing.UIDefaultsのkeySet() > ではどうでしょうか? 実は、投稿前にここまではたどり着いてはいたんですが、 keySet の中にクラスが混ざっているようだったので これは UI プロパティの名称じゃないんだと思い込んでいました。 その1は、"Button.border" で、 その2は、さくらばさんのサンプルプログラムで 求めるものが得られました。 ありがとうございました | ||||||||||||
|
投稿日時: 2003-05-22 14:23
たびたびすいません。まさです。
お世話になっています。 プロパティ名称がわかったんで浮かれていたんですが… 下記のようにしてみました。 Border buttonBorder; buttonBorder = UIManager.getBorder("Button.border"); component.setBorder(buttonBorder); component は、JTableHeader のデフォルトレンダラが 返してきたコンポーネントですので JLabel でしょうか。 もしかしてボタンの場合は、 クリックされている・されていないで 動的にプロパティの値(ボーダの描画処理)が変わるんでしょうか? ButtonBorder のソースを覗いてみたんですが、 もしかして JLabel にボタンのボーダを設定しても 意味がないでしょうか? | ||||||||||||
|
投稿日時: 2003-05-22 21:03
> ButtonBorder のソースを覗いてみたんですが、
> もしかして JLabel にボタンのボーダを設定しても > 意味がないでしょうか? そのようですね。 ButtonModelのオブジェクト取り出して、マウスが押されているかどうか判断してますから。 結構面倒ですが、テーブルヘッダからマウスイベント拾って、ボーダ設定し直すことも出来ますよ。 ・テーブルヘッダ全体のボーダ換えても意味ないから、 ・マウスポインタとカラムの座標のチェックが必要だし、 ・再描画を促さなくてはならないし、 ・欲張って設計綺麗にしようとアレコレやりはじめると…。 でも、思ったほど処理は重くなりませんよ。 それよっか、まささんがやりたいことは窪んだように見せるだけじゃないでしょう? 右ボタンでメニュー出して、カラムの属性変えたり、ソートしたり、… したいのでは? | ||||||||||||
|
投稿日時: 2003-05-23 13:49
ばればれですよね。
実は、 ヘッダをクリックされたらテーブルのデータをソートしたり メニューを表示して列の表示・非表示 ってのはある程度安定したものが実装できてるんです。 次に何にこだわろうかって思った時に 「ヘッダがクリックされているように見えたらかっこいいじゃん」 となったわけです。 レンダラを自作して、 <ボタンと同じように見せる>ことも既にできていまして、 「じゃぁ何が問題なの?」って言うと ルックアンドフィールの変更や、 Windows での画面のプロパティで色の変更などを行った場合に どうするか?ってことです。 そんなこんなで、 > ボタンと同じように見せるというより、 > ボタンが押されたときに使用される > ボーダそのものを取ってきたい となったわけです。 クリックされている場合のボーダ設定を下記のようにました。 結局、Metal でも Windows でも「それらしく」みえるので 「まぁこれでもいっか」って感じです。
| ||||||||||||
1
