У меня есть JTree, заполненный некоторыми (настраиваемыми) узлами. У меня есть класс, который является подклассом DefaultTreeCellRenderer, и используя этот «MyTreeCellRenderer», я могу установить всплывающие подсказки для каждого узла в моем дереве. Он отлично работает: JTree заполняется, создается средство визуализации ячеек, все добавленные узлы имеют всплывающие подсказки. Проблема в том, что я не знаю, как изменить подсказку для определенного узла в уже заполненном дереве ... Как это сделать? Есть ли способ «воссоздать» рендеринг ячеек только для одного узла в JTree?Сменная подсказка узла JTree
ответ
Я сделал это! Вместо использования расширенного CellRenderer я использовал метод getTooltipText дерева (я расширил дерево). Таким образом, я смог управлять текстом всплывающей подсказки в соответствии с объектом, на котором указатель мыши был над ним.
@Override
public String getToolTipText(MouseEvent evt) {
if (getRowForLocation(evt.getX(), evt.getY()) == -1)
return null;
TreePath curPath = getPathForLocation(evt.getX(), evt.getY());
TreeNode node = (TreeNode)curPath.getLastPathComponent();
if(something)
return "Empty";
if(something_else)
return "Not empty";
return null;
}
Вы также должны указать подсказку менеджера о дереве перед подсказками будут оказывать:
ToolTipManager.sharedInstance().registerComponent(myTree);
Почему вы переопределили этот метод вместо этого в TreeCellRenderer? У вас были проблемы с этим? Хотя это будет работать, всегда лучше работать с родными API и кодом и оставлять рендеринг соты в средстве визуализации ячеек. –
Ну, этот подход имел больше смысла для меня. Это выглядит яснее (по крайней мере, для меня) :) – guest86
Мне интересно, какие тесты вы выполняете в «something» и «something_else»; это может быть проще для них в контексте JTree. Я не собираюсь много спорить об этом, если вы найдете это яснее. Я просто озадачен тем, насколько яснее сделать это по-своему, вместо того, чтобы выполнять «рендеринг ячеек» в «визуализаторе ячеек». –
Из чего я понимаю ваш вопрос, вы хотите вызвать рендеринг определенного узла в Дереве. Это должно быть выполнено через TreeModel
, чтобы запустить соответствующее событие (т. Е. TreeNodesChanged). DefaultTreeModel
предлагает полезный метод для этой цели: nodeChanged.
Однако всплывающие подсказки в JTree активно обрабатываются JTree, создавая TreeCellRenderer, что означает, что для всплывающей подсказки ничего не должно быть сделано. Каждый раз, когда всплывающая подсказка должна отображаться, выполняется рендеринг для данного узла. См. Этот пример, который постоянно обновляет свою всплывающую подсказку (просто перемещая мышь вокруг узлов дерева).
import java.awt.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
public class TestTree {
public class MyTreeCellRenderer extends DefaultTreeCellRenderer {
private int rendering = 0;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component cell = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
if (cell instanceof JComponent) {
((JComponent) cell).setToolTipText("Hello " + rendering++);
if (value instanceof Node && cell instanceof JLabel) {
((JLabel) cell).setText(((Node) value).name);
}
}
return cell;
}
}
private JFrame f;
private JTree tree;
protected void initUI() {
Node root = new Node("Root");
fillTree(root, 5, "Some tree label");
DefaultTreeModel model = new DefaultTreeModel(root);
tree = new JTree(model);
ToolTipManager.sharedInstance().registerComponent(tree);
tree.setCellRenderer(new MyTreeCellRenderer());
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(new JScrollPane(tree));
f.pack();
f.setVisible(true);
}
public void fillTree(Node parent, int level, String label) {
for (int i = 0; i < 5; i++) {
Node node = new Node(label + " " + i);
parent.addNode(node);
if (level > 0) {
fillTree(node, level - 1, label);
}
}
}
public class Node implements TreeNode {
private Node parent;
private List<Node> children;
private String name;
public Node(String name) {
this.name = name;
this.children = new ArrayList<TestTree.Node>();
}
public void addNode(Node child) {
children.add(child);
child.parent = this;
}
@Override
public TreeNode getChildAt(int childIndex) {
return children.get(childIndex);
}
@Override
public int getChildCount() {
return children.size();
}
@Override
public Node getParent() {
return parent;
}
@Override
public int getIndex(TreeNode node) {
return children.indexOf(node);
}
@Override
public boolean getAllowsChildren() {
return true;
}
@Override
public boolean isLeaf() {
return children.size() == 0;
}
@Override
public Enumeration<Node> children() {
return Collections.enumeration(children);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTree().initUI();
}
});
}
}
- 1. JTree раскраска выбранного узла
- 2. Вставка динамического узла JTree
- 3. Выбор узла jTree
- 4. Расширение узла Jtree без выбора
- 5. Изменение узла образ JTree динамически
- 6. JTree - как установитьНазад для узла
- 7. изменить текст выполнения JTree узла
- 8. Предотвращение выбора узла при расширении узла в JTree
- 9. Как получить глубину текущего узла в JTree?
- 10. Добавление дочернего узла в родительский узел JTree
- 11. Установить значок для каждого узла в Jtree
- 12. JTree не смог получить индекс конкретного узла
- 13. JTree обновления Безразлично `после удаления узла
- 14. Как установить значок узла Jtree динамически
- 15. JTree: как получить цвет шрифта/текста узла?
- 16. Идентификация индекса выбранного узла XML из JTree
- 17. Java JTree получить имя выбранного узла
- 18. Сменная переменная проверки PHP
- 19. Сменная замена на "" Java
- 20. Кипящая оболочка MSYS - сменная?
- 21. Сменная замена в PHP
- 22. Сменная замена переменной
- 23. Сменная замена в строке
- 24. Как сменная рукоятка DateTime
- 25. Как называется сменная кнопка?
- 26. Сменная замена не работает
- 27. Сменная замена в MongoDB?
- 28. Интерактивная сменная диаграмма
- 29. Сменная Regex поле
- 30. JTree, влияющий на JLabel
понятия не имеет, как вы построили JToolTip, для лучшей помощи скорее опубликовать [SSCCE] (HTTP: //sscce.org/) – mKorbel