Изменить цвет узла калитки, шрифт и т. Д. - PullRequest
0 голосов
/ 06 апреля 2011

Есть ли способ изменить цвет узлов и изменить его на курсив и т. Д .?

Ответы [ 3 ]

0 голосов
/ 13 апреля 2011

Вы хотите расширить TreeTable и затем переопределить getCss(), чтобы изменить шрифты и цвета текста или фона. Если вы хотите изменить цвета фактических значков узлов, вы хотите переопределить getNodeIcon() и добавить ресурсы для своих собственных файлов PNG.

public abstract class MyTreeTable extends TreeTable {
    private static ResourceReference CSS = new CompressedResourceReference(
        MyTreeTable.class, "TreeTable.css");
    private static ResourceReference documentIcon = new CompressedResourceReference(
        MyTreeTable.class, "Icon_Document.png");
    private static ResourceReference folderIcon = new CompressedResourceReference(
        MyTreeTable.class, "Icon_Folder.png");

    public MyTreeTable(String id, IColumn[] columns) {
        super(id, columns);
    }

    @Override
    protected ResourceReference getCSS() {
        return CSS;
    }

    @Override
    protected ResourceReference getNodeIcon(TreeNode node) {
        if (node.isLeaf() == true) {
            return documentIcon;
        } else {
            return folderIcon;
        }
    }
}

CSS для этого конкретного компонента очень привередливый, потому что они используют одно изображение и смещения изображения для всех линий, соединяющих дерево, поэтому я рекомендую скопировать весь их файл CSS (вы можете получить его из исходных файлов), а затем регулируя это. Или, если вы не хотите вносить обширные изменения, вы можете вообще не переопределять getCSS() и вместо этого добавить свой CSS-ресурс в конструктор.

Действительно супер-хромая часть состоит в том, что TreeTable вставляет невидимый div в верхнюю часть каждой таблицы, поэтому псевдокласс :first-child нельзя использовать для выбора вашего элемента, или, по крайней мере, я не могу сделай так, чтоб это работало. Так что вам все равно нужно будет переопределить populateTreeItem(). Что-то вроде:

boolean first = true;
@Override
protected void populateTreeItem(WebMarkupContainer container, int level) {
    super.populateItem(container, level);
    if(first) {
        container.add(new SimpleAttributeModifer("class", "first"));
        first = false;
    }
}

и затем в вашем CSS,

.first {font-color: red; font-style: italic;}
0 голосов
/ 09 сентября 2015

С помощью LinkTree (устарело в Wicket 6.21 или даже ранее) вы можете переопределить метод newNodeComponent для создания компонента с нуля:

@Override
protected Component newNodeComponent(String id, IModel<Object> model)
{
    Object node = model.getObject();
    if (node instanceof FolderNode)
    {
        FolderNode folderNode = (FolderNode)node;
        return new Label(id, folderNode.getLabel());
    }
    else if (node instanceof FileNode)
    {
        ...
    }
    else if ...
    else
    {
        return null;
    }
}

Примечание: оригинальная реализация строит LinkIconPanel с помощью *Обработчик 1007 * вызывается автоматически.Чтобы сохранить эту функцию, вам нужно вручную вызвать onNodeLinkClicked() в обработчике вашей пользовательской ссылки.

0 голосов
/ 06 апреля 2011

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

Если вы переопределите метод populateTreeItem(), вы можете добавить AbstractBehaviour к элементу и переопределить метод onComponentTag.Оттуда вы можете сделать

tag.put("class", "yourValue")

...

, вам нужно добавить AbstractBehaviour к каждому предмету.Метод onComponentTag() будет запущен до рендеринга компонента, поэтому вы можете проверить состояние userObject и добавить / удалить классы, используя подход tag.put():)

Также вы можете посмотреть наonNodeLinkClicked() метод дерева, если вы хотите выполнять действия при нажатии на элемент.onNodeLinkClicked() дает вам доступ к AjaxRequestTarget, поэтому вы также можете выполнить произвольный код JavaScript, например:

protected void onNodeLinkClicked(AjaxRequestTarget target, TreeNode node) {
    MyObject myObject = (MyObject)
      ((DefaultMutableTreeNode) node).getUserObject();
    if (myObject.getMyState())
        target.appendJavascript("targetTheComponentWithAJavascriptMethod(" +
          getId() + ");");
}

Либо так, либо вы можете изменить состояние userObject вonNodeLinkClicked метод и добавьте его к AjaxRequestTarget.Ваш AbstractBehaviour позаботится о том, чтобы представить вам новое состояние объекта :)

...