일부 (사용자 정의) 노드로 채워진 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_else"에서 수행하는 테스트 종류에 대해 궁금합니다. JTree 컨텍스트에서 이들에게는 더 간단 할 수 있습니다. 나는 당신이 그것을 더 명확하게 발견한다면 이것에 대해 많이 논쟁하지 않을 것입니다. 나는 "셀 렌더러"에서 "셀 렌더링"을 수행하는 대신 자신의 방식대로하는 것이 더 명확한 방법으로 혼란스러워합니다. –
귀하의 질문에 대한 이해에서부터 트리의 특정 노드 렌더링을 트리거하려고합니다. 적절한 이벤트를 발생 시키려면 TreeModel
을 통해 수행해야합니다 (예 : treeNodesChanged). DefaultTreeModel
은 그 목적을위한 유틸리티 메소드 인 nodeChanged을 제공합니다.
그러나 JTree의 툴팁은 TreeCellRenderer를 다시 호출하여 JTree가 사전에 처리하므로 툴팁을 변경하기 위해 수행해야하는 작업이 없습니다. 툴팁을 표시해야 할 때마다 지정된 노드의 렌더링이 수행됩니다. 트리의 노드를 중심으로 마우스를 움직여 툴팁을 지속적으로 업데이트하는이 예제를 참조하십시오.
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. 한 노드의 속성 변경
- 4. JTree 루트 노드의 파일 시스템 경로는 어떻게 얻을 수 있습니까?
- 5. java jtree 지연 후 모든 항목에 대한 툴팁 표시
- 6. jtree 사용자가 "깜박임"(빠른 색상 변경)을 통해 업데이트를 보게합니다.
- 7. 코코아 - XML 노드의 값을 변경
- 8. 도조 트리 노드의 값 변경
- 9. WPF- 툴팁 배경을 투명하게 변경
- 10. HTML5/CSS3로 툴팁 위치 변경
- 11. Google 차트의 툴팁 데이터 변경
- 12. JTree : 선택 수준 확인
- 13. 중첩 된 툴팁 (툴팁 내 툴팁)
- 14. MouseListener 및 JTree
- 15. 확장 된 JTree 렌더링
- 16. 북 노드의 사용자 정의 가능한 목록 만들기
- 17. Java 동적 JTree
- 18. 크기 변경 가능한 높이 변경
- 19. 변경 가능한 문자열의 값 변경
- 20. JTree 검색
- 21. JTextArea에서 JTree 파일을 표시하는 방법
- 22. Jtree to JPanel
- 23. 자바 업데이트 JTree
- 24. 는 JSTree 변경 노드의 새 이름을받는 방법
- 25. 노드의 Ubercart 체크 아웃 완료 페이지 변경
- 26. Hadoop 슬레이브 노드의 기본 구성을 변경 하시겠습니까?
- 27. 트리 구조 루트 노드의 크기 만 변경
- 28. 트리 또, dataTipFunction 툴팁 위치 변경, Flex3
- 29. Javascript를 통한 쉬운 툴팁 컨텐츠 변경
- 30. qTip2 - 클래스 변경시 사용되는 툴팁 내용 변경
어떤 생각을 더 빨리 [SSCCE] (HTTP를 게시 더 나은 도움을 JToolTip를 구성하는 방법 : //sscce.org/) – mKorbel