具体来说,我目前有一个带有 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。当我使用系统 L&F 时,默认是 LineBorder。显然 Synth 的默认值是 EmptyBorder。显式指定 LineBorder 可以让我返回线,这解决了我的大部分问题。
我剩下的问题涉及为 LineBorder 使用自定义图形。现在,我通过将我的自定义图形渲染为第二个 PanelBackground 图像来获得——它被合成在实际背景之上并实现了所需的视觉效果,尽管它不是理想的实现。