2012-06-18 4 views
3

У меня есть JTree, заполненный некоторыми (настраиваемыми) узлами. У меня есть класс, который является подклассом DefaultTreeCellRenderer, и используя этот «MyTreeCellRenderer», я могу установить всплывающие подсказки для каждого узла в моем дереве. Он отлично работает: JTree заполняется, создается средство визуализации ячеек, все добавленные узлы имеют всплывающие подсказки. Проблема в том, что я не знаю, как изменить подсказку для определенного узла в уже заполненном дереве ... Как это сделать? Есть ли способ «воссоздать» рендеринг ячеек только для одного узла в JTree?Сменная подсказка узла JTree

+1

понятия не имеет, как вы построили JToolTip, для лучшей помощи скорее опубликовать [SSCCE] (HTTP: //sscce.org/) – mKorbel

ответ

6

Я сделал это! Вместо использования расширенного 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); 
+0

Почему вы переопределили этот метод вместо этого в TreeCellRenderer? У вас были проблемы с этим? Хотя это будет работать, всегда лучше работать с родными API и кодом и оставлять рендеринг соты в средстве визуализации ячеек. –

+0

Ну, этот подход имел больше смысла для меня. Это выглядит яснее (по крайней мере, для меня) :) – guest86

+2

Мне интересно, какие тесты вы выполняете в «something» и «something_else»; это может быть проще для них в контексте JTree. Я не собираюсь много спорить об этом, если вы найдете это яснее. Я просто озадачен тем, насколько яснее сделать это по-своему, вместо того, чтобы выполнять «рендеринг ячеек» в «визуализаторе ячеек». –

5

Из чего я понимаю ваш вопрос, вы хотите вызвать рендеринг определенного узла в Дереве. Это должно быть выполнено через 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(); 
      } 
     }); 
    } 

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