gpt4 book ai didi

Java L&F定制: How do I use synth to customize BorderFactory borders?

转载 作者:行者123 更新时间:2023-11-30 05:17:30 25 4
gpt4 key购买 nike

具体来说,我目前有一个带有 TitledBorder 的 JPanel。我想自定义边框的外观。在我的应用程序的当前状态下,会绘制标题,但不会绘制线条边框本身。

如果我将 imagePainter 绑定(bind)到 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):

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

这允许我仅更改特定面板的样式,这很好。但是,它并没有解决最初的问题:我仍然无法自定义面板的 NamedBorder。

如果我指定 NamedBorder,我的 PanelBorder 绘制器将被忽略,并且仅打印名称。如果我拿走我的 NamedBorder,我可以使用我的自定义边框图形,但随后我必须戳戳我的布局才能在标题之前所在的位置获得 JLabel,这是不可取的。

进一步的研究发现,没有渲染线条的原因是 TitledBorder 的构造函数采用另一个 Border 的参数,除了标题之外它还渲染该边框。我没有传递这个参数,默认值取决于您选择的 L&F。当我使用 System L&F 时,默认值是 LineBorder。显然 Synth 的默认值是 EmptyBorder。显式指定 LineBorder 可以让我恢复线条,这解决了我的大部分问题。

我的问题的其余部分涉及使用 LineBorder 的自定义图形。现在,我将自定义图形渲染为第二个 PanelBackground 图像 - 它合成在实际背景之上并实现所需的视觉效果,尽管这不是理想的实现。

最佳答案

指定要应用特殊样式的组件的名称,而不是区域:

<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");
}
}

关于Java L&F定制: How do I use synth to customize BorderFactory borders?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/233491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com