参考了一个从源树到目的树托拽的代码:
因为我的两个树都是读xml生成的。
所以我想在源树节点托到目的树的时候。
目的树的xml文件也跟着变化。
请问怎么修改?
DragSourceTree.java
---------------------------------------------------------------------------
package aabbcc;import javax.swing.JTree;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragSource;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.datatransfer.StringSelection;/**
* <p>Title: JTree之间的拖拽中的DragSourceTree</p>
* <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类是“源树”。 </p>
* @author awaysrain(绝对零度)
* @version 1.0
*/public class DragSourceTree
extends JTree
implements DragGestureListener, DragSourceListener {
private DragSource dragSource = null;
/**
* Construct the source tree
*/
public DragSourceTree() {
super();
dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
}
/**
* Construct the source tree
* @param treeNode DefaultMutableTreeNode
*/
public DragSourceTree(DefaultMutableTreeNode treeNode) {
super(treeNode);
dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
} /**
* dragGestureRecognized
*
* @param dge DragGestureEvent
*/
public void dragGestureRecognized(DragGestureEvent dge) {
java.awt.Cursor cursor = null;
cursor = DragSource.DefaultCopyDrop; //set cursor
java.awt.Point jap = dge.getDragOrigin(); //drag point
int x = (int) jap.getX();
int y = (int) jap.getY();
javax.swing.tree.TreePath tp = this.getPathForLocation(x, y); //get drag node path
if (tp != null) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode)
tp.getLastPathComponent(); //get drag node
serializableNode(node1); //Serializable node object
}
//event start
dge.startDrag(cursor, new StringSelection("drag"), this); } /**
* dragEnter
*
* @param dsde DragSourceDragEvent
*/
public void dragEnter(DragSourceDragEvent dsde) {
} /**
* dragOver
*
* @param dsde DragSourceDragEvent
*/
public void dragOver(DragSourceDragEvent dsde) {
} /**
* dropActionChanged
*
* @param dsde DragSourceDragEvent
*/
public void dropActionChanged(DragSourceDragEvent dsde) {
} /**
* dragDropEnd
*
* @param dsde DragSourceDropEvent
*/
public void dragDropEnd(DragSourceDropEvent dsde) {
} /**
* dragExit
*
* @param dse DragSourceEvent
*/
public void dragExit(DragSourceEvent dse) {
}
/**
*Serializable node
*
* @param node DefaultMutableTreeNode
*/
private void serializableNode(DefaultMutableTreeNode node) {
try {
java.io.FileOutputStream objfile = new java.io.FileOutputStream(
"DragNode.OBJ");
java.io.ObjectOutputStream p = new java.io.ObjectOutputStream(objfile);
p.writeObject(node);
p.flush();
objfile.close();
}
catch (java.io.IOException e) {
System.out.println(e.toString());
} }
}
因为我的两个树都是读xml生成的。
所以我想在源树节点托到目的树的时候。
目的树的xml文件也跟着变化。
请问怎么修改?
DragSourceTree.java
---------------------------------------------------------------------------
package aabbcc;import javax.swing.JTree;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragSource;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.datatransfer.StringSelection;/**
* <p>Title: JTree之间的拖拽中的DragSourceTree</p>
* <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类是“源树”。 </p>
* @author awaysrain(绝对零度)
* @version 1.0
*/public class DragSourceTree
extends JTree
implements DragGestureListener, DragSourceListener {
private DragSource dragSource = null;
/**
* Construct the source tree
*/
public DragSourceTree() {
super();
dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
}
/**
* Construct the source tree
* @param treeNode DefaultMutableTreeNode
*/
public DragSourceTree(DefaultMutableTreeNode treeNode) {
super(treeNode);
dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
} /**
* dragGestureRecognized
*
* @param dge DragGestureEvent
*/
public void dragGestureRecognized(DragGestureEvent dge) {
java.awt.Cursor cursor = null;
cursor = DragSource.DefaultCopyDrop; //set cursor
java.awt.Point jap = dge.getDragOrigin(); //drag point
int x = (int) jap.getX();
int y = (int) jap.getY();
javax.swing.tree.TreePath tp = this.getPathForLocation(x, y); //get drag node path
if (tp != null) {
DefaultMutableTreeNode node1 = (DefaultMutableTreeNode)
tp.getLastPathComponent(); //get drag node
serializableNode(node1); //Serializable node object
}
//event start
dge.startDrag(cursor, new StringSelection("drag"), this); } /**
* dragEnter
*
* @param dsde DragSourceDragEvent
*/
public void dragEnter(DragSourceDragEvent dsde) {
} /**
* dragOver
*
* @param dsde DragSourceDragEvent
*/
public void dragOver(DragSourceDragEvent dsde) {
} /**
* dropActionChanged
*
* @param dsde DragSourceDragEvent
*/
public void dropActionChanged(DragSourceDragEvent dsde) {
} /**
* dragDropEnd
*
* @param dsde DragSourceDropEvent
*/
public void dragDropEnd(DragSourceDropEvent dsde) {
} /**
* dragExit
*
* @param dse DragSourceEvent
*/
public void dragExit(DragSourceEvent dse) {
}
/**
*Serializable node
*
* @param node DefaultMutableTreeNode
*/
private void serializableNode(DefaultMutableTreeNode node) {
try {
java.io.FileOutputStream objfile = new java.io.FileOutputStream(
"DragNode.OBJ");
java.io.ObjectOutputStream p = new java.io.ObjectOutputStream(objfile);
p.writeObject(node);
p.flush();
objfile.close();
}
catch (java.io.IOException e) {
System.out.println(e.toString());
} }
}
DragTargetTree.java
--------------------------------------------------------------------------------package aabbcc; import javax.swing.JTree;
import java.awt.dnd.DropTargetListener;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTarget;
import java.io.*;
import java.io.*;
import javax.swing.tree.DefaultMutableTreeNode;/**
* <p>Title: JTree之间的拖拽中的DragTargetTree</p>
* <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类是“目的树” </p>
* @author awaysrain(绝对零度)
* @version 1.0
*/public class DragTargetTree
extends JTree
implements DropTargetListener {
/**
* Construct the target tree
*/
public DragTargetTree() {
super();
DropTarget dropTarget = new DropTarget(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
}
/**
* Construct the target tree
* @param treeNode DefaultMutableTreeNode
*/
public DragTargetTree(DefaultMutableTreeNode treeNode) {
super(treeNode);
DropTarget dropTarget = new DropTarget(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
}
/**
* dragEnter
*
* @param dtde DropTargetDragEvent
*/
public void dragEnter(DropTargetDragEvent dtde) {
} /**
* dragOver
*
* @param dtde DropTargetDragEvent
*/
public void dragOver(DropTargetDragEvent dtde) {
} /**
* dropActionChanged
*
* @param dtde DropTargetDragEvent
*/
public void dropActionChanged(DropTargetDragEvent dtde) {
} /**
* drop
*
* @param dtde DropTargetDropEvent
*/
public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); //accept drop
java.awt.Point ap = dtde.getLocation(); // get event point
int x = (int) ap.getX();
int y = (int) ap.getY();
javax.swing.tree.DefaultMutableTreeNode parnode;
javax.swing.tree.TreePath tp = this.getPathForLocation(x, y);
if (tp != null) {
try {
//get drop tree node with treepath
javax.swing.tree.DefaultMutableTreeNode no1 =
(javax.swing.tree.DefaultMutableTreeNode) tp.getLastPathComponent();
parnode = no1;
int index = parnode.getChildCount();
// get drop tree mode
javax.swing.tree.DefaultTreeModel tm =
(javax.swing.tree.DefaultTreeModel)this.getModel();
javax.swing.tree.DefaultMutableTreeNode node2 =
new javax.swing.tree.DefaultMutableTreeNode();
node2 = readNode();
tm.insertNodeInto(node2, parnode, index);
}
catch (java.lang.Exception e) {
System.out.println(e.toString());
}
} } /**
* dragExit
*
* @param dte DropTargetEvent
*/
public void dragExit(DropTargetEvent dte) {
} /**
*
* read the node
* @return DefaultMutableTreeNode
*/
private DefaultMutableTreeNode readNode() { FileInputStream objfile = null;
try {
objfile = new java.io.FileInputStream("DragNode.OBJ");
ObjectInputStream q = new ObjectInputStream(objfile);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) q.readObject();
return node;
}
catch (Exception ex) {
return null;
}
}
}
Demo.java--------------------------------------------------------------------------------package aabbcc; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;/**
* <p>Title: JTree之间的拖拽测试</p>
* <p>Description:通过向从“源树”中拖拽结点在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类测试的类 </p>
* @author awaysrain(绝对零度)
*/
public class Demo extends JFrame {
JPanel contentPane;
JScrollPane jScrollPane1 = new JScrollPane();
XYLayout xYLayout1 = new XYLayout();
DragSourceTree jTree1 = new DragSourceTree();
JScrollPane jScrollPane2 = new JScrollPane();
DragTargetTree jTree2 = new DragTargetTree();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel(); //Construct the frame
public static void main() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
} //Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(xYLayout1);
this.setSize(new Dimension(400, 300));
this.setTitle("Demo");
jLabel1.setFont(new java.awt.Font("DialogInput", 0, 16));
jLabel1.setText("源树");
jLabel2.setEnabled(true);
jLabel2.setFont(new java.awt.Font("DialogInput", 0, 16));
jLabel2.setDebugGraphicsOptions(0);
jLabel2.setDoubleBuffered(false);
jLabel2.setVerifyInputWhenFocusTarget(true);
jLabel2.setDisplayedMnemonic('0');
jLabel2.setText("目标树");
jLabel2.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
jLabel2.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
contentPane.add(jLabel1, new XYConstraints(35, 8, 139, 27));
contentPane.add(jLabel2, new XYConstraints(214, 10, 149, 20));
contentPane.add(jScrollPane2, new XYConstraints(211, 31, 159, 231));
contentPane.add(jScrollPane1, new XYConstraints(25, 31, 153, 230));
jScrollPane1.getViewport().add(jTree1, null);
jScrollPane2.getViewport().add(jTree2, null);
} //Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
}
自己写的。
不足之处。斧正
把目的树改了改。:
package TestApp;import javax.swing.JTree;
import java.awt.dnd.DropTargetListener;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTarget;
import java.io.*;
import java.io.*;
import javax.swing.tree.DefaultMutableTreeNode;
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import java.util.*;/**
* <p>Title:
* <p>Description:
* @author Zhangb
* @version 1.0
*/public class DragTargetTree
extends JTree
implements DropTargetListener {
private OprXML opx = new OprXML();
private Document myDoc = opx.readDocument("xml\\listTree.xml");
private Element root_Element = myDoc.getRootElement();
private Object tmp_o = null;
private String[] xml_name = {"object","basyo","contents","koumoku","koumoku1","koumoku2","koumoku3","koumoku4","koumoku5","koumoku6","koumoku7","koumoku8"};
/**
* Construct the target tree
*/
public DragTargetTree() {
super();
DropTarget dropTarget = new DropTarget(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
}
/**
* Construct the target tree
* @param treeNode DefaultMutableTreeNode
*/
public DragTargetTree(DefaultMutableTreeNode treeNode) {
super(treeNode);
DropTarget dropTarget = new DropTarget(this,
java.awt.dnd.DnDConstants.
ACTION_COPY_OR_MOVE, this);
}
/**
* dragEnter
*
* @param dtde DropTargetDragEvent
*/
public void dragEnter(DropTargetDragEvent dtde) {
} /**
* dragOver
*
* @param dtde DropTargetDragEvent
*/
public void dragOver(DropTargetDragEvent dtde) {
} /**
* dropActionChanged
*
* @param dtde DropTargetDragEvent
*/
public void dropActionChanged(DropTargetDragEvent dtde) {
}
/**
* travel1
*
* @param elem Element,node,DefaultMutableTreeNode
*/
public void travel1(Element elem,DefaultMutableTreeNode node) {
if(elem == null) {
return;
}
if(elem.isRootElement()) {
if(elem.getAttribute("name").getValue().equals(node.toString())) {
tmp_o = elem;
}
}
List childrenList = elem.getChildren();
Iterator i = childrenList.iterator();
while(i.hasNext()) {
Object o = i.next();
String elem_name = ((Element)o).getAttribute("name").getValue();
if(elem_name.equals(node.toString())) {
tmp_o = o;
}else {
travel1((Element)o,node);
}
}
}
/**
* add_Element
*
* @param List childList, par_Ele Element,node,DefaultMutableTreeNode,level int
*/
public void add_Element(List childList,Element par_Ele,DefaultMutableTreeNode node,int level) {
String ele_Name = xml_name[level];
Element add_e1 = new Element(ele_Name);
Attribute att = new Attribute("name",node.toString());
add_e1.setAttribute(att);
childList.add(childList.size(),add_e1);
Enumeration childrenList = node.children();
level++;
List childList_2 = add_e1.getChildren();
while(childrenList.hasMoreElements()) {
add_Element(childList_2,add_e1,(DefaultMutableTreeNode)childrenList.nextElement(),level);
}
} /**
* drop
*
* @param dtde DropTargetDropEvent
*/
public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); //accept drop
java.awt.Point ap = dtde.getLocation(); // get event point
int x = (int) ap.getX();
int y = (int) ap.getY();
javax.swing.tree.DefaultMutableTreeNode parnode;
javax.swing.tree.TreePath tp = this.getPathForLocation(x, y);
OprXML Opr_Wr_Doc = new OprXML();
if (tp != null) {
try {
//get drop tree node with treepath
javax.swing.tree.DefaultMutableTreeNode no1 =
(javax.swing.tree.DefaultMutableTreeNode) tp.getLastPathComponent();
parnode = no1;
System.out.println("depth===>" + parnode.getLevel());
//String Ele_name = xml_name[parnode.getLevel()];
int index = parnode.getChildCount();
System.out.println(parnode.toString());
// get drop tree mode
javax.swing.tree.DefaultTreeModel tm =
(javax.swing.tree.DefaultTreeModel)this.getModel();
javax.swing.tree.DefaultMutableTreeNode node2 =
new javax.swing.tree.DefaultMutableTreeNode();
node2 = readNode();
tm.insertNodeInto(node2, parnode, index);
travel1(root_Element,parnode);
Object par_Ele = tmp_o;
if(par_Ele == null) {
System.out.println("Error:");
}
List childList = ((Element)par_Ele).getChildren();
add_Element(childList,(Element)par_Ele,node2,parnode.getLevel());
Opr_Wr_Doc.outputDocumentToFile("listTree",myDoc);
}
catch (java.lang.Exception e) {
System.out.println(e.toString());
}
} } /**
* dragExit
*
* @param dte DropTargetEvent
*/
public void dragExit(DropTargetEvent dte) {
} /**
*
* read the node
* @return DefaultMutableTreeNode
*/
private DefaultMutableTreeNode readNode() { FileInputStream objfile = null;
try {
objfile = new java.io.FileInputStream("DragNode.OBJ");
ObjectInputStream q = new ObjectInputStream(objfile);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) q.readObject();
return node;
}
catch (Exception ex) {
return null;
}
}
}