#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"/>
Так и должно быть! Скажите мне, если у вас возникнут еще какие-либо проблемы.