具体的には、現在、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 イメージとしてレンダリングすることで取得しています。これは実際の背景の上に合成され、目的の視覚効果を実現しますが、理想的な実装ではありません。