先简单的粘贴下代码,正在学习java的东西,正好用到swing,算是做个练习。API太多,还没有梳理太清楚,慢慢回顾。
- public class TreeFrame extends JFrame {
- public static final int WIDTH = 1100;
- public static final int HEIGHT = 615;
- private static int xlocation,ylocation;
- private boolean xmlFlag = false;
- private JPanel treeArea = new JPanel();
- private JPanel buttons = new JPanel();
- DefaultMutableTreeNode top = new DefaultMutableTreeNode("行政规划");
- private JTree menuTree = new JTree(top);
- private JTextArea text = new JTextArea();
-
- DefaultTreeModel model;
- FileOutputStream fos;
- OutputStreamWriter osw;
-
- public TreeFrame(){
- this.setTitle("省份名称");
- this.setSize(WIDTH,HEIGHT);
- Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- xlocation = (screenSize.width-WIDTH)/2;
- ylocation = (screenSize.height-HEIGHT)/2;
- this.setLocation(xlocation,ylocation);
- //设置关闭窗口
- this.addWindowListener(new WindowListener() {
-
- @Override
- public void windowOpened(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void windowIconified(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void windowDeiconified(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void windowDeactivated(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void windowClosing(WindowEvent e) {
- try {
- fos=new FileOutputStream("xml/data.xml");
- osw=new OutputStreamWriter(fos,"utf-8");
- osw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+"\r\n");
- model = (DefaultTreeModel)menuTree.getModel();
- DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
- //头结点行政规划不用保存
- saveToFile(root.getNextNode(),osw);
- osw.close();
- fos.close();
- } catch (IOException error) {
- error.printStackTrace();
- }
- System.exit(0);
- }
-
- @Override
- public void windowClosed(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void windowActivated(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
- });
- Container container = this.getContentPane();
- initTreeJPanel();
- inintButtonJpanel();
- JSplitPane mainFrameSplit = new JSplitPane();
- mainFrameSplit.setEnabled(false);
- mainFrameSplit.setLeftComponent(treeArea);
- mainFrameSplit.setRightComponent(text);
- treeArea.add(buttons,BorderLayout.SOUTH);
- container.add(mainFrameSplit);
- this.setMenuBar(getMenuBar());
-
-
- }
- /** * 初始化按键区域 */
- public void inintButtonJpanel(){
- model = (DefaultTreeModel)menuTree.getModel();
- JButton addSiblingButton = new JButton("添加兄弟结点");
- JButton addChildButton = new JButton("添加孩子结点");
- JButton deleteSelectedButton = new JButton("删除选中结点");
- JButton editSelectedButton = new JButton("编辑选中结点");
- buttons.add(addChildButton);
- buttons.add(addSiblingButton);
- buttons.add(deleteSelectedButton);
- buttons.add(editSelectedButton);
- //添加编辑结点的监听
- editSelectedButton.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- TreePath selectedPath = menuTree.getSelectionPath();
- if(selectedPath!=null){
- menuTree.startEditingAtPath(selectedPath);
- }
- text.append("编辑结点:"+selectedPath+"\n");
- }
- });
- //添加删除结点的监听
- deleteSelectedButton.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- TreePath selectedPath = menuTree.getSelectionPath();
- DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)menuTree.getLastSelectedPathComponent();
- if (selectedNode!=null && selectedNode.getParent()!=null) {
- model.removeNodeFromParent(selectedNode);
- }
- text.append("删除了一个结点:"+selectedPath+"\n");
- }
- });
- //添加孩子结点的监听
- addChildButton.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)menuTree.getLastSelectedPathComponent();
- if (selectedNode == null) {
- return;
- }
-
- DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新结点");
- selectedNode.add(newNode);
- TreeNode []nodes = model.getPathToRoot(newNode);
- TreePath path = new TreePath(nodes);
- menuTree.scrollPathToVisible(path);
- menuTree.updateUI();
- text.append("添加了一个结点:"+path+"\n");
-
- }
- });
- //添加兄弟节点结点的监听
- addSiblingButton.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)menuTree.getLastSelectedPathComponent();
- if (selectedNode == null) {
- return;
- }
- DefaultMutableTreeNode parent = (DefaultMutableTreeNode)selectedNode.getParent();
- if (parent == null) {
- return;
- }
- DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新结点");
- int selectedIndex = parent.getIndex(selectedNode);
- model.insertNodeInto(newNode,parent,selectedIndex + 1);
- TreeNode []nodes = model.getPathToRoot(newNode);
- TreePath path = new TreePath(nodes);
- menuTree.scrollPathToVisible(path);
- text.append("添加了一个结点:"+path+"\n");
- }
- });
- }
- /** * 初始化树形结构 */
- public void initTreeJPanel(){
- menuTree.setEditable(true);
- treeArea.setLayout(new BorderLayout());
- int mainBorderWidth = getWidth();
- int mainBorderHeight = getHeight();
- treeArea.setPreferredSize(new Dimension(mainBorderWidth/4,mainBorderHeight) );
- menuTree.setShowsRootHandles(true);
- initTreeParam();
- JScrollPane jScrollTree = new JScrollPane();
- jScrollTree.getViewport().add(menuTree,1);
- treeArea.add(jScrollTree,BorderLayout.CENTER);
-
- }
- /** * 初始化树形结构数据 */
- public void initTreeParam(){
- DefaultMutableTreeNode rootnode = (DefaultMutableTreeNode)menuTree.getModel().getRoot();
- rootnode.removeAllChildren();
- xmlFlag = xmlParser("xml/data.xml",top);
- if(!xmlFlag){
- return;
- }else {
- TreeNode root = (TreeNode)menuTree.getModel().getRoot();
- expandNode(menuTree,new TreePath(root),true,false);
- }
- }
- /** * 展开节点,好像有也可以 * @param tree * @param parent * @param expand * @param expandChildren */
- private void expandNode(JTree tree,TreePath parent,boolean expand,boolean expandChildren){
- TreeNode node = (TreeNode)parent.getLastPathComponent();
- if (node.getChildCount()>=0) {
- for (Enumeration e = node.children();e.hasMoreElements() ;) {
- TreeNode n = (TreeNode)e.nextElement();
- TreePath path = parent.pathByAddingChild(n);
- if (expandChildren) {
- expandNode(tree,path,expand,expandChildren);
- }
- }
- }
- if (expand) {
- tree.expandPath(parent);
- }else {
- tree.collapsePath(parent);
- }
- }
- /** * 将xml结点添加到swing树形结构 * @param path xml路径 * @param top swing树形结构的头结点 * @return */
- private boolean xmlParser(String path,DefaultMutableTreeNode top){
- File file = new File(path);
- DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
- try {
- DocumentBuilder dombuilder = domfac.newDocumentBuilder();
- Document doc = dombuilder.parse(new FileInputStream(file));
- Element root = doc.getDocumentElement();
- String name = root.getAttribute("name");
- DefaultMutableTreeNode newnode = new DefaultMutableTreeNode(name);
- top.add(newnode);
- if (!Recurrence(root,newnode)) {
-
- }
- } catch (ParserConfigurationException e) {
-
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SAXException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return true;
- }
- /** * 遍历xml所有结点 * @param node xml结点 * @param top swing树形结构结点 * @return */
- private boolean Recurrence(Node node,DefaultMutableTreeNode top){
- List<Node> list = getElementNode(node);
- DefaultMutableTreeNode snode= null;
- if (list.size()==0) {
-
- } else {
- for(Node n : list){
- NamedNodeMap nGetAttributes = n.getAttributes();
- String name = nGetAttributes.getNamedItem("name").getNodeValue();
- snode = new DefaultMutableTreeNode(name);
- top.add(snode);
- if (!Recurrence(n,snode)) {
- return false;
- }
- }
- }
- return true;
- }
- /** * 找到xml结点的子节点 * @param node xml结点 * @return */
- private List<Node> getElementNode(Node node){
- List<Node> list = new LinkedList<Node>();
- for (Node n = node.getFirstChild();n!=null;n=n.getNextSibling()) {
- if (n.getNodeType()==Node.ELEMENT_NODE) {
- list.add(n);
- }
- }
- return list;
- }
- /** * 将树形结构保存到xml文件中 * @param root 根节点 * @param fw 输出流 */
- public void saveToFile(DefaultMutableTreeNode root,OutputStreamWriter osw){
- try {
- osw.write("<node name=\""+root.toString()+"\">\r\n");
- for (int i=0; i < root.getChildCount(); i++){
- DefaultMutableTreeNode childNode =(DefaultMutableTreeNode)root.getChildAt(i);
- saveToFile(childNode,osw);
- }
- osw.write("</node>\r\n");
- }catch (Exception e){
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- TreeFrame mainFrame = new TreeFrame();
- mainFrame.setResizable(false);
- mainFrame.setVisible(true);
-
- }
-
- }