Java 爪哇L&;F定制:如何使用synth定制BorderFactory边框?
具体来说,我目前有一个标题为Border的JPanel。我想定制边框的外观。在我的应用程序的当前状态下,绘制的是标题,而不是线条边框本身 如果我将imagePainter绑定到面板对象的panelBorder方法,我可以在面板周围放置一个自定义图像——但是它只显示在代码中没有明确设置边框的面板上。下面是该代码的外观: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
<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"/>