树编辑程序

原创 2012年03月22日 10:24:07

以下源码展示了树编辑的实现(源码摘自《Java核心技术II》):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;


/**
 * This program demonstrates tree editing.
 * @version 1.03 2007-08-01
 * @author Cay Horstmann
 */
public class TreeEditTest
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(new Runnable()
         {
            public void run()
            {
               JFrame frame = new TreeEditFrame();
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
            }
         });
   }
}


/**
 * A frame with a tree and buttons to edit the tree.
 */
class TreeEditFrame extends JFrame
{
   public TreeEditFrame()
   {
      setTitle("TreeEditTest");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);


      // construct tree


      TreeNode root = makeSampleTree();
      model = new DefaultTreeModel(root);
      tree = new JTree(model);
      tree.setEditable(true);


      // add scroll pane with tree


      JScrollPane scrollPane = new JScrollPane(tree);
      add(scrollPane, BorderLayout.CENTER);


      makeButtons();
   }


   public TreeNode makeSampleTree()
   {
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
      DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
      root.add(country);
      DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
      country.add(state);
      DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose");
      state.add(city);
      city = new DefaultMutableTreeNode("San Diego");
      state.add(city);
      state = new DefaultMutableTreeNode("Michigan");
      country.add(state);
      city = new DefaultMutableTreeNode("Ann Arbor");
      state.add(city);
      country = new DefaultMutableTreeNode("Germany");
      root.add(country);
      state = new DefaultMutableTreeNode("Schleswig-Holstein");
      country.add(state);
      city = new DefaultMutableTreeNode("Kiel");
      state.add(city);
      return root;
   }


   /**
    * Makes the buttons to add a sibling, add a child, and delete a node.
    */
   public void makeButtons()
   {
      JPanel panel = new JPanel();
      JButton addSiblingButton = new JButton("Add Sibling");
      addSiblingButton.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
                     .getLastSelectedPathComponent();


               if (selectedNode == null) return;


               DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();


               if (parent == null) return;


               DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");


               int selectedIndex = parent.getIndex(selectedNode);
               model.insertNodeInto(newNode, parent, selectedIndex + 1);


               // now display new node


               TreeNode[] nodes = model.getPathToRoot(newNode);
               TreePath path = new TreePath(nodes);
               tree.scrollPathToVisible(path);
            }
         });
      panel.add(addSiblingButton);


      JButton addChildButton = new JButton("Add Child");
      addChildButton.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
                     .getLastSelectedPathComponent();


               if (selectedNode == null) return;


               DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
               model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());


               // now display new node


               TreeNode[] nodes = model.getPathToRoot(newNode);
               TreePath path = new TreePath(nodes);
               tree.scrollPathToVisible(path);
            }
         });
      panel.add(addChildButton);


      JButton deleteButton = new JButton("Delete");
      deleteButton.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
                     .getLastSelectedPathComponent();


               if (selectedNode != null && selectedNode.getParent() != null) model
                     .removeNodeFromParent(selectedNode);
            }
         });
      panel.add(deleteButton);
      add(panel, BorderLayout.SOUTH);
   }


   private DefaultTreeModel model;
   private JTree tree;
   private static final int DEFAULT_WIDTH = 400;
   private static final int DEFAULT_HEIGHT = 200;
}

相关文章推荐

代码编辑神器VIM(附我写acm程序时的配置)

有些牛X的人性格会比较古怪,VIM就是这么一位特立独行,难以琢磨的怪客。但如果熟悉了,你就会发现他的好。     VIM(VI,VIM,GVIM)这东西不好上手,而且是相当不好上手,基本上新手打开这...

RT-Thread 学习笔记(五)---编辑、下载、调试程序

软件环境:Win7,Keil MDK 4.72a, IAR EWARM 7.2, GCC 4.2,Python 2.7 ,SCons 2.3.2 硬件环境:Armfly STM32F103ZE-E...

Linux下C程序的编辑,编译和运行以及调试

转载地址:http://www.cnblogs.com/AloneSword/p/3512797.html Linux下C程序的编辑、编译和运行以及调试 要使用的工具: 编辑:vim(vi) 编辑和运...
  • ljh0302
  • ljh0302
  • 2017年03月03日 19:58
  • 385

使用 Notepad++ 编辑运行 Python 程序

Notepad++ 是一个开源的文本编辑器,功能强大而且使用方便。编辑和调试 Python 程序使用什么编辑器或者 IDE 不同人有不同见解。在不考虑使用调试工具的情况下,Vim 或者 Emacs 用...

【第一讲】APK应用程序的解包、修改、编辑、打包及应用(转)

APK应用程序的解包、修改、编辑、汉化、打包及应用 以下内容来自机锋网```作者找不到了`见谅!如果作者看到请联系本人修改! 前两讲主要讲玩机的最基本的知识,集中在如何刷机。本讲是进级的内容,来谈...

shell脚本编写之程序编辑demo

#! /bin/Bash #编写一个Shell程序,此程序的功能是:显示root下的文件信息,然后建立一个abc的文件夹 #在此文件夹下建立一个文件k.c,修改此文件的权限为可执行。 echo "...

Emacs编辑程序常用命令

1 定位命令2 格式重排3 注释4 自动补全命令5 浏览程序大纲(hs-minor-mode)6 其他工具6.1 imenu菜单6.2 which-func-mode6.3 show-paren-mo...

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

严蔚敏吴伟民版《数据结构》课本源码第3章栈和队列第3节行编辑程序。

C_栈的应用----行编辑程序

一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此,若在编译程序中,“每接受一个字符即存入用户数据区”的做法显然不是恰...

OSX: 实用脚本程序(bash scripts)系列-23-编辑认证数据库

详细解释见上一篇:OSX: 管理Authorization Database 这里主要是贴出可以使用的系统偏好配置的一个真实例子: #!/bin/bash ## Set the system Auth...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树编辑程序
举报原因:
原因补充:

(最多只允许输入30个字)