具体来说,我目前有一个带有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图像 - 它在实际背景之上进行合成并实现所需的视觉效果,尽管它不是理想的实现。
答案 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)
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");