Java 爪哇L&;F定制:如何使用synth定制BorderFactory边框?

Java 爪哇L&;F定制:如何使用synth定制BorderFactory边框?,java,look-and-feel,synth,titled-border,lf,Java,Look And Feel,Synth,Titled Border,Lf,具体来说,我目前有一个标题为Border的JPanel。我想定制边框的外观。在我的应用程序的当前状态下,绘制的是标题,而不是线条边框本身 如果我将imagePainter绑定到面板对象的panelBorder方法,我可以在面板周围放置一个自定义图像——但是它只显示在代码中没有明确设置边框的面板上。下面是该代码的外观: <style id="PanelStyle"> <state> <imagePainter method="panelBord

具体来说,我目前有一个标题为Border的JPanel。我想定制边框的外观。在我的应用程序的当前状态下,绘制的是标题,而不是线条边框本身

如果我将imagePainter绑定到面板对象的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" />
和名称绑定:

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

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

如果指定NamedBorder,则将忽略PanelBorder绘制程序,只打印名称。如果我拿走我的NamedBorder,我可以使用我的自定义边框图形,但是我必须戳和戳我的布局,以便在标题之前所在的位置获得JLabel,这是不可取的

进一步的研究发现,没有呈现行的原因是TitledBorder的构造函数接受了另一个边框的参数,它除了呈现标题之外还呈现了另一个边框。我没有传递此参数,默认值取决于您选择的L&F。早在我使用系统L&F时,默认值是线条边框。显然Synth的默认值是一个空订单。显式指定LineBorder将使我返回该行,这解决了我的大部分问题


我的问题的其余部分涉及对线边框使用自定义图形。现在,我通过将自定义图形渲染为第二个PanelBackground图像来获得效果——它在实际背景上合成,并达到所需的视觉效果,尽管这不是理想的实现。

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

<bind style="PanelStyle" type="name" key="mySpecialPanel" />

您可以考虑扩展JPAND,使所有面板具有相同的名称:

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");
哈,我知道原因了。 从TitledBorder.getBorder,如果使用了synth外观。应在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"/>

140
125
100
255
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"/>