- PR -

UI プロパティの取得方法

1
投稿者投稿内容
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-05-21 19:11
お世話になっております。まさです。


テーブルのヘッダをクリックされたときに
ボタンと同じく、くぼんだように見えるボーダを
レンダリングしたいと思っています。

ボタンと同じように見せるというより、
ボタンが押されたときに使用される
ボーダそのものを取ってきたいのですが、
UI プロパティ(言い方あってますか?)の
名前がわかりません。

<質問 その1>
ボタンがクリックされたときに使用されるボーダの取得方法を教えてください。

<質問 その2>
毎回似たような事で質問するのもアホなので、
現在設定されている LookAndFeel の
UI プロパティ名の一覧が取れる方法があったら教えてください。


「ヘッダにボタンそのものを置いてしまえ」て言うのは無しでお願いします(w
よろしくお願いします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 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()
ではどうでしょうか?

でも、テーブルセルに比べてヘッダのレンダリングって少し面倒ですよ。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-05-21 23:05
さくらばです。

引用:

まささんの書き込み (2003-05-21 19:11) より:
<質問 その1>
ボタンがクリックされたときに使用されるボーダの取得方法を教えてください。



UIManager#getLookAndFeelDefaults メソッドで UIDefaults オブジェクトを
取得できるので、get メソッドで引数を "Button.border" にすれば取得でき
ます。

これで取れるのは CompoundBorder クラスを派生したクラスになります。
CompountBorder の内側は MarginBorder で、外側が metal の場合は
javax.swing.plaf.metal.MetalBorders クラスの内部クラスの ButtonBorder
になります。このクラスはマウスの状態に応じて、描画する border を変化
させています。MetaBorders クラスは J2SDK に付属する src.zip の中に
ソースがあるので参照してみてください。

引用:

<質問 その2>
毎回似たような事で質問するのもアホなので、
現在設定されている LookAndFeel の
UI プロパティ名の一覧が取れる方法があったら教えてください。



UIDefaults オブジェクトから get していけばいいのですが、UIDefaults
クラスの get メソッドは、メソッドの中で remove や add が行われている
ため、Iteration で順に get していくと、 ConcurrentModificationException
が発生してしまいます。

これを回避するために、下に示したサンプルでは UIDefaults クラスを直接
使用するのではなく、Map にコピーしています。

コード:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
 
public class UIDefaultShow {
    public static void main(String[] args) {
        Map defaults = new HashMap(UIManager.getLookAndFeelDefaults());

        Iterator it = defaults.keySet().iterator();
        while (it.hasNext()) {
            Object key = it.next();
            Object value = defaults.get(key);

            if (value instanceof UIDefaults.LazyValue) {
                value = ((UIDefaults.LazyValue)value).createValue(null);
            } else if (value instanceof UIDefaults.ActiveValue) {
                value = ((UIDefaults.ActiveValue)value).createValue(null);
            }

            System.out.println(key + " = " + value);
	}
    }
}


まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 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は、さくらばさんのサンプルプログラムで
求めるものが得られました。

ありがとうございました
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-05-22 14:23
たびたびすいません。まさです。
お世話になっています。


プロパティ名称がわかったんで浮かれていたんですが…

下記のようにしてみました。

Border buttonBorder;
buttonBorder = UIManager.getBorder("Button.border");
component.setBorder(buttonBorder);

component は、JTableHeader のデフォルトレンダラが
返してきたコンポーネントですので JLabel でしょうか。

もしかしてボタンの場合は、
クリックされている・されていないで
動的にプロパティの値(ボーダの描画処理)が変わるんでしょうか?

ButtonBorder のソースを覗いてみたんですが、
もしかして JLabel にボタンのボーダを設定しても
意味がないでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-05-22 21:03
> ButtonBorder のソースを覗いてみたんですが、
> もしかして JLabel にボタンのボーダを設定しても
> 意味がないでしょうか?

そのようですね。
ButtonModelのオブジェクト取り出して、マウスが押されているかどうか判断してますから。

結構面倒ですが、テーブルヘッダからマウスイベント拾って、ボーダ設定し直すことも出来ますよ。
・テーブルヘッダ全体のボーダ換えても意味ないから、
・マウスポインタとカラムの座標のチェックが必要だし、
・再描画を促さなくてはならないし、
・欲張って設計綺麗にしようとアレコレやりはじめると…。
でも、思ったほど処理は重くなりませんよ。

それよっか、まささんがやりたいことは窪んだように見せるだけじゃないでしょう?
右ボタンでメニュー出して、カラムの属性変えたり、ソートしたり、…
したいのでは?
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-05-23 13:49
ばればれですよね。

実は、
ヘッダをクリックされたらテーブルのデータをソートしたり
メニューを表示して列の表示・非表示
ってのはある程度安定したものが実装できてるんです。
次に何にこだわろうかって思った時に
「ヘッダがクリックされているように見えたらかっこいいじゃん」
となったわけです。

レンダラを自作して、
<ボタンと同じように見せる>ことも既にできていまして、
「じゃぁ何が問題なの?」って言うと
ルックアンドフィールの変更や、
Windows での画面のプロパティで色の変更などを行った場合に
どうするか?ってことです。

そんなこんなで、
> ボタンと同じように見せるというより、
> ボタンが押されたときに使用される
> ボーダそのものを取ってきたい
となったわけです。


クリックされている場合のボーダ設定を下記のようにました。
結局、Metal でも Windows でも「それらしく」みえるので
「まぁこれでもいっか」って感じです。


コード:
//  レンダリングされたコンポーネントが JComponent の場合
if ( returnValue instanceof JComponent ) {

    JComponent component;
    component = (JComponent) returnValue;

    //  コンポーネントの背景色
    Color back;
    back = component.getBackground( );

    //  コンポーネント内側のボーダ色
    Color innerColor;
    innerColor = back.darker( );

    //  コンポーネント外側のボーダ色
    Color outerColor;
    outerColor = innerColor.darker( );

    //  コンポーネント内側のボーダ
    Border innerBorder;
    innerBorder = BorderFactory.createLineBorder(innerColor);

    //  コンポーネント外側のボーダ
    Border outerBorder;
    outerBorder = BorderFactory.createLineBorder(outerColor);

    //  コンポーネントに適用するボーダ
    Border border;
    border = BorderFactory.createCompoundBorder(outerBorder
            , innerBorder);

    component.setBorder(border);
    component.setOpaque(true);
}


1

スキルアップ/キャリアアップ(JOB@IT)