2015-04-21 4 views
0

Я создал настраиваемый элемент управления, который расширяет Region с помощью элемента fx:root. Моя проблема в том, что когда я пытаюсь загрузить его, я получаю LoadException, утверждая, что мне нужно определить DefaultProperty. Из того, что я могу сказать, Region не раскрывает getChildren() как общедоступный, чтобы позволить разработчикам решить, могут ли клиенты свободно добавлять вещи или нет.JavaFX - Определение свойства по умолчанию

Мой вопрос: как я могу определить детей как свойство по умолчанию? Я пробовал читать документы, но они только говорят, для чего предназначена аннотация, а не как она используется. Я тоже не смог найти никаких примеров. Каждый раз, когда я пытаюсь аннотировать поле или метод с помощью @DefaultProperty, я просто получаю ошибку компиляции The annotation @DefaultProperty is disallowed for this location.

ответ

2

Аннотации @DefaultProperty аннотации на уровне классов (@Target(value=TYPE) в документации) с обязательным атрибутом value с указанием имени свойства.

Так следующее будет работать:

@DefaultProperty("children") 
public class SpecialRegion extends Region { 

    @Override 
    public ObservableList<Node> getChildren() { 
     return super.getChildren(); 
    } 
} 

Обратите внимание, что если вы не сделаете getChildren() общественности, то FXMLLoader не сможет получить к нему доступ таким образом, что позволяет ей заполнить его. Таким образом, даже с аннотацией @DefaultProperty, я не думаю, что вы можете сделать эту работу без принятия метода getChildren()public, как указано выше. На данный момент вы можете также подкласса Pane вместо Region: разница между Pane и Region составляет publicgetChildren() и DefaultProperty.

+0

в то время как это избавилось от 'LoadException', вместо этого теперь я получаю ' UnsupportedOperationException: не могу определить тип свойства. \t at com.sun.javafx.fxml.BeanAdapter.getSetterMethod (Неизвестный источник) ' при попытке добавить узлы в элемент управления. Я думаю, это потому, что нет метода setChildren. – kai

+0

См. Обновление ... Я не уверен, что есть способ сделать то, что вы хотите, не делая 'getChildren()' public. –

+0

Другое отличие состоит в том, что в Регионе есть Shape, вы можете сказать, что он выглядит как многоугольник. Наверное, я могу решить это, просто добавив многоугольник в качестве дочернего элемента панели. Во всяком случае, ваш ответ решил, что я изначально просил, поэтому я соглашусь. Благодаря! – kai

Смежные вопросы