Jan 1, 0001  

title: Swing Programlama : JTree link: http://orhanbalci.net/tr/?p=849 author: Orhan Balci description: post_id: 849 created: 2010/10/08 13:27:31 created_gmt: 2010/10/08 10:27:31 comment_status: open post_name: swing-programlama-jtree status: publish post_type: post

Swing Programlama : JTree

Java’da sıklıkla arayüzlerde kullanılan elemanlardan birisi de tree(ağaç) görünümüdür. Hiyerarşik yapıların görüntülenmesinde kullanılan JTree’de MVC tasarım deseni uygulanmıştır. Yani arayüzümüze eklemek istediğimiz elemanın öncelikle modelini tanımlamalıyız. En basit haliyle JTree şu şekilde oluşturulur : [java] DefaultMutableTreeNode node = new DefaultMutableTreeNode(“Masa 1”); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(“oyuncu 1”); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode(“oyuncu 2”); DefaultMutableTreeNode node4 = new DefaultMutableTreeNode(“oyuncu 3”); DefaultMutableTreeNode node5 = new DefaultMutableTreeNode(“oyuncu 4”); node.add(node2); node.add(node3); node.add(node4); node.add(node5); JTree jt = new JTree(node); [/java] JTree üzerinde TreeSelectionModel belirleyerek çeşitli seçim kipleri belirleyebiliriz. Örneğin ağacımızda aynı anda sadece bir düğümün seçilmesine izin verebiliriz veya bunun yerine birden çok düğümün aynı anda seçilmesine olanak sağlayabiliriz. DefaultTreeSelectionModel TreeSelectionModel arayüzünü gerçekleyen bir sınıftır. Bu sınıfı kullanarak JTree üzerinde seçimle ilgili kısıtlamalara gidebilir istediğimiz düğümü program içerisinden seçebiliriz : [java] DefaultTreeSelectionModel dtsm = new DefaultTreeSelectionModel(); dtsm.setSelectionMode(DefaultTreeSelectionModel.CONTIGUOUS_TREESELECTION); jt.setSelectionModel(dtsm); [/java] Bu örnekte tree arayüz elemanımızdan birden fazla düğümün seçilmesine izin verdik. Tree’de meydana gelen seçim olaylarını yakalamak için TreeSelectionListener arayüzünü gerçeklememiz gerekir. Örneğin seçimde meydana gelen değişiklikleri bir JTextArea’ya yazan örneği inceleyelim : [java] public class MySelectionListener implements TreeSelectionListener { public MySelectionListener(JTextArea jta) { jta = jta; } private JTextArea jta; public void valueChanged(TreeSelectionEvent e) { jta.append(“Tree seçimi değişti : \n”); TreePath[] tp = e.getPaths(); for (TreePath t : tp) { if (e.isAddedPath(t)) { jta.append(”\tSeçime “ + t.toString() + “eklendi\n”); } else { jta.append(”\tSeçimden “ + t.toString() + “çıkarıldı\n”); } } jta.append(“Son durumda seçili düğümler : “); JTree jt = (JTree) e.getSource(); TreePath[] selectedPath = jt.getSelectionPaths(); for (TreePath treePath : selectedPath) { jta.append(treePath + “ “); } jta.append(”\n”); } } [/java] 11. satırda kullandığımız TreeSelectionEvent sınıfına ait getPaths() metodu seçimden kaldırılan ve seçime eklenen düğümlerin yollarını içerir. TreePath sınıfı ağacımızdaki düğümlerin yollarını hiyerarşik olarak tutmaktadır. 13. satırda kullandığımız isAddedPath(TreePath) metodu ise verilen düğüm yolunun seçime eklenip eklenmediğini kontrol eder. Tüm seçili düğümlerin listesini almak için 21 ve 22. satırları kullanıyoruz. Şimdi de tree yapısına yeni düğüm eklemeyi görelim. Bu örnekte seçili düğümün altına yeni bir düğüm eklemeyi görelim : [java] public void executeInsert() { DefaultTreeModel tm = (DefaultTreeModel)jt.getModel(); String s = JOptionPane.showInputDialog(“Düğüm adını girin :“); TreePath tp = jt.getSelectionPath(); DefaultMutableTreeNode nod = new DefaultMutableTreeNode(s); tm.insertNodeInto(nod,(MutableTreeNode)tp.getLastPathComponent(), 0); } [/java] Yukarıdaki metod seçili düğümün altına yeni bir düğüm eklemeye yarıyor. 5. satırda seçili yolu elde ederken 7. satırda DefaultTreeModel sınıfının insertNodeInto() metoduyla modelimize yeni bir düğüm ekliyoruz. Şimdi de seçili düğümü nasıl sileceğimize bakalım : [java] public void executeRemove() { TreePath tp = jt.getSelectionPath(); DefaultTreeModel tm = (DefaultTreeModel)jt.getModel(); tm.removeNodeFromParent((MutableTreeNode) tp.getLastPathComponent()); } [/java] Düğüm silmek için yine DefaultTreeModel sınıfının removeNodeFromParent() metodunu kullanıyoruz. İstediğimiz düğümü açıp kapamak için sırasıyla JTree’nin expandRow() ve collapseRow() metodlarını yada sadece belirli bir düğüm yolunu açmak kapamak için expandPath() ve collapsePath() metodlarını kullanabiliriz. Aşağıdaki örnekte ağaç görünümümüzün tüm düğümlarini aynı anda açan ve kapayan metodları görebiliriz: [java] public void expandAll() { for (int i = 0; i < jt.getRowCount(); i++) { jt.expandRow(i); } } public void collapseAll() { for (int i = 0; i < jt.getRowCount(); i++) { jt_.collapseRow(i); } } [/java] Tree ile ilgili temel işlemleri anlatmaya çalıştım. Bununla birlikte JTree arayüz elemanının kabiliyetleri anlattıklarımla sınırlı değil aksine çok geniştir. İsteğe bağlı olarak JTree, DefaultTreeModel sınıfları incelenebilir. Aşağıdaki resime tıklayarak anlattığımız kodların çalışan uygulamasını görebilirsiniz. [caption id=“attachment_865” align=“aligncenter” width=“537” caption=“JTree Kullanım Ornegi”]JTree Kullanım Ornegi[/caption] [ad#Yazi Ici Buyuk]

Comments

Aziz: Güzel anlatım yalnız başlangıç için agır olmuş :neutral: