Схема с определенным отношением с флажками узлов и подузлов - PullRequest
1 голос
/ 15 марта 2012

У меня есть вопрос об обработке свойств узла в схематическом виде.

У меня есть три уровня узлов: rootNode, узел и каждый узел может иметь подузлы. Помимо rootNode, все узлы и подузлы должны иметь одинаковое свойство (Boolean => checkbox). В моем наброске у меня есть два столбца, столбец узлов и столбец свойств с флажками.

Что мне сейчас нужно, так это то, что когда я активирую флажок узла, все флажки его подузлов также должны быть активированы, когда я деактивирую флажок узла, все флажки его подузлов должны быть также деактивирован. Если я раскрою дерево, чтобы увидеть подузлы, каждый подузел также может быть выбран.

Мой текущий код выглядит следующим образом (некоторые части можно найти в Интернете):

Основной API

public class Category {

    private String name;
    private Boolean x;

    public Category() {
        this("empty");
    }

    public Category(String name) {
        this.name = name;
    }

    public Category(String name, Boolean x) {
        this.name = name;
        this.x = x;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Boolean getx() {
        return x;
    }

    public void setx(Boolean x) {
        this.x = x;
    }
}

Мой ChildFactory для узлов (категории) выглядит как

public class CategoryChildrenFactory extends ChildFactory.Detachable<Category> {

    /* detachable has no real effect on the current code, used to control 
    the life cylce */
    @Override
    protected boolean createKeys(List<Category> toPopulate) {

        toPopulate.add(new Category("Cat1", false));
        toPopulate.add(new Category("Cat2", false));
        toPopulate.add(new Category("Cat3", false));

        return true;
    }

    @Override
    protected Node createNodeForKey(Category key) {
        AllNode cn = new AllNode(key);
        return cn;
    }
}

и для подузлов

public class MovieChildrenFactory extends ChildFactory<String>{

    Category category;

    public MovieChildrenFactory(Category category) {
        this.category = category;
    }

    @Override
    protected boolean createKeys(List<String> toPopulate) {
        toPopulate.add("m_1");
        toPopulate.add("m_2");
        toPopulate.add("m_3");

        return true;
    }

    @Override
    protected Node createNodeForKey(String key) {
        return new AllNode(category, key);
    }
}

Создание узлов помещается в один класс для обоих типов (узлов, подузлов)

public class AllNode extends AbstractNode {

    Category category;
    String title;
    private Sheet.Set set;

    public AllNode(Category category) {
        this(category, null);
        this.category = category;
        set = Sheet.createPropertiesSet();
    }

    public AllNode(Category category, String title) {
        super(Children.LEAF, Lookups.singleton(category));
        if (title == null) {
            this.setChildren(Children.create(new MovieChildrenFactory(category), true));
        }
        this.title = title;
        set = Sheet.createPropertiesSet();
    }

    @Override
    public String getHtmlDisplayName() {
        String name = "";
        if (title == null) {
            name = category.getName();
        } else {
            name = title;
        }
        return name;
    }

    @Override
    protected Sheet createSheet() {
        Sheet sheet = Sheet.createDefault();
        Category obj = getLookup().lookup(Category.class);
        PlotMathProperties pmp = new PlotMathProperties(obj, title);
        set.put(pmp.getMyProperty());
        sheet.put(set);
        return sheet;
    }
}

Свойства обрабатываются

public class PlotMathProperties {

    private MyProperty myProperty;
    private String categoryName;
    private String title;

    public PlotMathProperties(Category category, String title) {
        this.categoryName = category.getName();
        this.title= title;
        this.myProperty= new MyProperty ();
    }

    public XProperty getMyProperty () {
        return myProperty;
    }

    public class MyProperty extends PropertySupport.ReadWrite<Boolean> {

        private Boolean isMyProp = false;

        public MyProperty () {
            super("x", Boolean.class, "XPROP", "Is this a coloured or black and white movie");
        }

        @Override
        public Boolean getValue() throws IllegalAccessException, InvocationTargetException {
            return isMyProp ;
        }

        @Override
        public void setValue(Boolean val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
            isMyProp = val;
            if (isMyProp) {
                System.out.println("active: " + categoryName + ", " + title);
            } else {
                System.out.println("de-active: " + categoryName + ", " + title);
            }
        }
    }
}

Вместе с TopComponent контурный вид выглядит хорошо и работает хорошо.

Кто-нибудь знает, как настроить поведение для флажков

привет

...