カスタム TreeCellRenderer を持つ JTree があります。
DefaultMutableTreeNode myTreeRoot = new DefaultMutableTreeNode();
JTree myTree = new JTree(myTreeRoot);
myTree.setCellRenderer(new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
if (((DefaultMutableTreeNode) value).getUserObject() instanceof MyObject) {
System.out.println("============= my object ===========" + value);
}
return super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
}
});
次に、表示後にツリーにノードを動的に追加します。子を 1 人だけ追加する場合を考えてみましょう。
MyObject object = new MyObject("Child Node");
DefaultMutableTreeNode myTreeNode = new DefaultMutableTreeNode(object);
myTreeRoot.add(myTreeNode);
次に、ツリーのルートも非表示にします
myTree.expandRow(0);
myTree.setRootVisible(false);
myTree.setShowsRootHandles(true);
if (myTreeRoot.getChildCount() != 0) {
myTree.setSelectionRow(0);
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
devicesTree.updateUI();
}
});
後でこれらのノードを削除する別のオプションがあります
private void removeNode(MyObject object) {
DefaultMutableTreeNode myTreeNode = getTreeeNode(object); //This method traverse through the tree and returns the corresponding node
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) myTree.getSelectionPath().getLastPathComponent();
int selectedRow = -1;
if (myTree.getSelectionRows().length > 0) {
selectedRow = myTree.getSelectionRows()[0];
}
boolean isSelected = selectedNode == myTreeNode;
if (isSelected) {
if (myTree.getRowCount() == 1) {
myTree.clearSelection();
} else if (myTree.getRowCount() > selectedRow + 1) {
myTree.setSelectionRow(selectedRow + 1);
} else if (selectedRow != 0) {
myTree.setSelectionRow(0);
}
}
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) myTreeNode.getParent();
parent.remove(myTreeNode);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myTree.updateUI();
}
});
}
今私が抱えている問題は、ツリーのルートに子が 1 つしかなく、その子を削除することを選択した場合、削除後も getTreeCellRendererComponent() メソッドがその削除されたオブジェクトを指していることです。その手がかりはありますか?