Простые редакторы свойств работают с текстовыми строками за счет переопределения методов setAsText() и getAsText(). Например, у рассматриваемого здесь компонента ChartBean есть свойство, которое позволяет выбирать один из следующих вариантов для размещения заголовка: слева, справа или по центру. Реализуются эти варианты с помощью такого перечисления:
1 |
public enum Position {LEFT, CENTER, RIGHT}; |
Конечно, отображаться так как есть, то есть в виде строк с заглавными буквами — LEFT, CENTER, RIGHT — они, во избежание лишних проблем с пользовательским интерфейсом, не должны. Поэтому и определяется редактор свойств, метод getAsText() которого подбирает для отображения строку более приглядного с точки зрения разработчика вида:
1 2 3 4 5 6 7 8 9 10 |
class TitlePositionEditor extends PropertyEditorSupport { public String getAsText() { int index = ((CharBean.Position) getValue().ordinal(); return tags[index]; } ... private String[] tags = { "Left", "Center", "Right" }; } |
В идеале эти строки должны отображаться на текущем локальном языке, а не обязательно на английском, но мы оставляем это в качестве упражнения для самостоятельной работы.
Естественно, теперь также еще необходимо добавить и метод, преобразующий текстовую строку обратно в значение свойства:
1 2 3 4 5 |
public void setAsText(String s) { int index = Arrays.asList(tags).indexOf(s); if(index>=0) setValue(ChartBean.Position.values() [index]); } |
Если мы просто предоставим эти два метода, инспектор свойств будет отображать текстовое поле. Оно будет инициализироваться вызовом метода getAsText, а по завершении выполнения в нем редактирования будет вызываться метод setAsText. Для свойства titlePosition, конечно, такой вариант является далеко не самым подходящим. В его случае будет лучше сделать так, чтобы все действительные значения отображались не в текстовом поле, а в комбинированном окне, как показано ниже:
Специальный редактор свойств в действии
Класс PropertyEditorSupport предоставляет простой механизм для указания того, что должно использоваться комбинированное окно. Все, что требуется — это всего лишь написать метод getTags(), возвращающий массив соответствующих строк:
1 |
public String[] getTags() {return tags;} |
По умолчанию метод getTags() возвращает значение null, указывающее на то, что текстовое поле является подходящим для редактирования значения свойств.
В случае предоставления метода getTags() методы getAsText() и setAsText() предоставлять все равно нужно. Метод getTags() просто перечисляет строки, которые должны предлагаться пользователю, а методы getAsText() и setAsText() отвечают за преобразование этих строк в тип данных свойства(который может представлять собой строку, целое число, перечисление или еще какой-нибудь совершенно другой тип) и обратно.
И, наконец, еще редакторы свойств должны реализовать метод getJavaInitializationString. С помощью этого метода интегрированной среде разработки можно передавать Java-строку, устанавливающую для свойств его текущее значение, чтобы та использовала ее для автоматической генерации кода. Для рассматриваемого здесь редактора TitlePostitionEditor этот метод должен выглядеть следующим образом:
1 2 3 4 |
public String getJavaInitializationString() { return ChartBean.Position.class.getName().replace('$', '.') + "." + getValue(); } |
Он будет возвращать примерно такую строку: com.projavaru.corejava.ChartBean.Position.LEFT.
Испробуйте его в среде NetBeans. В случае редактирования свойств titlePosition среда NetBeans должна вставить следующую строку кода:
1 |
chartBean1.setTitlePosition(com.projavaru.corejava.ChartBean.Position.LEFT); |
В нашей ситуации код выглядит немного громоздко, поскольку ChartBean.Position.class.getName() возвращает строку com.projavaru.corejava.ChartBean$Position. Далее остается только заменить символ $ символом точки и добавить результат вызова toString к значению перечисления.
При наличии у свойства специального редактора< не реализующего метод getJavaInitializationString, среда NetBeans не будет знать, как генерировать код, и потому будет создать set-метод с параметром ???.
Ниже приведен полный код редактора TitlePositionEditor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package com.projavaru.corejava; import java.beans.*; import java.util.*; public class TitlePositionEditor extends PropertyEditorSupport { public String[] getTags() { retunr tags; } public String getJavaInitializationString() { return ChartBean.Position.class.getName().replace('$', '.') + "." + getValue(); } public String getAsText() { int index = ((ChartBean.Position) getValue()).ordinal(); return tags[index]; } public void setAsText(String s) { int index = Arrays.asList(tags).indexOf(s); if(index>=0) setValue(ChartBean.Position.values()[index]); } private String[] tags = { "Left", "Center", "Right" }; } |