1

具体的には、現在、TitledBorder を持つ JPanel を持っています。境界線の外観をカスタマイズしたい。私のアプリの現在の状態では、タイトルは描画されますが、境界線自体は描画されません。

imagePainter を Panel オブジェクトの panelBorder メソッドにバインドすると、パネルの周りにカスタム イメージを配置できますが、コードで境界線を明示的に設定していないパネルにのみ表示されます。そのコードは次のようになります。

<style id="PanelStyle">
    <state>
        <imagePainter method="panelBorder" path="images/thick border.png" sourceInsets="3 3 3 3" />
    </state>
</style>
<bind style="PanelStyle" type="region" key="Panel" />

逆に、このカスタム イメージを、TitledBorder を適用したパネルにのみ表示するにはどうすればよいですか?

名前付きパネルも使用してみました:

panel.setName("MyPanel")

および名前バインディング:

<bind style="PanelStyle" type="name" key="MyPanel">

これにより、特定のパネルのみのスタイルを変更できるので便利です。ただし、元の問題は解決しません。パネルの NamedBorder をカスタマイズすることはまだできません。

NamedBorder を指定すると、PanelBorder ペインターは無視され、名前だけが出力されます。NamedBorder を取り除けば、カスタム ボーダー グラフィックを使用できますが、以前のタイトルと同じ場所に JLabel を取得するために、レイアウトを突っ込んで突き刺す必要があり、これは望ましくありません。

さらなる調査により、レンダリングされた行がない理由は、TitledBorder のコンストラクターが、タイトルに加えてレンダリングする別の Border の引数を取るためであることが明らかになりました。この引数を渡していませんでした。デフォルトは、選択した L&F によって異なります。System L&F を使用していたとき、デフォルトは LineBorder でした。どうやら Synth のデフォルトは EmptyBorder です。LineBorder を明示的に指定すると、行が元に戻り、問題のほとんどが解決されます。

私の問題の残りの部分は、LineBorder にカスタム グラフィックを使用することです。今のところ、カスタム グラフィックを 2 番目の PanelBackground イメージとしてレンダリングすることで取得しています。これは実際の背景の上に合成され、目的の視覚効果を実現しますが、理想的な実装ではありません。

4

3 に答える 3

1

ハッ、理由がわかりました。シンセのルック アンド フィールが使用されている場合は、TitledBorder.getBorder から。TitledBorder.border は、xml ファイルで定義する必要があります。

public Border getBorder()       {       
    Border b = border;
if (b == null)
    b = UIManager.getBorder("TitledBorder.border");
    return b; 
}

だから私の答えは:

<object id="TitledBorder_Color" class="java.awt.Color">
        <int>140</int>

        <int>125</int>

        <int>100</int>

        <int>255</int>
    </object>

    <object id="LineBorder" class="javax.swing.border.LineBorder">
        <object idref="TitledBorder_Color"/>
    </object>

    <defaultsProperty key="TitledBorder.border" type="idref" value="LineBorder"/>
于 2009-08-28T06:51:42.953 に答える
1

領域ではなく、特別なスタイルを適用するコンポーネントの名前を指定します。

<bind style="PanelStyle" type="name" key="mySpecialPanel" />

Java コードでは、XML で指定した名前と一致するようにコンポーネントの名前を設定する必要があります。

panel.setName("mySpecialPanel");

すべてのパネルが同じ名前になるように JPanel を拡張することを検討してください。

public class MySpecialPanel extends JPanel 
{    
   public MySpecialPanel(String title) 
   {
       super(title);
       this.setName("mySpecialPanel");    
   } 
}
于 2008-11-10T21:50:50.810 に答える
0

同じ問題がありました。もちろん、回避策(上記で説明したもの)は機能しますが、解決策ではありません。

使用した回避策は次のとおりです。

それ以外の:

BorderFactory.createTitledBorder("title");

以下を使用する必要があります。

Border objBorder = BorderFactory.createLineBorder(Color.black); 
//Also you can create all the rest of the borders here.
BorderFactory.createTitledBorder(objBorder, "title");
于 2009-07-13T09:51:45.537 に答える