IT_Programming/Java

JTree의 기본 사용법

JJun ™ 2007. 5. 19. 10:25
LONG

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

class JTreeDemo extends JFrame
{
 private JTree jTree = null;
 private JPanel jp = new JPanel();
 private JButton addB = new JButton("추가");
 private JButton removeB = new JButton("삭제");
 private JButton updateB = new JButton("변경");
 private JButton checkdelB = new JButton("검색해서지우기");
 private DefaultTreeModel model = null;
 
 DefaultMutableTreeNode root = null;
 DefaultMutableTreeNode list = null;
 DefaultMutableTreeNode list2 = null;

 {
  jp.add(addB);
  jp.add(removeB);
  jp.add(updateB);
  jp.add(checkdelB);
 }

 public JTreeDemo() {
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  
  this.root = new DefaultMutableTreeNode("root");
  this.list = new DefaultMutableTreeNode("하위1");
  this.list2 = new DefaultMutableTreeNode("하위2");

  root.add(list);
  root.add(list2);
  jTree = new JTree(root);
  model = (DefaultTreeModel)jTree.getModel();
  
  this.add("Center", new JScrollPane(jTree));
  this.add("South", jp);
  
  /**선택할 하위노드(하위1,하위2)를 클릭하고 추가버튼을 눌러야 한다.**/
  this.addB.addActionListener(
   new ActionListener(){
    public void actionPerformed(ActionEvent e){
     if (getNodeLevel() == 1)
     {
      String newName = JOptionPane.showInputDialog(null,"추가할 이름을 적어주세요.");
      if (newName != null)
      {
       model.insertNodeInto(new DefaultMutableTreeNode(newName), getSelectedNode(), model.getChildCount(getSelectedNode()));
      }
     }
    }
  }
  );
  
  /**오직 리프노드만 삭제할 수 있다**/
  this.removeB.addActionListener(
   new ActionListener(){
    public void actionPerformed(ActionEvent e){
     if (getNodeLevel() == 2)
     {
      removeSelectedNode();
     }
    }
  }
  );

  /**오직 리프노드만 변경할 수 있다.**/
  this.updateB.addActionListener(
   new ActionListener(){
    public void actionPerformed(ActionEvent e){
     if (getNodeLevel() == 2)
     {
      String newName = JOptionPane.showInputDialog(null, "변경할 이름을 적어주세요.");
      if (newName != null)
      {
       changeNode(newName);
      }
      
     }
    }
  }
  );

  this.checkdelB.addActionListener(
   new ActionListener(){
    public void actionPerformed(ActionEvent e){
     String checkName = JOptionPane.showInputDialog(null, "검색해서 삭제할 이름을 적어주세요.");
     int count = model.getChildCount(list);
     int count2 = model.getChildCount(list2);
     
     for (int i=0; i<count; i++)
     {
      DefaultMutableTreeNode temp = (DefaultMutableTreeNode)model.getChild(list, i);
      if (checkName.equals(temp.toString()))
      {
       model.removeNodeFromParent(temp);
       return;
       
      }
     }

     for (int i=0; i<count2; i++)
     {
      DefaultMutableTreeNode temp = (DefaultMutableTreeNode)model.getChild(list2, i);
      if (checkName.equals(temp.toString()))
      {
       model.removeNodeFromParent(temp);
       return;
      }
     }
    }
  }
  );

  jTree.setRootVisible(false);
  this.pack();
 }

 

 /**선택된 노드의 오브젝트를 얻는 메소드**/
 private DefaultMutableTreeNode getSelectedNode() {
  /*첫번째 방법
  TreePath path = jTree.getSelectionPath();
  if (path == null)
  {
   return null;
  }
  return (DefaultMutableTreeNode)path.getLastPathComponent();
  */

  /*두번째 방법*/
  return (DefaultMutableTreeNode)jTree.getLastSelectedPathComponent();
 }
 
 /**선택한 노드를 삭제하는 메소드**/
 private void removeSelectedNode() {
  DefaultMutableTreeNode selectedNode = this.getSelectedNode();
  if (selectedNode != null)
  {
   this.model.removeNodeFromParent(selectedNode);
  }
 }
 
 /**선택한 노드를 새로운 노드로 바꾸는 메소드**/
 private void changeNode(String newName) {
  this.getSelectedNode().setUserObject(newName);
  model.nodeChanged(this.getSelectedNode()); 

  //이상하게 루트노드를 넣어주면 글자표시가 다 안된다...
 }

 /**루트부터 선택한 노드의 패스길이를 돌려주는 메소드**/
 private int getNodeLevel() {
  if (this.getSelectedNode() == null)
  {
   return 0;
  }
  return this.getSelectedNode().getLevel();
  
 }

 public static void main(String[] args)
 {
  new JTreeDemo().setVisible(true);
 }
}

ARTICLE

루트노드에 하위노드를 장착한다. 리프레벨이 될때까지 장착가능하다.

(리프레벨은 더이상 하위 노드를 가지지 않는 노드)

 

1.노드에 하위 노드를 추가 하는 방법

먼저 해당 트리의 모델을 얻어야 한다.
DefaulTreeModel model = (DefaultTreeModel)jTree.getModel();
모델을 얻었으면 DefaulTreeModel 의 insertNodeInto(MutableTreeNode  newChild, MutableTreeNode  parent, int index) 메소드를 이용하면 된다.

매개변수로 MutableTreeNode  newChild = 새노드

MutableTreeNode  parent   = 장착시킬 부모노드, int index)
int index      = 부모노드에 index번호의 위치에 장착시킨다.
이정도가 되겠다. 이런식으로 장착하면 되겟다.
model.insertNodeInto(new DefaultMutableTreeNode("추가할노드이름"), 장착시킬부모노드, model.getChildCount(장착할부모노드));

 

2.선택한 노드를 삭제 하는 방법.

먼저 선택한 노드의 오브젝트를 얻어야한다.
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)jTree.getLastSelectedPathComponent();
선택한 노드의 오브젝트를 얻었다면 역시 1번에서 얻어낸 model객체의 removeNodeFromParent(MutableTreeNode  node) 를 이용하면 된다. 매개변수는 얻어낸 노드의 오브젝트를 넣어주면 된다.
model.removeNodeFromParent(selectedNode);

 

3. 선택한 노드의 이름을 변경 하는 방법.

2번과 똑같이 선택한 노드의 오브젝트를 얻어온 뒤
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)jTree.getLastSelectedPathComponent();
얻어온 노드 오브젝트의 setUserObject("변경할 이름"); 메소드를 이용하면된다.
이런식으로 하면 된다.
selectedNode().setUserObject("변경할 이름");
그리고 변경했다면 무조건 아래의 메소드를 호출해야한다.  
model.nodeChanged(selectedNode()); 
  
아래 예제코드는 위의 설명을 응용한 것이다.

 

*********************************************************************************************

 

jtreedemo-jjaeko.java
0.01MB