Как я могу реализовать пользовательский стиль кнопки синтезатора Java, если у меня есть стиль кнопки, который уже существует?

#java #synth

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

Вопрос:

Итак, я пытаюсь создать пользовательский внешний вид с помощью java synth, и у меня возникают проблемы с привязкой пользовательской кнопки. (кнопка выхода имеет другой вид).

Вот кнопки из моего файла синтезатора:

 <!-- Button -->

<style id="buttonStyle">
    <property key="Button.textShiftOffset" type="integer" value="1"/>
    <insets top="2" left="2" right="2" bottom="2"/>
    <state>
        <color value="#000000" type="BACKGROUND"/>
        <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/button.jpg" sourceInsets="2 2 2 2"/>   
    </state>
    <state value="PRESSED">
        <color value="#9BC3B1" type="BACKGROUND"/>
        <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/button_p.jpg" sourceInsets="2 2 2 2"/>         
    </state>
     <state value="MOUSE_OVER">
        <color value="#9BC3B1" type="BACKGROUND"/>
        <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/button_h.jpg" sourceInsets="2 2 2 2"/>         
    </state>
</style>
<bind style="buttonStyle" type="region" key="Button"/>


<!-- Exit Button -->

<style id="exitStyle">
    <property key="Button.textShiftOffset" type="integer" value="1"/>
    <insets top="1" left="1" right="1" bottom="1"/>
    <state>
        <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/exit.jpg" sourceInsets="2 2 2 2"/> 
    </state>
    <state value="PRESSED">
        <color value="#9BC3B1" type="BACKGROUND"/>
        <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/exit_p.jpg" sourceInsets="2 2 2 2"/>           
    </state>
    <state value="MOUSE_OVER">
        <color value="#9BC3B1" type="BACKGROUND"/>
        <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/exit_h.jpg" sourceInsets="2 2 2 2"/>           
    </state>
</style>
<bind style="exitStyle" type="region" key="Exit"/>
  

Вот код, который создает кнопку.

 JButton exit = new JButton("Exit");
        exit.setName("exit");
  

Я попытался удалить обычный стиль кнопок, чтобы все, что у меня было, было пользовательскими кнопками, однако это не работает. Я также попытался сделать так, чтобы в ButtonStyle ничего не было, но это не сработало, он просто подобрал общий стиль:

     <style id="backingStyle"> 
    <opaque value="TRUE"/>
    <font name="Dialog" size="11"/>
    <state>
      <color value="#2B271C" type="BACKGROUND"/>
      <color value="YELLOW" type="FOREGROUND"/>
    </state>
  </style>
  <bind style="backingStyle" type="region" key=".*"/>
  

Ответ №1:

Я полагаю, что ваша проблема связана с тем, что нет области с именем Exit. Все области должны быть получены из javax.swing.plaf.synth.Класс Region. API подскажет вам, что использовать для привязки к этому региону http://docs.oracle.com/javase/6/docs/api/javax/swing/plaf/synth/Region.html

Но если вы хотите иметь специальную кнопку, которая выглядит иначе, чем ваша стандартная кнопка, нарисованная на синтезаторе, я считаю, что самый простой способ — привязать к «имени», а не к «региону». Создайте простой класс, который расширяет JButton. Вы можете назвать его ExitButton . Вам даже не нужно переопределять какие-либо методы. Затем XML-файл привяжет стиль к этому имени класса. Затем всякий раз, когда вы захотите использовать этот стиль button, создайте объект ExitButton вместо JButton (хотя он будет действовать так же и иметь те же методы, он будет выглядеть по-разному в зависимости от привязки XML).

Затем вы привяжете его к XML-файлу следующим образом:

 <!-- Exit Button -->

<style id="exitStyle">
  <property key="Button.textShiftOffset" type="integer" value="1"/>
  <insets top="1" left="1" right="1" bottom="1"/>
  <state>
    <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/exit.jpg" sourceInsets="2 2 2 2"/> 
  </state>
  <state value="PRESSED">
    <color value="#9BC3B1" type="BACKGROUND"/>
    <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/exit_p.jpg" sourceInsets="2 2 2 2"/>           
  </state>
  <state value="MOUSE_OVER">
    <color value="#9BC3B1" type="BACKGROUND"/>
    <imagePainter method="buttonBackground" path="/rstk/resources/pictures/parts/exit_h.jpg" sourceInsets="2 2 2 2"/>           
  </state>
</style>
<bind style="exitStyle" type="name" key="ExitButton"/>
  

Обратите внимание, что единственное отличие заключается в type =»name и key =»ExitButton» (или в том, что вы выбираете для названия своего класса, который расширяет JButton). Также значение ключа должно соответствовать имени класса, который вы создали и хотите использовать для этого стиля кнопки.

Надеюсь, это поможет.

Комментарии:

1. Я забыл вернуться и прокомментировать это, но это сработало как нельзя лучше, спасибо!

Ответ №2:

Когда вы привязываетесь к именованному компоненту, вам нужно изменить тип привязки с «region» на «name», а ключ должен соответствовать имени, которое вы установили для компонента «exit» (без заглавной буквы E). Итак, ваша строка для привязки кнопки выхода

 <bind style="exitStyle" type="region" key="Exit"/>
  

должно быть

 <bind style="exitStyle" type="name" key="exit"/>
  

Так и должно быть! Скажите мне, если у вас возникнут еще какие-либо проблемы.