import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.tree.*;
import com.borland.jbcl.layout.*;
import java.io.BufferedReader;
import SuperEditor.BNF.*;
import SuperEditor.BNF.Common.ConstDefine;
import java.io.FileReader;
import java.util.*;
public class MTree
{
  private JTree tagTree = new JTree();
  private JPopupMenu treeMenu = new JPopupMenu();
  private FrameMain frameMain;
  private Node mProjectNode;
  private Node mTemplateNode;
  private String oldNodeName;
  private String txtFilePath;
  private boolean addMenuItemClick = false;
  private boolean alertMenuItemClick = false;
  private LinkedList mFileName = null;  public MTree(Node templateNode, Node prjNode, FrameMain frame, String filePath,LinkedList fileName)  {
    mTemplateNode = templateNode;
    mProjectNode = prjNode;
    frameMain = frame;
    txtFilePath = filePath;
    mFileName = fileName;
    createRootNode();
  }  public JTree getTree()  {
    return tagTree;
  }    public void createRootNode()    {
      try{
        for(int loop=0; loop<mFileName.size(); loop++)        {
          String text = readFile(txtFilePath + (String)mFileName.get(loop)+".txt");
          mProjectNode.arrDecompose((String)mFileName.get(loop),text,mTemplateNode);
        }
      }
      catch(Exception e){
        System.out.println(e.getMessage());
      }
      mProjectNode.setName(ConstDefine.DefaultProjectName);
      if(ConstDefine.Debug_Mode)
        mProjectNode.print_it();
    }    public boolean createTree()
    {
      if(mProjectNode == null)
        return false;
      DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("プロジェクト");
      LinkedList lst1=mProjectNode.getList();      if(lst1 != null)
      {
         for (int loop = 0; loop < lst1.size(); loop++)
         {
           Node snode = (Node) lst1.get(loop);
           if(snode != null)
             mTreeAddNode(rootNode, snode);
         }
       }
       tagTree.setModel(new DefaultTreeModel(rootNode));
       cteateMenu();//マウス右キのイベントの追加
       tagTree.addMouseListener(new MouseAdapter()
       {
         public void mouseClicked(MouseEvent evt)
         {
           String selectionNodePath = null;
           if(evt.getModifiers() == Event.META_MASK)
           {
             TreePath selectionPath = tagTree.getSelectionPath();
             if(selectionPath != null)
             {
               int length = selectionPath.toString().split(",").length;
               if (length >= 2)               {
                 treeMenu.show(tagTree, evt.getX(), evt.getY());
               }
             }
           }
         }
       });
       return true;
     }    public void mTreeAddNode(DefaultMutableTreeNode rootNode,Node treenode)
    {
      DefaultMutableTreeNode cNode = new DefaultMutableTreeNode(treenode.getName());
      rootNode.add(cNode);
      LinkedList lst1 = treenode.getList();      if(lst1 != null)
      {
        for(int loop = 0; loop < lst1.size(); loop++)
        {
          Node snode = (Node) lst1.get(loop);
          if(snode != null)
            this.treeAddNode(cNode, snode);
        }
      }
    }     private void treeAddNode(DefaultMutableTreeNode rootNode,Node treenode)
     {
       DefaultMutableTreeNode cNode=null;
       if(rootNode.toString().equals(""))
         cNode=rootNode;
       else
       {
         String name = treenode.getName();
         if (name == null || name.equals(""))
           name = "unknown";
         cNode = new DefaultMutableTreeNode(name);
         rootNode.add(cNode);
      }
      LinkedList lst1=treenode.getList();      if(lst1 != null)
      {
        for(int loop = 0; loop < lst1.size(); loop++)
        {
          Node snode = (Node) lst1.get(loop);
          if(snode != null)
             this.treeAddNode(cNode, snode);
         }
       }
     }     private void cteateMenu()
     {
       treeMenu = new JPopupMenu();
       JMenuItem menuItemAdd = new JMenuItem();
       menuItemAdd.setText("追加");
       JMenuItem menuItemRemove = new JMenuItem();
       menuItemRemove.setText("削除");
       JMenuItem menuItemAlertName = new JMenuItem();
       menuItemAlertName.setText("名前の変更");
       treeMenu.add(menuItemAdd);
       treeMenu.add(menuItemRemove);
       treeMenu.add(menuItemAlertName);       menuItemAdd.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
         {
           addMenuItemClick = true;
           addNode();
         }
       });       menuItemRemove.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
         {           removeNode();
         }
       });       menuItemAlertName.addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
         {
           alertMenuItemClick = true;
           alertNodeName();
         }
       });
     }

解决方案 »

  1.   

    private void addNode()
      {
        String strMessage = "アイテムを追加するか";
        String title = "アイテムの追加";
        int btnTag = JOptionPane.showConfirmDialog(null, strMessage, title,
                                                   JOptionPane.ERROR_MESSAGE);
        if(btnTag == JOptionPane.YES_OPTION)
        {
          DefaultMutableTreeNode childNode = new DefaultMutableTreeNode("new node");
          DefaultTreeModel model = (DefaultTreeModel)tagTree.getModel();
          DefaultMutableTreeNode chosenNode = (DefaultMutableTreeNode) tagTree.getLastSelectedPathComponent();
          if (chosenNode != null)      {
            model.insertNodeInto(childNode, chosenNode, 0);
            if(!tagTree.isExpanded(tagTree.getSelectionPath()))
              tagTree.expandPath(tagTree.getSelectionPath());
          }
          tagTree.setEditable(true);
          tagTree.setSelectionRow(tagTree.getSelectionRows()[0] + 1);
          tagTree.startEditingAtPath(tagTree.getSelectionPath());
    /* マウスのイベントの追加。ノードの編集状態を取り消す */
          tagTree.addMouseListener(new MouseAdapter()
          {
            public void mouseClicked(MouseEvent evt)
            {
              if(tagTree.isEditable() && tagTree.isEditing()  && addMenuItemClick)
              {
                String alertName = (String)tagTree.getCellEditor().getCellEditorValue();
                TreePath editingNodePath = tagTree.getEditingPath();
                ((DefaultTreeModel)tagTree.getModel()).valueForPathChanged(editingNodePath,alertName);
                String path = tagTree.getEditingPath().toString();
                String pathBuffer[] = path.split(",");
                int length = pathBuffer.length;
                pathBuffer[length-1] = pathBuffer[length-1].substring(0,pathBuffer[length-1].length()-1);
                LinkedList pathList = new LinkedList();
                pathList.add(ConstDefine.DefaultProjectName);            for(int index=1; index<pathBuffer.length; index++)
                {
                  pathList.add(pathBuffer[index].trim());            }            mProjectNode.cloneNode(pathList,mTemplateNode);
                if(ConstDefine.Debug_Mode)
                  mProjectNode.print_it();
                tagTree.setEditable(false);
                addMenuItemClick = false;
                frameMain.createTree();
              }
            }
          });
        }
        else
          return;
      }  private void removeNode()
      {
        String strMessage = "アイテムを削除するか";
        String title = "アイテムの削除";
        LinkedList removedNodePath = getSelectedNodePath();
        String removedNodeName = (String)removedNodePath.getLast();
        int btnTag = JOptionPane.showConfirmDialog(null, strMessage, title,
                                                   JOptionPane.ERROR_MESSAGE);
        if(btnTag == JOptionPane.YES_OPTION)
        {
          DefaultTreeModel model = (DefaultTreeModel) tagTree.getModel();
          DefaultMutableTreeNode chosenNode = (DefaultMutableTreeNode) tagTree.
              getLastSelectedPathComponent();
          if(chosenNode != null)
          {
            //treeからノードを削除する
            model.removeNodeFromParent(chosenNode);
            //ArrayNodeからノードを削除する
            mProjectNode.delNode(removedNodePath,removedNodeName);
          }
        }
        else
          return;
      } private void alertNodeName()
     {
       tagTree.setEditable(true);
       DefaultTreeModel model = (DefaultTreeModel)tagTree.getModel();
       DefaultMutableTreeNode chosenNode = (DefaultMutableTreeNode)tagTree.getLastSelectedPathComponent();
       oldNodeName = (String)getSelectedNodePath().getLast();
       tagTree.startEditingAtPath(tagTree.getSelectionPath());
       tagTree.addMouseListener(new MouseAdapter()
       {
         public void mouseClicked(MouseEvent evt)
         {
           if(tagTree.isEditable() && tagTree.isEditing() && alertMenuItemClick)
           {
             String newName = (String)tagTree.getCellEditor().getCellEditorValue();
             TreePath editingNodePath = tagTree.getEditingPath();
             ((DefaultTreeModel)tagTree.getModel()).valueForPathChanged(editingNodePath, newName);
             String path = tagTree.getEditingPath().toString();
             String pathBuffer[] = path.split(",");
             pathBuffer[0] = pathBuffer[0].substring(1,pathBuffer[0].length());
             LinkedList pathList = new LinkedList();
             for(int index = 0; index<pathBuffer.length-1; index++)         {
               pathList.add(pathBuffer[index].trim());
             }
             pathList.add(oldNodeName);
             mProjectNode.replaceNodeName(pathList, newName);
             alertMenuItemClick = false;
             tagTree.setEditable(false);
           }
         }
       });
     }  public LinkedList getSelectedNodePath()
      {
        LinkedList pathList = new LinkedList();
        TreePath path = tagTree.getSelectionPath();
        if (path == null)
          return null;
        String selectionNodePath = path.toString();
        String pathBuffer[] = selectionNodePath.split(",");
        pathBuffer[0] = pathBuffer[0].substring(1,pathBuffer[0].length());
        if(pathBuffer.length <= 1)
          return pathList;    for(int index = 0; index < pathBuffer.length; index++)
        {
          String nodeName = null;
          if(index == pathBuffer.length-1)
            nodeName = pathBuffer[index].substring(0,pathBuffer[index].length() - 1);
          else
            nodeName = pathBuffer[index];
          pathList.add(nodeName.trim());
        }
        return pathList;
      }   public LinkedList getSelectedNodeAssign()
       {
         LinkedList pathList = getSelectedNodePath();
         if(pathList == null)
           return null;
         pathList.removeFirst();
         LinkedList assList = mProjectNode.getAssign(pathList);
         return assList;
       }   public String getNodeExpression()
       {
         LinkedList pathList = getSelectedNodePath();
         if(pathList == null)
           return null;
         if(pathList.size()!=0)
           pathList.removeFirst();     String expression = mProjectNode.getExpression(0, pathList);
         return expression;
       }    public String readFile(String fileName)
        {
          StringBuffer buffer= new StringBuffer();
          try{
            File file = new File(fileName);
            if(file.exists())
            {
              String str;
              BufferedReader inBuffer = new BufferedReader(new FileReader(file));
              LineNumberReader lines = new LineNumberReader(new StringReader(buffer.toString()));
              int lineNumber = 0;
              while((str = inBuffer.readLine()) != null)
              {
                if (str.indexOf("#")!=0 && str.compareTo("")!=0)
                {
                  str = repalceString(str);
                  buffer.append(str).append("\n");
                  lineNumber = lines.getLineNumber();
                }
              }
              inBuffer.close();
            }
            else
              return null;
          }
          catch(IOException e)
          {     }
          return buffer.toString();
        }     private String repalceString(String replacedStr)
         {
           String towSpaces = "  ";
           String oneSpace = " ";
           String noTabSpaceStr = replacedStr;
           noTabSpaceStr = noTabSpaceStr.replaceAll("\t", oneSpace);
           noTabSpaceStr = noTabSpaceStr.replaceAll(" ", oneSpace);
           while(true)
           {
             noTabSpaceStr = noTabSpaceStr.replaceAll(towSpaces,oneSpace);
             int index = noTabSpaceStr.indexOf(towSpaces);
             if(index == -1)
               break;
           }
           return noTabSpaceStr;
         }
    }