{"id":38320,"date":"2026-01-28T17:41:03","date_gmt":"2026-01-28T14:41:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38320"},"modified":"2026-01-28T17:41:03","modified_gmt":"2026-01-28T14:41:03","slug":"primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/","title":{"rendered":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz"},"content":{"rendered":"<p><body><\/p>\n<h2>PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern web uygulamalar\u0131nda, veriler genellikle d\u00fcz bir liste veya basit bir tablo yap\u0131s\u0131ndan daha karma\u015f\u0131k ili\u015fkiler i\u00e7erir. \u00d6zellikle hiyerar\u015fik veriler, ebeveyn-\u00e7ocuk ili\u015fkileriyle birbirine ba\u011fl\u0131 \u00f6\u011felerden olu\u015fan a\u011fa\u00e7 benzeri yap\u0131lar sunar. Dosya sistemleri, organizasyon \u015femalar\u0131, \u00fcr\u00fcn kategorileri, men\u00fc yap\u0131lar\u0131 veya yorum dizileri gibi bir\u00e7ok senaryo, bu t\u00fcr hiyerar\u015fik yap\u0131lar\u0131 etkin bir \u015fekilde g\u00f6rselle\u015ftirmeyi ve y\u00f6netmeyi gerektirir.<\/p>\n<p>PrimeFaces, JavaServer Faces (JSF) tabanl\u0131 uygulamalar i\u00e7in zengin bir bile\u015fen k\u00fct\u00fcphanesi sunarak geli\u015ftiricilerin kullan\u0131c\u0131 aray\u00fczlerini h\u0131zl\u0131 ve kolay bir \u015fekilde olu\u015fturmalar\u0131na olanak tan\u0131r. Bu k\u00fct\u00fcphanenin en g\u00fc\u00e7l\u00fc ve esnek bile\u015fenlerinden ikisi, hiyerar\u015fik verilerin g\u00f6sterimi ve etkile\u015fimi i\u00e7in tasarlanm\u0131\u015f <code><p:tree><\/code> (A\u011fa\u00e7) ve <code><p:treeTable><\/code> (A\u011fa\u00e7 Tablosu) bile\u015fenleridir. Bu makalede, bu bile\u015fenlerin temel yap\u0131 ta\u015f\u0131ndan ba\u015flayarak (TreeNode), kapsaml\u0131 kullan\u0131m \u00f6rnekleri ve ileri seviye konularla birlikte derinlemesine incelenecektir. Amac\u0131m\u0131z, geli\u015ftiricilerin PrimeFaces Tree ve TreeTable bile\u015fenlerini projelerinde g\u00fcvenle ve etkin bir \u015fekilde kullanabilmeleri i\u00e7in gerekli t\u00fcm bilgileri sa\u011flamakt\u0131r.<\/p>\n<h3>TreeNode Temelleri: Hiyerar\u015finin Yap\u0131 Ta\u015f\u0131<\/h3>\n<p>PrimeFaces Tree ve TreeTable bile\u015fenlerinin kalbinde <code>org.primefaces.model.TreeNode<\/code> aray\u00fcz\u00fc yer al\u0131r. Bu aray\u00fcz, a\u011fa\u00e7 yap\u0131s\u0131ndaki her bir d\u00fc\u011f\u00fcm\u00fc (node) temsil eder ve hiyerar\u015finin temel yap\u0131 ta\u015f\u0131d\u0131r. Bir <code>TreeNode<\/code> nesnesi, a\u011fa\u00e7taki bir \u00f6\u011fenin verilerini, \u00e7ocuklar\u0131n\u0131, ebeveynini ve durumunu (geni\u015fletilmi\u015f mi, se\u00e7ili mi vb.) tutar.<\/p>\n<h4>TreeNode Aray\u00fcz\u00fcn\u00fcn Temel \u00d6zellikleri<\/h4>\n<p><code>TreeNode<\/code> aray\u00fcz\u00fc, bir d\u00fc\u011f\u00fcm\u00fcn temel \u00f6zelliklerini ve davran\u0131\u015flar\u0131n\u0131 tan\u0131mlar:<\/p>\n<p>*   <strong><code>Object getData()<\/code> ve <code>void setData(Object data)<\/code>:<\/strong> Bu metotlar, d\u00fc\u011f\u00fcm\u00fcn temsil etti\u011fi ger\u00e7ek veri nesnesine eri\u015fim sa\u011flar. \u00d6rne\u011fin, bir dosya sistemi a\u011fac\u0131nda bu bir <code>File<\/code> nesnesi, bir organizasyon \u015femas\u0131nda ise bir <code>Employee<\/code> veya <code>Department<\/code> nesnesi olabilir.<br \/>\n*   <strong><code>List<TreeNode> getChildren()<\/code>:<\/strong> Bir d\u00fc\u011f\u00fcm\u00fcn do\u011frudan alt\u0131ndaki \u00e7ocuk d\u00fc\u011f\u00fcmlerinin listesini d\u00f6nd\u00fcr\u00fcr. Bu liste, a\u011fa\u00e7 yap\u0131s\u0131n\u0131n hiyerar\u015fisini olu\u015fturur.<br \/>\n*   <strong><code>TreeNode getParent()<\/code> ve <code>void setParent(TreeNode parent)<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn ebeveyn d\u00fc\u011f\u00fcm\u00fcn\u00fc temsil eder. K\u00f6k d\u00fc\u011f\u00fcm\u00fcn ebeveyni <code>null<\/code> olur.<br \/>\n*   <strong><code>String getType()<\/code> ve <code>void setType(String type)<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn tipini belirten bir string de\u011feridir. Bu, farkl\u0131 d\u00fc\u011f\u00fcm tipleri i\u00e7in farkl\u0131 simgeler veya g\u00f6r\u00fcn\u00fcmler tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r (\u00f6rne\u011fin, &#8220;klas\u00f6r&#8221;, &#8220;dosya&#8221;, &#8220;\u00e7al\u0131\u015fan&#8221;, &#8220;departman&#8221;).<br \/>\n*   <strong><code>boolean isExpanded()<\/code> ve <code>void setExpanded(boolean expanded)<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn kullan\u0131c\u0131 aray\u00fcz\u00fcnde geni\u015fletilmi\u015f (a\u00e7\u0131k) olup olmad\u0131\u011f\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <strong><code>boolean isSelected()<\/code> ve <code>void setSelected(boolean selected)<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn kullan\u0131c\u0131 aray\u00fcz\u00fcnde se\u00e7ili olup olmad\u0131\u011f\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <strong><code>boolean isPartialSelected()<\/code> ve <code>void setPartialSelected(boolean partialSelected)<\/code>:<\/strong> Bir d\u00fc\u011f\u00fcm\u00fcn t\u00fcm \u00e7ocuklar\u0131 se\u00e7ili de\u011filse ancak baz\u0131 \u00e7ocuklar\u0131 se\u00e7iliyse bu durum <code>true<\/code> olur. Genellikle checkbox se\u00e7im modunda kullan\u0131l\u0131r.<br \/>\n*   <strong><code>boolean isLeaf()<\/code>:<\/strong> D\u00fc\u011f\u00fcm\u00fcn \u00e7ocuk d\u00fc\u011f\u00fcm\u00fc olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer hi\u00e7 \u00e7ocu\u011fu yoksa <code>true<\/code> d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong><code>void addChild(TreeNode node)<\/code> ve <code>void removeChild(TreeNode node)<\/code>:<\/strong> D\u00fc\u011f\u00fcme \u00e7ocuk ekleme veya \u00e7\u0131karmay\u0131 sa\u011flar.<\/p>\n<h4>DefaultTreeNode S\u0131n\u0131f\u0131 ve Kullan\u0131m\u0131<\/h4>\n<p>PrimeFaces, <code>TreeNode<\/code> aray\u00fcz\u00fcn\u00fcn standart bir uygulamas\u0131n\u0131 <code>org.primefaces.model.DefaultTreeNode<\/code> s\u0131n\u0131f\u0131 ile sunar. \u00c7o\u011fu durumda, kendi \u00f6zel <code>TreeNode<\/code> uygulaman\u0131z\u0131 yazmak yerine <code>DefaultTreeNode<\/code> kullanmak yeterlidir.<\/p>\n<p>Bir a\u011fa\u00e7 yap\u0131s\u0131 olu\u015fturmak i\u00e7in genellikle k\u00f6k (root) d\u00fc\u011f\u00fcm ile ba\u015flan\u0131r ve ard\u0131ndan bu k\u00f6k d\u00fc\u011f\u00fcme veya di\u011fer d\u00fc\u011f\u00fcmlere alt d\u00fc\u011f\u00fcmler eklenir.<\/p>\n<p><strong>\u00d6rnek <code>DefaultTreeNode<\/code> Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-java\">import org.primefaces.model.DefaultTreeNode;\nimport org.primefaces.model.TreeNode;\n\npublic class TreeBean {\n\n    private TreeNode root;\n\n    public TreeBean() {\n        root = new DefaultTreeNode(\"Root\", null); \/\/ K\u00f6k d\u00fc\u011f\u00fcm, verisi \"Root\", ebeveyni yok.\n\n        \/\/ Belge d\u00fc\u011f\u00fcm\u00fc olu\u015fturma\n        TreeNode documents = new DefaultTreeNode(\"Belgeler\", root);\n        new DefaultTreeNode(\"word\", \"Rapor.docx\", documents);\n        new DefaultTreeNode(\"pdf\", \"Makale.pdf\", documents);\n\n        \/\/ Resim d\u00fc\u011f\u00fcm\u00fc olu\u015fturma\n        TreeNode images = new DefaultTreeNode(\"Resimler\", root);\n        new DefaultTreeNode(\"jpg\", \"Manzara.jpg\", images);\n        new DefaultTreeNode(\"png\", \"Logo.png\", images);\n\n        \/\/ Alt klas\u00f6r ve dosya\n        TreeNode subFolder = new DefaultTreeNode(\"Klas\u00f6r\", \"\u00d6nemli Belgeler\", documents);\n        new DefaultTreeNode(\"txt\", \"Notlar.txt\", subFolder);\n    }\n\n    public TreeNode getRoot() {\n        return root;\n    }\n\n    public void setRoot(TreeNode root) {\n        this.root = root;\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>DefaultTreeNode<\/code> kurucusunun \u00fc\u00e7 farkl\u0131 a\u015f\u0131r\u0131 y\u00fcklemesi kullan\u0131lm\u0131\u015ft\u0131r:<br \/>\n1.  <code>new DefaultTreeNode(Object data, TreeNode parent)<\/code>: Sadece veri ve ebeveyn belirterek varsay\u0131lan tipte (genellikle &#8220;default&#8221;) bir d\u00fc\u011f\u00fcm olu\u015fturur.<br \/>\n2.  <code>new DefaultTreeNode(String type, Object data, TreeNode parent)<\/code>: D\u00fc\u011f\u00fcm tipini, verisini ve ebeveynini belirterek daha \u00f6zelle\u015ftirilmi\u015f bir d\u00fc\u011f\u00fcm olu\u015fturur. Bu, farkl\u0131 d\u00fc\u011f\u00fcm tipleri i\u00e7in farkl\u0131 g\u00f6r\u00fcn\u00fcmler sa\u011flamak a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/p>\n<p>Bu \u015fekilde, hiyerar\u015fik veri yap\u0131s\u0131 bellekte <code>TreeNode<\/code> nesneleri arac\u0131l\u0131\u011f\u0131yla temsil edilir ve PrimeFaces bile\u015fenleri bu yap\u0131y\u0131 g\u00f6rselle\u015ftirmek i\u00e7in kullan\u0131r.<\/p>\n<h3>PrimeFaces Tree (<p:tree>) Bile\u015feni<\/h3>\n<p><code><p:tree><\/code> bile\u015feni, hiyerar\u015fik verileri g\u00f6rsel olarak \u00e7ekici ve etkile\u015fimli bir a\u011fa\u00e7 yap\u0131s\u0131nda sunmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Kullan\u0131c\u0131lar\u0131n d\u00fc\u011f\u00fcmleri geni\u015fletmesine, daraltmas\u0131na ve se\u00e7mesine olanak tan\u0131r.<\/p>\n<h4>Genel Bak\u0131\u015f ve Temel Kullan\u0131m<\/h4>\n<p><code><p:tree><\/code> bile\u015feni, dosya gezginleri, kategori listeleri, men\u00fcler ve organizasyon \u015femalar\u0131 gibi bir\u00e7ok senaryoda kullan\u0131l\u0131r.<\/p>\n<p><strong>Temel Nitelikler:<\/strong><br \/>\n*   <strong><code>value<\/code>:<\/strong> A\u011fac\u0131n k\u00f6k d\u00fc\u011f\u00fcm\u00fcn\u00fc (bir <code>TreeNode<\/code> nesnesi) belirten bir EL ifadesidir.<br \/>\n*   <strong><code>var<\/code>:<\/strong> A\u011fa\u00e7taki her bir d\u00fc\u011f\u00fcm i\u00e7in d\u00f6ng\u00fcde kullan\u0131lan ge\u00e7ici de\u011fi\u015fkenin ad\u0131d\u0131r.<br \/>\n*   <strong><code>selectionMode<\/code>:<\/strong> D\u00fc\u011f\u00fcm se\u00e7imi davran\u0131\u015f\u0131n\u0131 belirler. Olas\u0131 de\u011ferler:<br \/>\n    *   <code>\"single\"<\/code>: Ayn\u0131 anda yaln\u0131zca bir d\u00fc\u011f\u00fcm se\u00e7ilebilir.<br \/>\n    *   <code>\"multiple\"<\/code>: Ctrl\/Cmd tu\u015fu ile birden fazla d\u00fc\u011f\u00fcm se\u00e7ilebilir.<br \/>\n    *   <code>\"checkbox\"<\/code>: D\u00fc\u011f\u00fcmlerin yan\u0131nda onay kutular\u0131 g\u00f6r\u00fcn\u00fcr ve birden fazla d\u00fc\u011f\u00fcm se\u00e7ilebilir. Ebeveyn-\u00e7ocuk ili\u015fkileri dikkate al\u0131n\u0131r (bir ebeveyn se\u00e7ildi\u011finde t\u00fcm \u00e7ocuklar\u0131 da se\u00e7ilir).<br \/>\n*   <strong><code>selection<\/code>:<\/strong> Se\u00e7ilen <code>TreeNode<\/code> nesnesini veya <code>TreeNode<\/code> nesnelerinin listesini (selectionMode&#8217;a ba\u011fl\u0131 olarak) tutan bir EL ifadesidir.<br \/>\n*   <strong><code>nodeVar<\/code>:<\/strong> <code>node<\/code> alt bile\u015feninde d\u00fc\u011f\u00fcm verisine eri\u015fim i\u00e7in kullan\u0131lan de\u011fi\u015fken ad\u0131d\u0131r.<\/p>\n<h4>A\u011fa\u00e7 Yap\u0131s\u0131n\u0131 Olu\u015fturma ve G\u00f6r\u00fcnt\u00fcleme<\/h4>\n<p>A\u011fac\u0131n her bir d\u00fc\u011f\u00fcm\u00fcn\u00fcn nas\u0131l g\u00f6r\u00fcnt\u00fclenece\u011fi, <code><p:treeNode><\/code> alt bile\u015feni kullan\u0131larak tan\u0131mlan\u0131r. Birden fazla <code><p:treeNode><\/code> tan\u0131mlayarak farkl\u0131 d\u00fc\u011f\u00fcm tipleri i\u00e7in farkl\u0131 g\u00f6r\u00fcn\u00fcmler sa\u011flayabilirsiniz.<\/p>\n<p><strong>\u00d6rnek XHTML Kodu:<\/strong><\/p>\n<pre><code class=\"language-xml\"><!DOCTYPE html>\n<html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"\n      xmlns:h=\"http:\/\/xmlns.jcp.org\/jsf\/html\"\n      xmlns:p=\"http:\/\/primefaces.org\/ui\">\n<h:head>\n    <title>PrimeFaces Tree \u00d6rne\u011fi<\/title>\n<\/h:head>\n<h:body>\n    <h:form id=\"treeForm\">\n        <p:growl id=\"messages\" showDetail=\"true\" \/>\n\n        <h3>Dosya Sistemi Gezgini<\/h3>\n        <p:tree value=\"#{treeBean.root}\" var=\"node\"\n                selectionMode=\"single\" selection=\"#{treeBean.selectedNode}\">\n            <p:treeNode>\n                <h:outputText value=\"#{node}\" \/>\n            <\/p:treeNode>\n        <\/p:tree>\n\n        <p:commandButton value=\"Se\u00e7ili D\u00fc\u011f\u00fcm\u00fc G\u00f6ster\" update=\"messages\"\n                         actionListener=\"#{treeBean.displaySelectedSingle}\" \/>\n    <\/h:form>\n<\/h:body>\n<\/html><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, varsay\u0131lan bir <code><p:treeNode><\/code> kullan\u0131lm\u0131\u015ft\u0131r. Bu, <code>type<\/code> \u00f6zelli\u011fi belirtilmedi\u011finde t\u00fcm d\u00fc\u011f\u00fcmler i\u00e7in ge\u00e7erli olur. <code>treeBean.root<\/code> k\u00f6k d\u00fc\u011f\u00fcm\u00fcn\u00fc al\u0131r ve <code>node<\/code> de\u011fi\u015fkeniyle her bir d\u00fc\u011f\u00fcm\u00fcn verisine eri\u015filir.<\/p>\n<p><strong>Farkl\u0131 D\u00fc\u011f\u00fcm Tipleri Kullanma:<\/strong><br \/>\n<code>DefaultTreeNode<\/code> olu\u015ftururken <code>type<\/code> parametresini kullanm\u0131\u015ft\u0131k. Bu tipleri <code><p:treeNode type=\"yourType\"><\/code> ile e\u015fle\u015ftirerek her tip i\u00e7in farkl\u0131 bir g\u00f6r\u00fcn\u00fcm sa\u011flayabiliriz.<\/p>\n<p><strong>\u00d6rnek (Managed Bean&#8217;de <code>type<\/code> kullanarak):<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ ... TreeBean constructor'da ...\nTreeNode root = new DefaultTreeNode(\"Root\", null);\nTreeNode documents = new DefaultTreeNode(\"folder\", \"Belgeler\", root); \/\/ type: folder\nnew DefaultTreeNode(\"file\", \"Rapor.docx\", documents); \/\/ type: file\nnew DefaultTreeNode(\"file\", \"Makale.pdf\", documents); \/\/ type: file\nTreeNode images = new DefaultTreeNode(\"folder\", \"Resimler\", root); \/\/ type: folder\nnew DefaultTreeNode(\"image\", \"Manzara.jpg\", images); \/\/ type: image\nnew DefaultTreeNode(\"image\", \"Logo.png\", images); \/\/ type: image<\/code><\/pre>\n<p><strong>\u00d6rnek XHTML Kodu (Farkl\u0131 D\u00fc\u011f\u00fcm Tipleriyle):<\/strong><\/p>\n<pre><code class=\"language-xml\"><p:tree value=\"#{treeBean.root}\" var=\"node\"\n        selectionMode=\"single\" selection=\"#{treeBean.selectedNode}\"\n        style=\"width:300px;\">\n\n    <p:treeNode type=\"folder\" icon=\"pi pi-folder\">\n        <h:outputText value=\"#{node}\" style=\"font-weight: bold;\"\/>\n    <\/p:treeNode>\n\n    <p:treeNode type=\"file\" icon=\"pi pi-file\">\n        <h:outputText value=\"#{node}\" \/>\n    <\/p:treeNode>\n\n    <p:treeNode type=\"image\" icon=\"pi pi-image\">\n        <h:outputText value=\"#{node}\" style=\"color: blue;\"\/>\n    <\/p:treeNode>\n\n    <p:treeNode type=\"default\" icon=\"pi pi-question\">\n        <h:outputText value=\"#{node}\" style=\"color: gray;\"\/>\n    <\/p:treeNode>\n<\/p:tree><\/code><\/pre>\n<p>Burada <code>icon<\/code> niteli\u011fiyle PrimeIcons k\u00fct\u00fcphanesinden simgeler ekledik. <code>type=\"default\"<\/code> ise, belirtilen di\u011fer tiplere uymayan d\u00fc\u011f\u00fcmler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>D\u00fc\u011f\u00fcm Se\u00e7imi ve Olay Y\u00f6netimi<\/h4>\n<p>PrimeFaces Tree, kullan\u0131c\u0131 etkile\u015fimlerini (d\u00fc\u011f\u00fcm se\u00e7imi, geni\u015fletme\/daraltma) yakalamak i\u00e7in \u00e7e\u015fitli Ajax olaylar\u0131 sunar.<\/p>\n<p>*   <strong><code>nodeSelect<\/code>:<\/strong> Bir d\u00fc\u011f\u00fcm se\u00e7ildi\u011finde tetiklenir.<br \/>\n*   <strong><code>nodeUnselect<\/code>:<\/strong> Bir d\u00fc\u011f\u00fcm\u00fcn se\u00e7imi kald\u0131r\u0131ld\u0131\u011f\u0131nda tetiklenir.<br \/>\n*   <strong><code>nodeExpand<\/code>:<\/strong> Bir d\u00fc\u011f\u00fcm geni\u015fletildi\u011finde tetiklenir.<br \/>\n*   <strong><code>nodeCollapse<\/code>:<\/strong> Bir d\u00fc\u011f\u00fcm daralt\u0131ld\u0131\u011f\u0131nda tetiklenir.<\/p>\n<p>Bu olaylar, <code><p:ajax><\/code> bile\u015feni ile dinlenebilir ve backend&#8217;de ilgili metotlar \u00e7a\u011fr\u0131labilir.<\/p>\n<p><strong>\u00d6rnek Managed Bean Metotlar\u0131:<\/strong><\/p>\n<pre><code class=\"language-java\">import javax.faces.application.FacesMessage;\nimport javax.faces.context.FacesContext;\nimport org.primefaces.event.NodeSelectEvent;\nimport org.primefaces.event.NodeExpandEvent;\nimport org.primefaces.event.NodeCollapseEvent;\n\/\/ ... di\u011fer import'lar ...\n\n@ManagedBean\n@ViewScoped\npublic class TreeBean implements Serializable {\n    \/\/ ... root ve selectedNode tan\u0131mlamalar\u0131 ...\n    private TreeNode[] selectedNodes; \/\/ Multiple veya Checkbox se\u00e7imi i\u00e7in\n\n    public void onNodeSelect(NodeSelectEvent event) {\n        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"Se\u00e7ilen D\u00fc\u011f\u00fcm\", event.getTreeNode().getData().toString());\n        FacesContext.getCurrentInstance().addMessage(null, message);\n    }\n\n    public void onNodeUnselect(NodeSelectEvent event) {\n        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"Se\u00e7imi Kald\u0131r\u0131lan D\u00fc\u011f\u00fcm\", event.getTreeNode().getData().toString());\n        FacesContext.getCurrentInstance().addMessage(null, message);\n    }\n\n    public void onNodeExpand(NodeExpandEvent event) {\n        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"Geni\u015fletilen D\u00fc\u011f\u00fcm\", event.getTreeNode().getData().toString());\n        FacesContext.getCurrentInstance().addMessage(null, message);\n    }\n\n    public void onNodeCollapse(NodeCollapseEvent event) {\n        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"Daralt\u0131lan D\u00fc\u011f\u00fcm\", event.getTreeNode().getData().toString());\n        FacesContext.getCurrentInstance().addMessage(null, message);\n    }\n\n    \/\/ Se\u00e7ili d\u00fc\u011f\u00fcmleri g\u00f6sterme metodu (tekli veya \u00e7oklu)\n    public void displaySelectedSingle() {\n        if (selectedNode != null) {\n            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"Tek Se\u00e7im\", selectedNode.getData().toString());\n            FacesContext.getCurrentInstance().addMessage(null, message);\n        } else {\n            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, \"Uyar\u0131\", \"Hi\u00e7bir d\u00fc\u011f\u00fcm se\u00e7ilmedi.\");\n            FacesContext.getCurrentInstance().addMessage(null, message);\n        }\n    }\n\n    public void displaySelectedMultiple() {\n        if (selectedNodes != null && selectedNodes.length > 0) {\n            StringBuilder builder = new StringBuilder();\n            for (TreeNode node : selectedNodes) {\n                builder.append(node.getData().toString()).append(\", \");\n            }\n            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"\u00c7oklu Se\u00e7im\", builder.toString());\n            FacesContext.getCurrentInstance().addMessage(null, message);\n        } else {\n            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, \"Uyar\u0131\", \"Hi\u00e7bir d\u00fc\u011f\u00fcm se\u00e7ilmedi.\");\n            FacesContext.getCurrentInstance().addMessage(null, message);\n        }\n    }\n    \/\/ ... getter\/setter'lar ...\n}<\/code><\/pre>\n<p><strong>\u00d6rnek XHTML Kodu (Ajax ile):<\/strong><\/p>\n<pre><code class=\"language-xml\"><p:tree value=\"#{treeBean.root}\" var=\"node\"\n        selectionMode=\"checkbox\" selection=\"#{treeBean.selectedNodes}\">\n    <p:ajax event=\"nodeSelect\" listener=\"#{treeBean.onNodeSelect}\" update=\"messages\" \/>\n    <p:ajax event=\"nodeUnselect\" listener=\"#{treeBean.onNodeUnselect}\" update=\"messages\" \/>\n    <p:ajax event=\"nodeExpand\" listener=\"#{treeBean.onNodeExpand}\" update=\"messages\" \/>\n    <p:ajax event=\"nodeCollapse\" listener=\"#{treeBean.onNodeCollapse}\" update=\"messages\" \/>\n\n    <p:treeNode type=\"folder\" icon=\"pi pi-folder\">\n        <h:outputText value=\"#{node}\" style=\"font-weight: bold;\"\/>\n    <\/p:treeNode>\n    <p:treeNode type=\"file\" icon=\"pi pi-file\">\n        <h:outputText value=\"#{node}\" \/>\n    <\/p:treeNode>\n    <p:treeNode type=\"image\" icon=\"pi pi-image\">\n        <h:outputText value=\"#{node}\" style=\"color: blue;\"\/>\n    <\/p:treeNode>\n<\/p:tree>\n\n<p:commandButton value=\"Se\u00e7ili D\u00fc\u011f\u00fcmleri G\u00f6ster (Checkbox)\" update=\"messages\"\n                 actionListener=\"#{treeBean.displaySelectedMultiple}\" \/><\/code><\/pre>\n<h4>S\u00fcr\u00fckle ve B\u0131rak (Drag &#038; Drop)<\/h4>\n<p>PrimeFaces Tree, d\u00fc\u011f\u00fcmler aras\u0131nda s\u00fcr\u00fckle ve b\u0131rak i\u015flevselli\u011fi sunarak a\u011fa\u00e7 yap\u0131s\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmeyi sa\u011flar.<br \/>\n*   <strong><code>draggable=\"true\"<\/code>:<\/strong> D\u00fc\u011f\u00fcmlerin s\u00fcr\u00fcklenebilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>droppable=\"true\"<\/code>:<\/strong> D\u00fc\u011f\u00fcmlerin \u00fczerine ba\u015fka d\u00fc\u011f\u00fcmlerin b\u0131rak\u0131labilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>dragdropScope<\/code>:<\/strong> S\u00fcr\u00fckle ve b\u0131rak i\u015fleminin kapsam\u0131n\u0131 belirler. Ayn\u0131 kapsamdaki \u00f6\u011feler aras\u0131nda s\u00fcr\u00fckle ve b\u0131rak yap\u0131labilir.<br \/>\n*   <strong><code>nodeDragDrop<\/code> olay\u0131:<\/strong> Bir d\u00fc\u011f\u00fcm s\u00fcr\u00fcklendi\u011finde ve ba\u015fka bir d\u00fc\u011f\u00fcm\u00fcn \u00fczerine b\u0131rak\u0131ld\u0131\u011f\u0131nda tetiklenir. <code>org.primefaces.event.NodeDragDropEvent<\/code> nesnesi, s\u00fcr\u00fcklenen ve b\u0131rak\u0131lan d\u00fc\u011f\u00fcmler hakk\u0131nda bilgi i\u00e7erir.<\/p>\n<h4>\u00d6zelle\u015ftirme ve Stil<\/h4>\n<p>PrimeFaces Tree, \u00e7e\u015fitli CSS s\u0131n\u0131flar\u0131 ve <code>style<\/code>, <code>styleClass<\/code> nitelikleri arac\u0131l\u0131\u011f\u0131yla g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc \u00f6zelle\u015ftirmenize olanak tan\u0131r. Ayr\u0131ca, <code>icon<\/code> niteli\u011fiyle her d\u00fc\u011f\u00fcm tipine \u00f6zel simgeler atayabilirsiniz (PrimeIcons veya Font Awesome gibi k\u00fct\u00fcphanelerle).<\/p>\n<h3>PrimeFaces TreeTable (<p:treeTable>) Bile\u015feni<\/h3>\n<p><code><p:treeTable><\/code> bile\u015feni, hiyerar\u015fik verileri standart bir tablo format\u0131nda, ancak her sat\u0131r\u0131n bir a\u011fa\u00e7 d\u00fc\u011f\u00fcm\u00fcn\u00fc temsil etti\u011fi ve geni\u015fletilebilir\/daralt\u0131labilir oldu\u011fu bir yap\u0131da sunar. Bu, \u00f6zellikle her bir hiyerar\u015fik \u00f6\u011fe i\u00e7in birden fazla s\u00fctunlu veri g\u00f6stermeniz gerekti\u011finde <code><p:tree><\/code>&#8216;den daha kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>Genel Bak\u0131\u015f ve Tree Bile\u015feni ile Farklar\u0131<\/h4>\n<p>*   <strong>Amac\u0131:<\/strong> Hiyerar\u015fik verileri tablo s\u00fctunlar\u0131 ile birlikte g\u00f6stermek. \u00d6rne\u011fin, bir dosya gezgininde dosya ad\u0131n\u0131n yan\u0131 s\u0131ra dosya boyutu, de\u011fi\u015ftirilme tarihi gibi bilgileri de g\u00f6stermek istedi\u011finizde TreeTable idealdir.<br \/>\n*   <strong>Ne Zaman Tercih Edilmeli?<\/strong><br \/>\n    *   <strong><code><p:tree><\/code>:<\/strong> Odak noktan\u0131z sadece hiyerar\u015finin kendisi ve d\u00fc\u011f\u00fcm isimleri ise. Daha kompakt ve basit bir g\u00f6r\u00fcn\u00fcm sunar.<br \/>\n    *   <strong><code><p:treeTable><\/code>:<\/strong> Her hiyerar\u015fik \u00f6\u011fe i\u00e7in birden fazla \u00f6znitelik (s\u00fctun) g\u00f6stermeniz gerekiyorsa. Daha zengin veri g\u00f6sterimi sa\u011flar.<\/p>\n<h4>Temel Kullan\u0131m ve Kolon Yap\u0131s\u0131<\/h4>\n<p><code><p:treeTable><\/code>&#8216;\u0131n temel nitelikleri <code><p:tree><\/code> ile benzerdir (<code>value<\/code>, <code>var<\/code>, <code>selectionMode<\/code>, <code>selection<\/code>). Ancak, <code><p:column><\/code> alt bile\u015fenleri ile tablo s\u00fctunlar\u0131 tan\u0131mlan\u0131r.<\/p>\n<p><strong>\u00d6nemli <code><p:column><\/code> \u00d6zellikleri:<\/strong><br \/>\n*   <strong><code><p:column expander=\"true\"><\/code>:<\/strong> Bu \u00f6zel s\u00fctun, hiyerar\u015fik yap\u0131y\u0131 geni\u015fletmek\/daraltmak i\u00e7in kullan\u0131lan bir &#8220;toggler&#8221; simgesi i\u00e7erir. Genellikle ilk s\u00fctun olarak kullan\u0131l\u0131r ve yaln\u0131zca bir s\u00fctunda <code>expander=\"true\"<\/code> olmal\u0131d\u0131r.<\/p>\n<p><strong>\u00d6rnek Managed Bean (Departman\/\u00c7al\u0131\u015fan Yap\u0131s\u0131):<\/strong><\/p>\n<pre><code class=\"language-java\">public class Employee {\n    private String name;\n    private String title;\n    private int salary;\n\n    public Employee(String name, String title, int salary) {\n        this.name = name;\n        this.title = title;\n        this.salary = salary;\n    }\n    \/\/ ... getter\/setter'lar ...\n}\n\n@ManagedBean\n@ViewScoped\npublic class TreeTableBean implements Serializable {\n    private TreeNode root;\n    private TreeNode selectedNode; \/\/ Tekli se\u00e7im i\u00e7in\n\n    public TreeTableBean() {\n        root = new DefaultTreeNode(new Employee(\"CEO\", \"Chief Executive Officer\", 200000), null);\n\n        TreeNode cto = new DefaultTreeNode(new Employee(\"Alice\", \"CTO\", 150000), root);\n        TreeNode devManager = new DefaultTreeNode(new Employee(\"Bob\", \"Development Manager\", 100000), cto);\n        new DefaultTreeNode(new Employee(\"Charlie\", \"Software Engineer\", 80000), devManager);\n        new DefaultTreeNode(new Employee(\"David\", \"Software Engineer\", 85000), devManager);\n\n        TreeNode hr = new DefaultTreeNode(new Employee(\"Eve\", \"HR Manager\", 90000), root);\n        new DefaultTreeNode(new Employee(\"Frank\", \"HR Specialist\", 60000), hr);\n    }\n\n    public TreeNode getRoot() { return root; }\n    public void setRoot(TreeNode root) { this.root = root; }\n    public TreeNode getSelectedNode() { return selectedNode; }\n    public void setSelectedNode(TreeNode selectedNode) { this.selectedNode = selectedNode; }\n\n    public void onNodeSelect(NodeSelectEvent event) {\n        Employee emp = (Employee) event.getTreeNode().getData();\n        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, \"Se\u00e7ilen \u00c7al\u0131\u015fan\", emp.getName() + \" - \" + emp.getTitle());\n        FacesContext.getCurrentInstance().addMessage(null, message);\n    }\n    \/\/ ... di\u011fer olay metotlar\u0131 ...\n}<\/code><\/pre>\n<p><strong>\u00d6rnek XHTML Kodu:<\/strong><\/p>\n<pre><code class=\"language-xml\"><!DOCTYPE html>\n<html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"\n      xmlns:h=\"http:\/\/xmlns.jcp.org\/jsf\/html\"\n      xmlns:p=\"http:\/\/primefaces.org\/ui\">\n<h:head>\n    <title>PrimeFaces TreeTable \u00d6rne\u011fi<\/title>\n<\/h:head>\n<h:body>\n    <h:form id=\"treeTableForm\">\n        <p:growl id=\"messages\" showDetail=\"true\" \/>\n\n        <h3>Departman ve \u00c7al\u0131\u015fan Hiyerar\u015fisi<\/h3>\n        <p:treeTable value=\"#{treeTableBean.root}\" var=\"employee\"\n                     selectionMode=\"single\" selection=\"#{treeTableBean.selectedNode}\">\n\n            <p:ajax event=\"nodeSelect\" listener=\"#{treeTableBean.onNodeSelect}\" update=\"messages\" \/>\n\n            <p:column expander=\"true\" headerText=\"Ad\u0131\">\n                <h:outputText value=\"#{employee.name}\" \/>\n            <\/p:column>\n\n            <p:column headerText=\"Unvan\u0131\">\n                <h:outputText value=\"#{employee.title}\" \/>\n            <\/p:column>\n\n            <p:column headerText=\"Maa\u015f\">\n                <h:outputText value=\"#{employee.salary}\" \/>\n            <\/p:column>\n        <\/p:treeTable>\n\n        <p:commandButton value=\"Se\u00e7ili \u00c7al\u0131\u015fan\u0131 G\u00f6ster\" update=\"messages\"\n                         actionListener=\"#{treeTableBean.onNodeSelect}\" \/>\n    <\/h:form>\n<\/h:body>\n<\/html><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>var=\"employee\"<\/code> de\u011fi\u015fkeni, her bir d\u00fc\u011f\u00fcm\u00fcn <code>Employee<\/code> nesnesine eri\u015fmek i\u00e7in kullan\u0131l\u0131r. <code><p:column expander=\"true\"><\/code> s\u00fctunu, hiyerar\u015fiyi geni\u015fletme\/daraltma i\u015flevselli\u011fini sa\u011flar.<\/p>\n<h4>D\u00fc\u011f\u00fcm Se\u00e7imi ve Olay Y\u00f6netimi<\/h4>\n<p><code><p:treeTable><\/code>&#8216;da se\u00e7im, <code><p:tree><\/code>&#8216;ye benzer \u015fekilde \u00e7al\u0131\u015f\u0131r. <code>selectionMode<\/code> niteli\u011fi (<code>\"single\"<\/code>, <code>\"multiple\"<\/code>, <code>\"checkbox\"<\/code>) ve <code>selection<\/code> niteli\u011fi (se\u00e7ilen <code>TreeNode<\/code> veya <code>TreeNode[]<\/code>) kullan\u0131l\u0131r. <code>nodeSelect<\/code>, <code>nodeUnselect<\/code> gibi olaylar da ayn\u0131 \u015fekilde <code><p:ajax><\/code> ile dinlenebilir.<\/p>\n<h4>S\u0131ralama ve Filtreleme<\/h4>\n<p><code><p:treeTable><\/code>, standart PrimeFaces <code>DataTable<\/code> gibi s\u0131ralama ve filtreleme \u00f6zelliklerini de destekler. Ancak, bu \u00f6zellikler hiyerar\u015fik yap\u0131y\u0131 koruyarak \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>*   <strong><code>sortBy<\/code> ve <code>sortOrder<\/code>:<\/strong> Bir s\u00fctunu s\u0131ralamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>filterBy<\/code>, <code>filterMatchMode<\/code>, <code>filterEvent<\/code>:<\/strong> S\u00fctun baz\u0131nda filtreleme yapmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>\u00d6rnek S\u0131ralama ve Filtreleme:<\/strong><\/p>\n<pre><code class=\"language-xml\"><p:treeTable value=\"#{treeTableBean.root}\" var=\"employee\"\n             selectionMode=\"single\" selection=\"#{treeTableBean.selectedNode}\">\n    \n    <p:column expander=\"true\" headerText=\"Ad\u0131\" sortBy=\"#{employee.name}\" filterBy=\"#{employee.name}\">\n        <h:outputText value=\"#{employee.name}\" \/>\n    <\/p:column>\n\n    <p:column headerText=\"Unvan\u0131\" sortBy=\"#{employee.title}\" filterBy=\"#{employee.title}\">\n        <h:outputText value=\"#{employee.title}\" \/>\n    <\/p:column>\n\n    <p:column headerText=\"Maa\u015f\" sortBy=\"#{employee.salary}\">\n        <h:outputText value=\"#{employee.salary}\" \/>\n    <\/p:column>\n<\/p:treeTable><\/code><\/pre>\n<p>S\u0131ralama ve filtreleme, yaln\u0131zca g\u00f6r\u00fcnen (geni\u015fletilmi\u015f) d\u00fc\u011f\u00fcmler \u00fczerinde uygulan\u0131r ve hiyerar\u015fik yap\u0131y\u0131 bozmadan sonu\u00e7lar\u0131 g\u00f6sterir.<\/p>\n<h4>Geni\u015fletilmi\u015f \u00d6zellikler: Lazy Loading<\/h4>\n<p>\u00c7ok b\u00fcy\u00fck hiyerar\u015fik veri setleriyle \u00e7al\u0131\u015f\u0131rken, t\u00fcm a\u011fac\u0131 ba\u015flang\u0131\u00e7ta belle\u011fe y\u00fcklemek performans sorunlar\u0131na yol a\u00e7abilir. PrimeFaces, bu durumu ele almak i\u00e7in &#8220;Lazy Loading&#8221; (Tembel Y\u00fckleme) mekanizmas\u0131n\u0131 sunar.<\/p>\n<p>Lazy Loading ile, bir d\u00fc\u011f\u00fcm yaln\u0131zca kullan\u0131c\u0131 taraf\u0131ndan geni\u015fletildi\u011finde \u00e7ocuk d\u00fc\u011f\u00fcmleri y\u00fcklenir. Bu, \u00f6zellikle veritaban\u0131ndan veya uzak bir servisten veri \u00e7ekerken kaynak kullan\u0131m\u0131n\u0131 optimize eder. Lazy loading i\u00e7in <code>LazyTreeNode<\/code> s\u0131n\u0131f\u0131n\u0131 kullanman\u0131z veya kendi <code>TreeNode<\/code> uygulaman\u0131zda \u00e7ocuklar\u0131 dinamik olarak y\u00fcklemeniz gerekir. Bu, genellikle <code>TreeNode<\/code>&#8216;un <code>getChildren()<\/code> metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda \u00e7ocuklar\u0131 y\u00fckleyen bir mekanizma ile sa\u011flan\u0131r.<\/p>\n<h3>Pratik Uygulama: Dosya Sistemi Gezgini ve Departman Yap\u0131s\u0131<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi peki\u015ftirmek i\u00e7in hem <code><p:tree><\/code> hem de <code><p:treeTable><\/code> bile\u015fenlerini kullanarak ger\u00e7ek d\u00fcnya senaryolar\u0131n\u0131 sim\u00fcle eden kapsaml\u0131 bir \u00f6rnek olu\u015ftural\u0131m.<\/p>\n<p><strong>Senaryo 1: Dosya Sistemi Gezgini (<code><p:tree><\/code>)<\/strong><br \/>\nBasit bir dosya ve klas\u00f6r yap\u0131s\u0131n\u0131 g\u00f6sterece\u011fiz.<\/p>\n<p><strong>Senaryo 2: Departman ve \u00c7al\u0131\u015fan Hiyerar\u015fisi (<code><p:treeTable><\/code>)<\/strong><br \/>\nBir \u015firketin departman ve \u00e7al\u0131\u015fanlar\u0131n\u0131 hiyerar\u015fik bir tablo g\u00f6r\u00fcn\u00fcm\u00fcnde sunaca\u011f\u0131z.<\/p>\n<h4>Backend Kodu (Managed Beans)<\/h4>\n<p>\u00d6nce veri modellerimizi ve Managed Bean&#8217;lerimizi olu\u015ftural\u0131m.<\/p>\n<p><strong><code>FileNode.java<\/code> (Dosya Sistemi Veri Modeli):<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.model;\n\nimport java.io.Serializable;\n\npublic class FileNode implements Serializable {\n    private String name;\n    private String type; \/\/ folder, document, image, etc.\n    private long size;\n    private String lastModified;\n\n    public FileNode(String name, String type, long size, String lastModified) {\n        this.name = name;\n        this.type = type;\n        this.size = size;\n        this.lastModified = lastModified;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n    public String getType() { return type; }\n    public void setType(String type) { this.type = type; }\n    public long getSize() { return size; }\n    public void setSize(long size) { this.size = size; }\n    public String getLastModified() { return lastModified; }\n    public void setLastModified(String lastModified) { this.lastModified = lastModified; }\n\n    @Override\n    public String toString() {\n        return name; \/\/ Tree'de g\u00f6sterilecek de\u011fer\n    }\n}<\/code><\/pre>\n<p><strong><code>DepartmentEmployee.java<\/code> (Departman\/\u00c7al\u0131\u015fan Veri Modeli):<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.model;\n\nimport java.io.Serializable;\n\npublic class DepartmentEmployee implements Serializable {\n    private String name;\n    private String title;\n    private String department;\n    private double salary;\n\n    public DepartmentEmployee(String name, String title, String department, double salary) {\n        this.name = name;\n        this.title = title;\n        this.department = department;\n        this.salary = salary;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n    public String getTitle() { return title; }\n    public void setTitle(String title) { this.title = title; }\n    public String getDepartment() { return department; }\n    public void setDepartment(String department) { this.department = department; }\n    public double getSalary() { return salary; }\n    public void setSalary(double salary) { this.salary = salary; }\n}<\/code><\/pre>\n<p><strong><code>AppBeans.java<\/code> (Managed Bean&#8217;ler):<\/strong><\/p>\n<pre><code class=\"language-java\">package com.example.beans;\n\nimport com.example.model.DepartmentEmployee;\nimport com.example.model.FileNode;\nimport org.primefaces.event.NodeCollapseEvent;\nimport org.primefaces.event.NodeExpandEvent;\nimport org.primefaces.event.NodeSelectEvent;\nimport org.primefaces.model.DefaultTreeNode;\nimport org.primefaces.model.TreeNode;\n\nimport javax.annotation.PostConstruct;\nimport javax.faces.application.FacesMessage;\nimport javax.faces.context.FacesContext;\nimport javax.faces.view.ViewScoped;\nimport javax.inject.Named;\nimport java.io.Serializable;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n@Named(\"appBeans\")\n@ViewScoped\npublic class AppBeans implements Serializable {\n\n    \/\/ --- p:tree i\u00e7in ---\n    private TreeNode fileSystemRoot;\n    private TreeNode selectedFileNode;\n    private TreeNode[] selectedFileNodes; \/\/ Checkbox i\u00e7in\n\n    \/\/ --- p:treeTable i\u00e7in ---\n    private TreeNode departmentRoot;\n    private TreeNode selectedDepartmentNode; \/\/ Tekli se\u00e7im i\u00e7in\n\n    @PostConstruct\n    public void init() {\n        \/\/ Dosya Sistemi A\u011fac\u0131n\u0131 Olu\u015fturma\n        fileSystemRoot = new DefaultTreeNode(new FileNode(\"Root\", \"root\", 0, \"\"), null);\n\n        TreeNode documents = new DefaultTreeNode(\"folder\", new FileNode(\"Belgeler\", \"folder\", 0, \"2023-01-15\"), fileSystemRoot);\n        new DefaultTreeNode(\"document\", new FileNode(\"Rapor.docx\", \"document\", 12456, \"2023-03-20\"), documents);\n        new DefaultTreeNode(\"document\", new FileNode(\"Makale.pdf\", \"document\", 89123, \"2023-02-10\"), documents);\n\n        TreeNode projects = new DefaultTreeNode(\"folder\", new FileNode(\"Projeler\", \"folder\", 0, \"2023-04-01\"), documents);\n        new DefaultTreeNode(\"document\", new FileNode(\"ProjePlan.pptx\", \"document\", 56789, \"2023-04-05\"), projects);\n        new DefaultTreeNode(\"code\", new FileNode(\"main.java\", \"code\", 3456, \"2023-04-10\"), projects);\n\n        TreeNode images = new DefaultTreeNode(\"folder\", new FileNode(\"Resimler\", \"folder\", 0, \"2022-11-01\"), fileSystemRoot);\n        new DefaultTreeNode(\"image\", new FileNode(\"Manzara.jpg\", \"image\", 234567, \"2022-12-01\"), images);\n        new DefaultTreeNode(\"image\", new FileNode(\"Logo.png\", \"image\", 12345, \"2023-01-01\"), images);\n\n        \/\/ Departman A\u011fac\u0131n\u0131 Olu\u015fturma\n        departmentRoot = new DefaultTreeNode(new DepartmentEmployee(\"Y\u00f6netim Kurulu\", \"CEO\", \"Y\u00f6netim\", 500000), null);\n\n        TreeNode ceoOffice = new DefaultTreeNode(\"department\", new DepartmentEmployee(\"John Doe\", \"CEO\", \"Y\u00f6netim\", 300000), departmentRoot);\n\n        TreeNode itDept = new DefaultTreeNode(\"department\", new DepartmentEmployee(\"Jane Smith\", \"IT Direkt\u00f6r\u00fc\", \"IT\", 180000), ceoOffice);\n        TreeNode devTeam = new DefaultTreeNode(\"team\", new DepartmentEmployee(\"Bob Johnson\", \"Geli\u015ftirme M\u00fcd\u00fcr\u00fc\", \"IT\", 120000), itDept);\n        new DefaultTreeNode(\"employee\", new DepartmentEmployee(\"Alice Green\", \"K\u0131demli Yaz\u0131l\u0131m Geli\u015ftirici\", \"IT\", 90000), devTeam);\n        new DefaultTreeNode(\"employee\", new DepartmentEmployee(\"Charlie Brown\", \"Yaz\u0131l\u0131m Geli\u015ftirici\", \"IT\", 75000), devTeam);\n        TreeNode opsTeam = new DefaultTreeNode(\"team\", new DepartmentEmployee(\"David White\", \"Operasyon M\u00fcd\u00fcr\u00fc\", \"IT\", 110000), itDept);\n        new DefaultTreeNode(\"employee\", new DepartmentEmployee(\"Eve Black\", \"Sistem Y\u00f6neticisi\", \"IT\", 80000), opsTeam);\n\n        TreeNode hrDept = new DefaultTreeNode(\"department\", new DepartmentEmployee(\"Frank Blue\", \"\u0130K Direkt\u00f6r\u00fc\", \"\u0130nsan Kaynaklar\u0131\", 150000), ceoOffice);\n        new DefaultTreeNode(\"employee\", new DepartmentEmployee(\"Grace Red\", \"\u0130K Uzman\u0131\", \"\u0130nsan Kaynaklar\u0131\", 70000), hrDept);\n    }\n\n    \/\/ --- p:tree i\u00e7in getter\/setter ve olay metotlar\u0131 ---\n    public TreeNode getFileSystemRoot() { return fileSystemRoot; }\n    public void setFileSystemRoot(TreeNode fileSystemRoot) { this.fileSystemRoot = fileSystemRoot; }\n    public TreeNode getSelectedFileNode() { return selectedFileNode; }\n    public void setSelectedFileNode(TreeNode selectedFileNode) { this.selectedFileNode = selectedFileNode; }\n    public TreeNode[] getSelectedFileNodes() { return selectedFileNodes; }\n    public void setSelectedFileNodes(TreeNode[] selectedFileNodes) { this.selectedFileNodes = selectedFileNodes; }\n\n    public void onFileNodeSelect(NodeSelectEvent event) {\n        FileNode file = (FileNode) event.getTreeNode().getData();\n        addMessage(FacesMessage.SEVERITY_INFO, \"Dosya Se\u00e7ildi\", file.getName() + \" (\" + file.getType() + \")\");\n    }\n\n    public void onFileNodeUnselect(NodeSelectEvent event) {\n        FileNode file = (FileNode) event.getTreeNode().getData();\n        addMessage(FacesMessage.SEVERITY_INFO, \"Dosya Se\u00e7imi Kald\u0131r\u0131ld\u0131\", file.getName());\n    }\n\n    public void onFileNodeExpand(NodeExpandEvent event) {\n        FileNode file = (FileNode) event.getTreeNode().getData();\n        addMessage(FacesMessage.SEVERITY_INFO, \"Klas\u00f6r Geni\u015fletildi\", file.getName());\n    }\n\n    public void onFileNodeCollapse(NodeCollapseEvent event) {\n        FileNode file = (FileNode) event.getTreeNode().getData();\n        addMessage(FacesMessage.SEVERITY_INFO, \"Klas\u00f6r Daralt\u0131ld\u0131\", file.getName());\n    }\n\n    public void displaySelectedFileNodes() {\n        if (selectedFileNodes != null && selectedFileNodes.length > 0) {\n            StringBuilder builder = new StringBuilder(\"Se\u00e7ilen Dosyalar: \");\n            for (TreeNode node : selectedFileNodes) {\n                builder.append(((FileNode) node.getData()).getName()).append(\", \");\n            }\n            addMessage(FacesMessage.SEVERITY_INFO, \"\u00c7oklu Dosya Se\u00e7imi\", builder.toString());\n        } else {\n            addMessage(FacesMessage.SEVERITY_WARN, \"Uyar\u0131\", \"Hi\u00e7bir dosya se\u00e7ilmedi.\");\n        }\n    }\n\n    \/\/ --- p:treeTable i\u00e7in getter\/setter ve olay metotlar\u0131 ---\n    public TreeNode getDepartmentRoot() { return departmentRoot; }\n    public void setDepartmentRoot(TreeNode departmentRoot) { this.departmentRoot = departmentRoot; }\n    public TreeNode getSelectedDepartmentNode() { return selectedDepartmentNode; }\n    public void setSelectedDepartmentNode(TreeNode selectedDepartmentNode) { this.selectedDepartmentNode = selectedDepartmentNode; }\n\n    public void onDepartmentNodeSelect(NodeSelectEvent event) {\n        DepartmentEmployee emp = (DepartmentEmployee) event.getTreeNode().getData();\n        addMessage(FacesMessage.SEVERITY_INFO, \"\u00c7al\u0131\u015fan Se\u00e7ildi\", emp.getName() + \" - \" + emp.getTitle());\n    }\n\n    \/\/ Yard\u0131mc\u0131 metot\n    private void addMessage(FacesMessage.Severity severity, String summary, String detail) {\n        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail));\n    }\n}<\/code><\/pre>\n<h4>JSF (XHTML) Kodu<\/h4>\n<p>\u015eimdi bu Managed Bean&#8217;leri kullanarak iki farkl\u0131 PrimeFaces bile\u015fenini g\u00f6sterelim.<\/p>\n<p><strong><code>index.xhtml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-xml\"><!DOCTYPE html>\n<html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"\n      xmlns:h=\"http:\/\/xmlns.jcp.org\/jsf\/html\"\n      xmlns:f=\"http:\/\/xmlns.jcp.org\/jsf\/core\"\n      xmlns:p=\"http:\/\/primefaces.org\/ui\">\n<h:head>\n    <title>PrimeFaces Tree ve TreeTable \u00d6rne\u011fi<\/title>\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/primeicons\/6.0.1\/primeicons.min.css\" \/>\n    <style type=\"text\/css\">\n        .ui-tree-container {\n            width: 350px;\n            float: left;\n            margin-right: 20px;\n        }\n        .ui-treetable {\n            width: 600px;\n            float: left;\n        }\n        .clear {\n            clear: both;\n        }\n        .ui-panelgrid td {\n            border: none !important;\n        }\n    <\/style>\n<\/h:head>\n<h:body>\n    <h:form id=\"mainForm\">\n        <p:growl id=\"messages\" showDetail=\"true\" \/>\n\n        <div class=\"ui-tree-container\">\n            <h3>Dosya Sistemi Gezgini (<p:tree>)<\/h3>\n            <p:tree value=\"#{appBeans.fileSystemRoot}\" var=\"file\"\n                    selectionMode=\"checkbox\" selection=\"#{appBeans.selectedFileNodes}\"\n                    style=\"height:300px; overflow:auto;\">\n\n                <p:ajax event=\"nodeSelect\" listener=\"#{appBeans.onFileNodeSelect}\" update=\"messages\" \/>\n                <p:ajax event=\"nodeUnselect\" listener=\"#{appBeans.onFileNodeUnselect}\" update=\"messages\" \/>\n                <p:ajax event=\"nodeExpand\" listener=\"#{appBeans.onFileNodeExpand}\" update=\"messages\" \/>\n                <p:ajax event=\"nodeCollapse\" listener=\"#{appBeans.onFileNodeCollapse}\" update=\"messages\" \/>\n\n                <p:treeNode type=\"root\" icon=\"pi pi-home\">\n                    <h:outputText value=\"#{file.name}\" style=\"font-weight: bold;\"\/>\n                <\/p:treeNode>\n\n                <p:treeNode type=\"folder\" icon=\"pi pi-folder\">\n                    <h:outputText value=\"#{file.name}\" style=\"font-weight: bold;\"\/>\n                <\/p:treeNode>\n\n                <p:treeNode type=\"document\" icon=\"pi pi-file-word\">\n                    <h:outputText value=\"#{file.name}\" \/>\n                <\/p:treeNode>\n\n                <p:treeNode type=\"image\" icon=\"pi pi-image\">\n                    <h:outputText value=\"#{file.name}\" style=\"color: blue;\"\/>\n                <\/p:treeNode>\n\n                <p:treeNode type=\"code\" icon=\"pi pi-file-code\">\n                    <h:outputText value=\"#{file.name}\" style=\"color: green;\"\/>\n                <\/p:treeNode>\n            <\/p:tree>\n            <p:commandButton value=\"Se\u00e7ili Dosyalar\u0131 G\u00f6ster\" update=\"messages\"\n                             actionListener=\"#{appBeans.displaySelectedFileNodes}\" style=\"margin-top: 10px;\"\/>\n        <\/div>\n\n        <div class=\"ui-treetable\">\n            <h3>Departman ve \u00c7al\u0131\u015fan Hiyerar\u015fisi (<p:treeTable>)<\/h3>\n            <p:treeTable value=\"#{appBeans.departmentRoot}\" var=\"emp\"\n                         selectionMode=\"single\" selection=\"#{appBeans.selectedDepartmentNode}\"\n                         resizableColumns=\"true\">\n\n                <p:ajax event=\"nodeSelect\" listener=\"#{appBeans.onDepartmentNodeSelect}\" update=\"messages\" \/>\n\n                <p:column expander=\"true\" headerText=\"Ad\u0131\" sortBy=\"#{emp.name}\" filterBy=\"#{emp.name}\">\n                    <h:outputText value=\"#{emp.name}\" \/>\n                <\/p:column>\n\n                <p:column headerText=\"Unvan\u0131\" sortBy=\"#{emp.title}\" filterBy=\"#{emp.title}\">\n                    <h:outputText value=\"#{emp.title}\" \/>\n                <\/p:column>\n\n                <p:column headerText=\"Departman\" sortBy=\"#{emp.department}\" filterBy=\"#{emp.department}\">\n                    <h:outputText value=\"#{emp.department}\" \/>\n                <\/p:column>\n\n                <p:column headerText=\"Maa\u015f\" sortBy=\"#{emp.salary}\" style=\"text-align: right;\">\n                    <h:outputText value=\"#{emp.salary}\">\n                        <f:convertNumber type=\"currency\" currencySymbol=\"$\" maxFractionDigits=\"0\" \/>\n                    <\/h:outputText>\n                <\/p:column>\n            <\/p:treeTable>\n            <p:commandButton value=\"Se\u00e7ili \u00c7al\u0131\u015fan\u0131 G\u00f6ster\" update=\"messages\"\n                             actionListener=\"#{appBeans.onDepartmentNodeSelect}\" style=\"margin-top: 10px;\"\/>\n        <\/div>\n\n        <div class=\"clear\"><\/div>\n    <\/h:form>\n<\/h:body>\n<\/html><\/code><\/pre>\n<p>Bu \u00f6rnek, iki bile\u015fenin de farkl\u0131 senaryolarda nas\u0131l kullan\u0131labilece\u011fini net bir \u015fekilde g\u00f6stermektedir. <code>FileNode<\/code> i\u00e7in <code>toString()<\/code> metodunu override ederek <code><p:treeNode><\/code> i\u00e7inde sadece <code>#{file}<\/code> ile ad\u0131n\u0131 g\u00f6sterebildik. <code>DepartmentEmployee<\/code> i\u00e7in ise <code><p:column><\/code> i\u00e7inde her \u00f6zelli\u011fe ayr\u0131 ayr\u0131 eri\u015fildi.<\/p>\n<h3>\u0130leri Seviye Konular ve En \u0130yi Uygulamalar<\/h3>\n<h4>B\u00fcy\u00fck Veri Setlerinde Performans Optimizasyonu<\/h4>\n<p>B\u00fcy\u00fck hiyerar\u015filerde (binlerce d\u00fc\u011f\u00fcm), t\u00fcm a\u011fac\u0131 ba\u015flang\u0131\u00e7ta y\u00fcklemek performans\u0131 d\u00fc\u015f\u00fcrebilir.<br \/>\n*   <strong>Lazy Loading:<\/strong> Daha \u00f6nce bahsedildi\u011fi gibi, d\u00fc\u011f\u00fcmleri yaln\u0131zca geni\u015fletildiklerinde y\u00fcklemek en etkili y\u00f6ntemdir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz\nGiri\u015f\nModern web uygulamalar\u0131nda, ve","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[136],"tags":[],"class_list":{"0":"post-38320","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz\" \/>\n<meta property=\"og:description\" content=\"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz Giri\u015f Modern web uygulamalar\u0131nda, ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-28T14:41:03+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz\",\"datePublished\":\"2026-01-28T14:41:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\"},\"wordCount\":2010,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\",\"name\":\"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-28T14:41:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/","og_locale":"tr_TR","og_type":"article","og_title":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz","og_description":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz Giri\u015f Modern web uygulamalar\u0131nda, ve","og_url":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-28T14:41:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz","datePublished":"2026-01-28T14:41:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/"},"wordCount":2010,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/","url":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/","name":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-28T14:41:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/primefaces-tree-treenode-ve-treetable-hiyerarsik-veri-gosterimi-ve-yonetimi-icin-kapsamli-bir-kilavuz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PrimeFaces Tree, TreeNode ve TreeTable: Hiyerar\u015fik Veri G\u00f6sterimi ve Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir K\u0131lavuz"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38320"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38320\/revisions"}],"predecessor-version":[{"id":38321,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38320\/revisions\/38321"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}