Настройка Java L & F: Как использовать синтезатор для настройки границ BorderFactory? - PullRequest
1 голос
/ 24 октября 2008

В частности, в настоящее время у меня есть JPanel с TitledBorder. Я хочу настроить внешний вид границы. В текущем состоянии моего приложения отображается заголовок, но не сама граница линии.

Если я привяжу imagePainter к методу panelBorder для объектов Panel, я могу разместить вокруг панелей собственное изображение - однако оно отображается только на тех панелях, для которых я явно не установил границу в коде. Вот как выглядит этот код:

<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 в том же месте, где был заголовок, что нежелательно. 1018 *

Дальнейшие исследования показали, что причина отсутствия отображаемой строки в том, что конструктор TitledBorder принимает аргумент другой Границы, которую он отображает в дополнение к заголовку. Я не передавал этот аргумент, и значение по умолчанию зависит от выбранного вами L & F. Когда я использовал System L & F, по умолчанию был LineBorder. По-видимому, по умолчанию Synth - это EmptyBorder. Явное указание LineBorder возвращает меня назад, что решает большую часть моей проблемы.

Остальная часть моей проблемы связана с использованием пользовательской графики для LineBorder. Пока я получаю, визуализируя свою собственную графику как второе изображение PanelBackground - оно накладывается поверх фактического фона и достигает желаемого визуального эффекта, хотя это не идеальная реализация.

Ответы [ 3 ]

1 голос
/ 28 августа 2009

га, есть причина. Из 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"/>
1 голос
/ 11 ноября 2008

Укажите имя компонента, к которому вы хотите применить специальный стиль, а не регион:

<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");    
   } 
}
0 голосов
/ 13 июля 2009

У нас была такая же проблема. Конечно ваш обходной путь (который вы описали выше) работает, но это не решение.

Обходное решение, которое мы использовали:

Вместо:

BorderFactory.createTitledBorder("title");

Вы должны использовать:

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