繁体   English   中英

Java L&F 自定义:如何使用 synth 自定义 BorderFactory 边框?

[英]Java L&F customization: How do I use synth to customize BorderFactory borders?

具体来说,我目前有一个带有 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 绘制器将被忽略,并且只打印名称。 use my custom border graphic, but then I have to poke and prod my layout to get a JLabel in the same place that the title was previously, which is undesirable.如果我拿走我的 NamedBorder,我使用我的自定义边框图形,但是我必须戳和戳我的布局才能在标题以前的同一个地方得到一个 JLabel,这是不可取的。

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

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

哈,知道原因了。 来自 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"/>

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

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

我们遇到了同样的问题。 当然,您的解决方法(您在上面描述过)有效,但它不是解决方案。

我们使用的解决方法是:

代替:

BorderFactory.createTitledBorder("title");

你应该使用:

Border objBorder = BorderFactory.createLineBorder(Color.black); 
//Also you can create all the rest of the borders here.
BorderFactory.createTitledBorder(objBorder, "title");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM