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

时间:2008-10-24 13:16:43

标签: java look-and-feel synth titled-border lf

具体来说,我目前有一个带有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的构造函数接受另一个边界的参数,它除了标题之外还呈现。我没有通过这个论点,默认情况取决于你选择的L&amp; F.回到我使用系统L&amp; F时,默认是LineBorder。显然Synth的默认值是EmptyBorder。明确指定LineBorder让我回到行,这解决了我的大部分问题。

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

3 个答案:

答案 0 :(得分: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");    
   } 
}

答案 1 :(得分:1)

哈,明白了。  从TitledBorder.getBorder,如果使用合成器外观。应该在xml文件中定义TitledBorder.border。

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"/>

答案 2 :(得分: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");