Xml Dosyalarını Jdom Kullanarak JTree’de Nasıl Gösterebilirim ?

Recep May 1, 2012
2 people like this post

Merhaba arkadaşlar, projelerimi geliştirirken karşılaştığım problemlerin çözümlerini paylaşmaya devam ediyorum. Bildiğiniz gibi Xml dosyaları ağaç yapısına sahip bir hiyerarşidedir. Bu xml dosyasını önce jtable da göstermek istedim ancak, xml üzerinde kullanıcı dinamik olarak değişiklikler, sub element eklemeleri yapacağı için jtable’ın mantıksız olacağı kanısına vardıktan sonra Jtree’nin en mantıklı çözüm olduğuna karar verdim. Ancak bu konuyla alakalı türkçe kaynak bulmak gerçekten çok zor.

Xml dosyalarını parse etmek için birkaç library mevcut. Dom, JDom, Sax… gibi. Bana en hızlı ve gelişmiş olarak gelen JDom olduğu için onu kullanıyorum. Dom ilk başlarda çok uğraştım ancak başa bela anlamsız bir mantığı var ve daha fazla kodlama gerektiriyor.

İşleme başlamadan önce JDom Library indirip projemize ekleyelim. (harika bi kütüphane 🙂 )

JTree’nin kullanımı için iki adet class oluşturuyorum. XmlTreeElement.java ve XmlTreeModel.java.

XmlTreeModel.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package JtreePackage;

import java.util.List;
import java.util.Vector;

import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import org.jdom.*;
import org.jdom.Element;

/**
 *
 * @author BSTNC
 */
public class XmlTreeModel2 implements TreeModel {

//    private Document document;
    private Element mev;

    public Element getMev() {
        return mev;
    }

    public void setMev(Element mev) {
        this.mev = mev;
    }
    Vector listeners = new Vector();

//    public Document getDocument() {
//        return document;
//    }

    public void setDocument(Document document) {
//        this.document = document;
        TreeModelEvent evt = new TreeModelEvent(this, new TreePath(getRoot()));

        for (TreeModelListener listener : listeners) {
            listener.treeStructureChanged(evt);
        }
    }

    @Override
    public Object getRoot() {
        //return  document.getRootElement();
        return new XmlTreeElement(getMev());
    }

    @Override
    public Object getChild(Object parent, int index) {
        		if (parent instanceof XmlTreeElement) {
			Vector elements = getChildElements
                             (((XmlTreeElement)parent).getElement());
			return new XmlTreeElement(elements.get(index)) ;
		}
		else {
			return null;
		}
    }

    @Override
    public int getChildCount(Object parent) {
        if (parent instanceof XmlTreeElement) {
			Vector elements = getChildElements(
                           ((XmlTreeElement)parent).getElement());
			return elements.size();
		}
		return 0;
    }

    @Override
    public boolean isLeaf(Object Obj) {
        		if (Obj instanceof XmlTreeElement) {
			Element element = ((XmlTreeElement)Obj).getElement();
			Vector elements = getChildElements(element);
			return elements.size()==0;
		}
		else {
			return true;
		}
    }

    @Override
    public void valueForPathChanged(TreePath path, Object newValue) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int getIndexOfChild(Object parent, Object child) {
        if (parent instanceof XmlTreeElement && child instanceof XmlTreeElement) {
			Element pElement = ((XmlTreeElement)parent).getElement();
			Element cElement = ((XmlTreeElement)child).getElement();
			if (cElement.getParentElement()!= pElement) {
				return -1;
			}
			Vector elements = getChildElements(pElement);
			return elements.indexOf(cElement);
		}
		return -1;
    }

    @Override
    public void addTreeModelListener(TreeModelListener l) {
        if (!listeners.contains(l)) {
			listeners.add(l);
		}
    }

    @Override
    public void removeTreeModelListener(TreeModelListener l) {
        listeners.remove(l);
    }
    private Vector getChildElements(Element el) {
		Vector Velements = new Vector();
		List list = el.getChildren();
		for (int i=0 ; i
                        if (list.get(i).getClass() == Element.class) {
				Velements.add(list.get(i));
			}
		}
		return Velements;
	}
}

XmlTreeElement.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package JtreePackage;

import java.util.List;
import org.jdom.Element;
import org.jdom.Text;

/**
 *
 * @author BSTNC
 */
public class XmlTreeElement {
 Element element;
 public XmlTreeElement(Element element) {
 this.element = element;
 }
 public Element getElement() {
 return element;
 }
 public String toString() {
 return element.getName();
 }
 public String getText() {
 List list = element.getChildren();
 for (int i=0 ; i if (list.get(i) instanceof Text) {
 return ((Text)list.get(i)).getValue();
 }
 }
 return "";
 }

}

AgacGoster() Metodu

public void AgactaGoster() throws JDOMException {
        try {
            XmlTreeModel2 model = new XmlTreeModel2();
            Document document = null;
            try {
                SAXBuilder builder = new SAXBuilder();
                File xmlFile = new File(AnaPaket.FormAna.XmlURL);
                document = (Document) builder.build(xmlFile);
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(1);
            }

            //model.setDocument(convertToDOM(document));
            model.setMev(GETMevzuBahisTarget());
            model.setDocument(document);
            jTree1.setModel(model);
            jTree1.setShowsRootHandles(true);
            jTree1.setEditable(false);
            jTree1.addTreeSelectionListener(new TreeSelectionListener() {

                @Override
                public void valueChanged(TreeSelectionEvent e) {
                    Object lpc = e.getPath().getLastPathComponent();
                    if (lpc instanceof XmlTreeElement) {
                        jLabel4.setText(((XmlTreeElement) lpc).getElement().getName());
                        //jLayeredPane1.removeAll();
                        jDesktopPane1.removeAll();
                        jDesktopPane1.updateUI();
                        ////INTERNAL JFRAME'LER OLSTURULACAK
                        Jar2 a = new Jar2();
                        jDesktopPane1.add(a);
                        jDesktopPane1.setVisible(true);
                    }
                }
            });
            setVisible(true);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "ID'ye ait bir target bulunamadı !");
            txtTargetID.setText("");
            jTree1.removeAll();
            jTree1.updateUI();
        }

    }

GETMevzuBahisTarget() Metodu

private Element GETMevzuBahisTarget() {
        try {
            SAXBuilder builder = new SAXBuilder();
            File xmlFile = new File(AnaPaket.FormAna.XmlURL);

            org.jdom.Document document = (org.jdom.Document) builder.build(xmlFile);
            Element rootNode = document.getRootElement();
            List targetList = rootNode.getChildren("target");

            for (int i = 0; i < targetList.size(); i++) {
                Element birtarget = (Element) targetList.get(i);
                if (birtarget.getAttributeValue("ID").equals(txtTargetID.getText())) {
                    System.out.println(birtarget.getAttributeValue("ID")
                                                 + "" + birtarget.getName());
                    return birtarget;
                }

            }

        } catch (Exception ex) {
//            JOptionPane.showMessageDialog(this, "ID'ye ait bir target bulunamadı !");
//            txtTargetID.setText("");
        }
        return null;
    }

( 971 )

  • 0
  • 142

Leave your comment