Instantly share code, notes, and snippets.
Created
May 13, 2012 15:01
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save brokendish/2688836 to your computer and use it in GitHub Desktop.
TreePopUpMenu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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