将xml的数据写入swing树形结构

前端之家收集整理的这篇文章主要介绍了将xml的数据写入swing树形结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先简单的粘贴下代码,正在学习java的东西,正好用到swing,算是做个练习。API太多,还没有梳理太清楚,慢慢回顾。

  1. public class TreeFrame extends JFrame {
  2. public static final int WIDTH = 1100;
  3. public static final int HEIGHT = 615;
  4. private static int xlocation,ylocation;
  5. private boolean xmlFlag = false;
  6. private JPanel treeArea = new JPanel();
  7. private JPanel buttons = new JPanel();
  8. DefaultMutableTreeNode top = new DefaultMutableTreeNode("行政规划");
  9. private JTree menuTree = new JTree(top);
  10. private JTextArea text = new JTextArea();
  11.  
  12. DefaultTreeModel model;
  13. FileOutputStream fos;
  14. OutputStreamWriter osw;
  15.  
  16. public TreeFrame(){
  17. this.setTitle("省份名称");
  18. this.setSize(WIDTH,HEIGHT);
  19. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  20. xlocation = (screenSize.width-WIDTH)/2;
  21. ylocation = (screenSize.height-HEIGHT)/2;
  22. this.setLocation(xlocation,ylocation);
  23. //设置关闭窗口
  24. this.addWindowListener(new WindowListener() {
  25.  
  26. @Override
  27. public void windowOpened(WindowEvent e) {
  28. // TODO Auto-generated method stub
  29.  
  30. }
  31.  
  32. @Override
  33. public void windowIconified(WindowEvent e) {
  34. // TODO Auto-generated method stub
  35.  
  36. }
  37.  
  38. @Override
  39. public void windowDeiconified(WindowEvent e) {
  40. // TODO Auto-generated method stub
  41.  
  42. }
  43.  
  44. @Override
  45. public void windowDeactivated(WindowEvent e) {
  46. // TODO Auto-generated method stub
  47.  
  48. }
  49.  
  50. @Override
  51. public void windowClosing(WindowEvent e) {
  52. try {
  53. fos=new FileOutputStream("xml/data.xml");
  54. osw=new OutputStreamWriter(fos,"utf-8");
  55. osw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+"\r\n");
  56. model = (DefaultTreeModel)menuTree.getModel();
  57. DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
  58. //头结点行政规划不用保存
  59. saveToFile(root.getNextNode(),osw);
  60. osw.close();
  61. fos.close();
  62. } catch (IOException error) {
  63. error.printStackTrace();
  64. }
  65. System.exit(0);
  66. }
  67.  
  68. @Override
  69. public void windowClosed(WindowEvent e) {
  70. // TODO Auto-generated method stub
  71.  
  72. }
  73.  
  74. @Override
  75. public void windowActivated(WindowEvent e) {
  76. // TODO Auto-generated method stub
  77.  
  78. }
  79. });
  80. Container container = this.getContentPane();
  81. initTreeJPanel();
  82. inintButtonJpanel();
  83. JSplitPane mainFrameSplit = new JSplitPane();
  84. mainFrameSplit.setEnabled(false);
  85. mainFrameSplit.setLeftComponent(treeArea);
  86. mainFrameSplit.setRightComponent(text);
  87. treeArea.add(buttons,BorderLayout.SOUTH);
  88. container.add(mainFrameSplit);
  89. this.setMenuBar(getMenuBar());
  90.  
  91.  
  92. }
  93. /** * 初始化按键区域 */
  94. public void inintButtonJpanel(){
  95. model = (DefaultTreeModel)menuTree.getModel();
  96. JButton addSiblingButton = new JButton("添加兄弟结点");
  97. JButton addChildButton = new JButton("添加孩子结点");
  98. JButton deleteSelectedButton = new JButton("删除选中结点");
  99. JButton editSelectedButton = new JButton("编辑选中结点");
  100. buttons.add(addChildButton);
  101. buttons.add(addSiblingButton);
  102. buttons.add(deleteSelectedButton);
  103. buttons.add(editSelectedButton);
  104. //添加编辑结点的监听
  105. editSelectedButton.addActionListener(new ActionListener() {
  106.  
  107. @Override
  108. public void actionPerformed(ActionEvent e) {
  109. TreePath selectedPath = menuTree.getSelectionPath();
  110. if(selectedPath!=null){
  111. menuTree.startEditingAtPath(selectedPath);
  112. }
  113. text.append("编辑结点:"+selectedPath+"\n");
  114. }
  115. });
  116. //添加删除结点的监听
  117. deleteSelectedButton.addActionListener(new ActionListener() {
  118.  
  119. @Override
  120. public void actionPerformed(ActionEvent e) {
  121. TreePath selectedPath = menuTree.getSelectionPath();
  122. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)menuTree.getLastSelectedPathComponent();
  123. if (selectedNode!=null && selectedNode.getParent()!=null) {
  124. model.removeNodeFromParent(selectedNode);
  125. }
  126. text.append("删除了一个结点:"+selectedPath+"\n");
  127. }
  128. });
  129. //添加孩子结点的监听
  130. addChildButton.addActionListener(new ActionListener() {
  131.  
  132. @Override
  133. public void actionPerformed(ActionEvent e) {
  134. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)menuTree.getLastSelectedPathComponent();
  135. if (selectedNode == null) {
  136. return;
  137. }
  138.  
  139. DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新结点");
  140. selectedNode.add(newNode);
  141. TreeNode []nodes = model.getPathToRoot(newNode);
  142. TreePath path = new TreePath(nodes);
  143. menuTree.scrollPathToVisible(path);
  144. menuTree.updateUI();
  145. text.append("添加了一个结点:"+path+"\n");
  146.  
  147. }
  148. });
  149. //添加兄弟节点结点的监听
  150. addSiblingButton.addActionListener(new ActionListener() {
  151.  
  152. @Override
  153. public void actionPerformed(ActionEvent e) {
  154. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)menuTree.getLastSelectedPathComponent();
  155. if (selectedNode == null) {
  156. return;
  157. }
  158. DefaultMutableTreeNode parent = (DefaultMutableTreeNode)selectedNode.getParent();
  159. if (parent == null) {
  160. return;
  161. }
  162. DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新结点");
  163. int selectedIndex = parent.getIndex(selectedNode);
  164. model.insertNodeInto(newNode,parent,selectedIndex + 1);
  165. TreeNode []nodes = model.getPathToRoot(newNode);
  166. TreePath path = new TreePath(nodes);
  167. menuTree.scrollPathToVisible(path);
  168. text.append("添加了一个结点:"+path+"\n");
  169. }
  170. });
  171. }
  172. /** * 初始化树形结构 */
  173. public void initTreeJPanel(){
  174. menuTree.setEditable(true);
  175. treeArea.setLayout(new BorderLayout());
  176. int mainBorderWidth = getWidth();
  177. int mainBorderHeight = getHeight();
  178. treeArea.setPreferredSize(new Dimension(mainBorderWidth/4,mainBorderHeight) );
  179. menuTree.setShowsRootHandles(true);
  180. initTreeParam();
  181. JScrollPane jScrollTree = new JScrollPane();
  182. jScrollTree.getViewport().add(menuTree,1);
  183. treeArea.add(jScrollTree,BorderLayout.CENTER);
  184.  
  185. }
  186. /** * 初始化树形结构数据 */
  187. public void initTreeParam(){
  188. DefaultMutableTreeNode rootnode = (DefaultMutableTreeNode)menuTree.getModel().getRoot();
  189. rootnode.removeAllChildren();
  190. xmlFlag = xmlParser("xml/data.xml",top);
  191. if(!xmlFlag){
  192. return;
  193. }else {
  194. TreeNode root = (TreeNode)menuTree.getModel().getRoot();
  195. expandNode(menuTree,new TreePath(root),true,false);
  196. }
  197. }
  198. /** * 展开节点,好像有也可以 * @param tree * @param parent * @param expand * @param expandChildren */
  199. private void expandNode(JTree tree,TreePath parent,boolean expand,boolean expandChildren){
  200. TreeNode node = (TreeNode)parent.getLastPathComponent();
  201. if (node.getChildCount()>=0) {
  202. for (Enumeration e = node.children();e.hasMoreElements() ;) {
  203. TreeNode n = (TreeNode)e.nextElement();
  204. TreePath path = parent.pathByAddingChild(n);
  205. if (expandChildren) {
  206. expandNode(tree,path,expand,expandChildren);
  207. }
  208. }
  209. }
  210. if (expand) {
  211. tree.expandPath(parent);
  212. }else {
  213. tree.collapsePath(parent);
  214. }
  215. }
  216. /** * 将xml结点添加到swing树形结构 * @param path xml路径 * @param top swing树形结构的头结点 * @return */
  217. private boolean xmlParser(String path,DefaultMutableTreeNode top){
  218. File file = new File(path);
  219. DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
  220. try {
  221. DocumentBuilder dombuilder = domfac.newDocumentBuilder();
  222. Document doc = dombuilder.parse(new FileInputStream(file));
  223. Element root = doc.getDocumentElement();
  224. String name = root.getAttribute("name");
  225. DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(name);
  226. top.add(newnode);
  227. if (!Recurrence(root,newnode)) {
  228.  
  229. }
  230. } catch (ParserConfigurationException e) {
  231.  
  232. e.printStackTrace();
  233. } catch (FileNotFoundException e) {
  234. // TODO Auto-generated catch block
  235. e.printStackTrace();
  236. } catch (SAXException e) {
  237. // TODO Auto-generated catch block
  238. e.printStackTrace();
  239. } catch (IOException e) {
  240. // TODO Auto-generated catch block
  241. e.printStackTrace();
  242. }
  243.  
  244. return true;
  245. }
  246. /** * 遍历xml所有结点 * @param node xml结点 * @param top swing树形结构结点 * @return */
  247. private boolean Recurrence(Node node,DefaultMutableTreeNode top){
  248. List<Node> list = getElementNode(node);
  249. DefaultMutableTreeNode snode= null;
  250. if (list.size()==0) {
  251.  
  252. } else {
  253. for(Node n : list){
  254. NamedNodeMap nGetAttributes = n.getAttributes();
  255. String name = nGetAttributes.getNamedItem("name").getNodeValue();
  256. snode = new DefaultMutableTreeNode(name);
  257. top.add(snode);
  258. if (!Recurrence(n,snode)) {
  259. return false;
  260. }
  261. }
  262. }
  263. return true;
  264. }
  265. /** * 找到xml结点的子节点 * @param node xml结点 * @return */
  266. private List<Node> getElementNode(Node node){
  267. List<Node> list = new LinkedList<Node>();
  268. for (Node n = node.getFirstChild();n!=null;n=n.getNextSibling()) {
  269. if (n.getNodeType()==Node.ELEMENT_NODE) {
  270. list.add(n);
  271. }
  272. }
  273. return list;
  274. }
  275. /** * 将树形结构保存到xml文件中 * @param root 根节点 * @param fw 输出流 */
  276. public void saveToFile(DefaultMutableTreeNode root,OutputStreamWriter osw){
  277. try {
  278. osw.write("<node name=\""+root.toString()+"\">\r\n");
  279. for (int i=0; i < root.getChildCount(); i++){
  280. DefaultMutableTreeNode childNode =(DefaultMutableTreeNode)root.getChildAt(i);
  281. saveToFile(childNode,osw);
  282. }
  283. osw.write("</node>\r\n");
  284. }catch (Exception e){
  285. e.printStackTrace();
  286. }
  287. }
  288. public static void main(String[] args) {
  289. TreeFrame mainFrame = new TreeFrame();
  290. mainFrame.setResizable(false);
  291. mainFrame.setVisible(true);
  292.  
  293. }
  294.  
  295. }

猜你在找的XML相关文章