#fonts #colors #wicket #treenode
#шрифты #Цвет #wicket #treenode
Вопрос:
Есть ли способ изменить цвет узлов и сделать его курсивным и т.д.?
Комментарии:
1. Ваш вопрос не очень ясен. Мы смогли бы дать лучшие ответы, если бы вы объяснили, что именно вы пытаетесь сделать.
Ответ №1:
Я думаю, что этот поток поможет вам, даже несмотря на то, что этот пользователь, похоже, ищет немного больше, чем вы. Из ответов Эдвина:
Если вы переопределите
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
позаботится о визуализации нового состояния объекта для вас 🙂
Комментарии:
1. Привет, спасибо за ваш ответ. Я столкнулся с этим. Раньше я мало занимался javascript, поэтому не уверен, что к этому добавить.
2. @Matthew, ну, если вы не хотите динамических изменений, вам вообще не нужно беспокоиться о JavaScript. Вы можете просто установить скучный старый CSS-класс и готово. Но опять же, из вашего вопроса очень неясно, что вы на самом деле пытаетесь сделать. Пожалуйста, отредактируйте его, чтобы добавить больше деталей, используя ссылку под тегами.
3. в дереве калитки я пытаюсь придать узлу в верхней части дерева (жестко закодированному, а не динамическому) цвет, отличный от цвета остальной части дерева. Таким образом, верхний узел будет красным и выделен курсивом, например.
Ответ №2:
Вы хотите расширить, 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;}
Ответ №3:
С помощью 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
с LinkTree#onNodeLinkClicked()
автоматическим вызовом обработчика. Чтобы сохранить эту функцию, вам нужно вызвать onNodeLinkClicked()
вручную обработчик вашей пользовательской ссылки.