Оболочка синтезатора Swing: можете ли вы переопределить стили?

#java #swing #synth

#java #swing #синтезатор

Вопрос:

У меня есть стиль, определенный для JLabel:

 <style id="myLabel">
        <state>
          <opaque value="true"/>
          <color value="blue" type="BACKGROUND"/>
          <color value="red" type="FOREGROUND"/>
        </state>
      </style>
<bind style="myLabel" type="region" key="label"/> 
  

Однако я хочу, чтобы некоторые JLabels (в определенных JPanels) были оформлены совершенно по-другому:

 <style id="myUnrelatedPanel">
        <state>
          <opaque value="true"/>
          <color value="green" type="BACKGROUND"/>
          <color value="yellow" type="FOREGROUND"/>
        </state>
      </style>
<bind style="myLabel" type="name" key="_valueOfMyPanel.getName()_in_here"/> 
  

Вышеуказанное не работает, потому что применяется стиль для JLabel.

Вложенность стилей, похоже, не работает. Компилятор не жалуется; Synth выбирает стиль, привязанный к области ‘label’, и применяет его ко всем меткам в таблице стилей.

Следующая выдержка из ограниченной документации Java по Synth предполагает, что можно смешивать стили, применяемые к регионам и именам, и что их значения будут объединены:

Вы можете привязываться к отдельным именованным компонентам, независимо от того, привязаны они также как регионы или нет. Например, предположим, вы хотите, чтобы кнопки «OK» и «Отмена» в вашем графическом интерфейсе обрабатывались иначе, чем все остальные кнопки. Сначала вы должны присвоить кнопкам OK и Cancel имена, используя метод component.setName(). Затем вы должны определить три стиля: один для кнопок в целом (region = «Button»), один для кнопки OK (name = «OK») и один для кнопки Cancel (name = «Отмена»). Наконец, вы бы связали эти стили следующим образом:

  <bind style="styleButton" type="region" key="Button"> 
 <bind style="styleOK" type="name" key="OK"> 
 <bind style="styleCancel" type="name" key="Cancel">
  

Когда компонент или область привязаны к
более одного стиля, стили
объединенный

Примечание: Точно так же, как стиль может быть привязан к нескольким регионам или именам, несколько стилей могут быть привязаны к региону или имени. Эти несколько стилей объединяются для региона или названия. Приоритет отдается стилям, определенным позже в файле

Однако не похоже, что a, определенное в первом стиле, может быть переопределено a, определенным во втором стиле?

Ответ №1:

Я могу подтвердить, что невозможно переопределить ранее используемые привязанные типы (то есть вы не можете установить цвет type = «BACKGROUND» для региональной клавиши, а затем установить другой цвет type = «BACKGROUND» для именованной клавиши. Установка другого типа, такого как TEXT_BACKGROUND, будет работать, поскольку Synth объединяет два стиля в один. Однако, поскольку фон был установлен в первом стиле, вы не можете установить его снова во втором стиле.

Очень разочаровывает. Однако я нашел обходной путь. Установите набор цветов по умолчанию в универсальном стиле key=».*» и отклоняйтесь от этих цветов в стилях, привязанных к названию:

  <style id="backingStyle">
    <state>
        <opaque value="false"/>
        <font name="Arial" size="12"/>
        <color value="black" type="BACKGROUND"/>
        <color value="white" type="FOREGROUND"/>
    </state>
    </style>
    <bind style="backingStyle" type="region" key=".*"/>
  

и

  <style id="backingStyle">
    <state>
        <opaque value="false"/>
        <font name="Verdana" size="12"/>
        <color value="blue" type="BACKGROUND"/>
        <color value="green" type="FOREGROUND"/>
    </state>
    </style>
    <bind style="backingStyle" type="name" key="nameOfMyPanel"/>