Skip to content

Instantly share code, notes, and snippets.

@brokendish
Created May 13, 2012 15:01
Show Gist options
  • Save brokendish/2688836 to your computer and use it in GitHub Desktop.
Save brokendish/2688836 to your computer and use it in GitHub Desktop.
TreePopUpMenu
package brokendish;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import javax.swing.AbstractAction;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
public class TreePopUpMenu extends JPopupMenu{
private final JTextField textField = new JTextField(24);
private TreePath path;
public TreePopUpMenu() {
super();
textField.addAncestorListener(new AncestorListener() {
@Override public void ancestorAdded(AncestorEvent e) {
textField.requestFocusInWindow();
}
@Override public void ancestorMoved(AncestorEvent event) {}
@Override public void ancestorRemoved(AncestorEvent e) {}
});
add(new AbstractAction("追加") {
@Override public void actionPerformed(ActionEvent e) {
JTree tree = (JTree)getInvoker();
DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) path.getLastPathComponent();
/* //追加画面表示
AddNodeDisplay addDis = new AddNodeDisplay();
addDis.addDisp();*/
DefaultMutableTreeNode child = new DefaultMutableTreeNode("New node");
//model.insertNodeInto(child, parent, 0);
parent.add(child);
model.nodeStructureChanged(parent);
tree.expandPath(path);
//20120520 Add-----------------------------------------------------------S
//新規追加したノードにカレントを移動する
DefaultMutableTreeNode laseLeaf = (DefaultMutableTreeNode)child.getLastLeaf();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) laseLeaf.getLastLeaf();
TreePath path = new TreePath(node.getPath());
tree.setSelectionPath(path);
//ハッシュマップに格納するデータを取得
DefaultMutableTreeNode nodeMod = (DefaultMutableTreeNode)path.getLastPathComponent();
NodeDataStruct saveNodeData = new NodeDataStruct();
saveNodeData.setHashcode(String.valueOf(nodeMod.hashCode()));
saveNodeData.setIndex("");
saveNodeData.setLevel(String.valueOf(nodeMod.getLevel()));
saveNodeData.setNode(node.getUserObject().toString());
saveNodeData.setTekiyo("NewAdding");
//ハッシュマップに格納する
TreeSet.treeHashSetUpd(saveNodeData);
//20120520 Add-----------------------------------------------------------E
}
});
add(new JMenuItem(new AbstractAction("編集") {
public void actionPerformed(ActionEvent e) {
JTree tree = (JTree)getInvoker();
DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
//if(path==null) return;
Object node = path.getLastPathComponent();
if(node instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode leaf = (DefaultMutableTreeNode)node;
textField.setText(leaf.getUserObject().toString());
int result = JOptionPane.showConfirmDialog(
tree, textField, "編集",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if(result==JOptionPane.OK_OPTION) {
String str = textField.getText();
if(!str.trim().isEmpty()) {
model.valueForPathChanged(path, str);
//leaf.setUserObject(str);
//model.nodeChanged(leaf);
//20120520 Add-----------------------------------------------------------S
//ハッシュマップに格納するデータを取得
DefaultMutableTreeNode nodeMod = (DefaultMutableTreeNode)path.getLastPathComponent();
NodeDataStruct saveNodeData = new NodeDataStruct();
saveNodeData.setHashcode(String.valueOf(nodeMod.hashCode()));
saveNodeData.setIndex("");
saveNodeData.setLevel(String.valueOf(leaf.getLevel()));
saveNodeData.setNode(str);
saveNodeData.setTekiyo("hensyuu");
//ハッシュマップに格納する
TreeSet.treeHashSetUpd(saveNodeData);
//20120520 Add-----------------------------------------------------------E
}
}
}
}
}));
addSeparator();
add(new AbstractAction("削除") {
@Override public void actionPerformed(ActionEvent e) {
JTree tree = (JTree)getInvoker();
DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
//if(path.getParentPath()!=null) {
if(!node.isRoot()) {
//削除確認ダイアログ
int result = JOptionPane.showConfirmDialog(tree, "削除しますか", "削除",JOptionPane.YES_NO_OPTION);
if(result==JOptionPane.OK_OPTION) {
model.removeNodeFromParent(node);
}
}
}
});
//20120520 Add-----------------------------------------------------------S
add(new AbstractAction("情報表示") {
@Override public void actionPerformed(ActionEvent e) {
//保存するときのノードの情報を取得 (現時点のノード情報を取得)
JTree tree = (JTree)getInvoker();
DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
//JTreeのノードをRootから走査する
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
//幅優先走査
//Enumeration emu = root.breadthFirstEnumeration();
//前順走査
Enumeration emu = root.preorderEnumeration();
while(emu.hasMoreElements()) {
DefaultMutableTreeNode emuNode = (DefaultMutableTreeNode)emu.nextElement();
System.out.println("hashCode=" + emuNode.hashCode()
+ " : Level=" + emuNode.getLevel()
+ " : パス=" + emuNode.getUserObject()
+ " : 上位のパス=" + emuNode.getParent()
+ " : このノードから葉までの最長の距離=" + emuNode.getDepth()
+ " : 適用=" + TreeSet.treeHashMap.get(String.valueOf(emuNode.hashCode())).getTekiyo()
);
}
//試し ハッシュコードから情報を取り出す
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ " + node.hashCode());
/*Iterator it = TreeSet.treeHashMap.keySet().iterator();
while (it.hasNext()) {
Object o = it.next();
System.out.println(o + " = " + TreeSet.treeHashMap.get(o).getHashcode());
}*/
System.out.println("---------getHashcode-----------" + TreeSet.treeHashMap.get(String.valueOf(node.hashCode())).getHashcode());
System.out.println("---------getLevel--------------" + TreeSet.treeHashMap.get(String.valueOf(node.hashCode())).getLevel());
System.out.println("---------getTekiyo-------------" + TreeSet.treeHashMap.get(String.valueOf(node.hashCode())).getTekiyo());
System.out.println("---------getNode---------------" + TreeSet.treeHashMap.get(String.valueOf(node.hashCode())).getNode());
//ハッシュマップを再構築(テスト)
TreeSet.treeHashSetReroad();
}
});
//20120520 Add-----------------------------------------------------------E
}
@Override public void show(Component c, int x, int y) {
JTree tree = (JTree)c;
TreePath[] tsp = tree.getSelectionPaths();
if(tsp!=null) {
path = tree.getPathForLocation(x, y);
if(path!=null && Arrays.asList(tsp).contains(path)) {
super.show(c, x, y);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment