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);
}
}
루트노드에 하위노드를 장착한다. 리프레벨이 될때까지 장착가능하다.
(리프레벨은 더이상 하위 노드를 가지지 않는 노드)
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());
아래 예제코드는 위의 설명을 응용한 것이다.
*********************************************************************************************
'IT_Programming > Java' 카테고리의 다른 글
JTable을 클릭해서 원하는 Cell 정보를 얻어오기 (0) | 2007.06.25 |
---|---|
[펌] Using Foreach Loops in J2SE 1.5 & The enhanced for loop (0) | 2007.06.23 |
jar 다룰 때 유의사항 (0) | 2007.05.19 |
Generics (0) | 2007.03.12 |
[펌] "시작하는 JAVA프로그래머를 위해" URL 리스트 (0) | 2007.03.07 |