قطعا كليه كاربران و برنامه نويسان با كنترل Tooltip و كاربرد آن آشنا هستند. به همين علت مستقيما به اصل مطلب مي پردازيم. قبل از شروع كار، بهتر است برنامه TreeTips.java را از انتهاي مقاله دانلود نموده و اجرا كنيد. سپس نتيجه كار را با تصوير زير مقايسه نماييد. خواهد ديد كه پس از اجرا، هرگاه با اشاره گر ماوس روي يكي از گره هاي دزخت زير مي رويد، Tooltip مربوط به آن ظاهر شده و توضيحاتي در مورد آن گره نمايش مي دهد.

كد اين برنامه به شرح زير مي باشد.

i
کد:
mport java.awt.BorderLayout;
import  java.awt.Component;
import java.util.Dictionary;
import  java.util.Properties;
import javax.swing.JFrame;
import  javax.swing.JScrollPane;
import javax.swing.JTree;
import  javax.swing.ToolTipManager;
import  javax.swing.tree.DefaultMutableTreeNode;
import  javax.swing.tree.DefaultTreeCellRenderer;
import  javax.swing.tree.TreeCellRenderer;

public class TreeTips {
   public static void main(String args[]) {
      JFrame frame = new JFrame("Tree Tips");
      Properties props =  System.getProperties();
      JTree tree = new  JTree(props);
       ToolTipManager.sharedInstance().registerComponent(tree);
      TreeCellRenderer renderer = new  ToolTipTreeCellRenderer(props);
       tree.setCellRenderer(renderer);
       JScrollPane scrollPane = new JScrollPane(tree);
       frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
      frame.setSize(300, 150);
       frame.setVisible(true);
   }
}

   class ToolTipTreeCellRenderer implements TreeCellRenderer  {
      DefaultTreeCellRenderer renderer = new  DefaultTreeCellRenderer();
      Dictionary  tipTable;
      public  ToolTipTreeCellRenderer(Dictionary tipTable) {
              this.tipTable = tipTable;
      }

      public Component getTreeCellRendererComponent(JTree  tree, Object value,
                                  boolean selected, boolean expanded, boolean leaf, int row,boolean  hasFocus) {
           renderer.getTreeCellRendererComponent(tree, value, selected,  expanded,leaf, row, hasFocus);
          if (value !=  null) {
                  Object tipKey;
         if (value instanceof DefaultMutableTreeNode)  {
                  tipKey =  ((DefaultMutableTreeNode) value).getUserObject();
          } else {
                  tipKey =  tree.convertValueToText(value, selected, expanded,leaf, row, hasFocus);
         }
         Object tip =  tipTable.get(tipKey);
         if (tip != null)  {
                   renderer.setToolTipText(tip.toString());
         } else {
                   renderer.setToolTipText(null);
          }
      }
       return renderer;
   }
}
برنامه فوق با وجود اينكه از لحاظ خطوط كد كوچك مي باشد ولي حاوي نكات مهمي مي باشد كه بايد آنها را درك نماييد. اين نكات عبارتند از:
1- همانطور كه مي بينيد برنامه فوق از دو كلاس تشكيل شده است. كلاس اصلي برنامه با نام TreeTips و كلاس ToolTipTreeCellRenderer .
2- داده هايي كه در اين برنامه براي تشكيل درخت و گره هاي آن مورد استفاده قرار گرفته است، ويژگي ها يا مشخصات محيط اجراي برنامه جاوا مي باشند. براي بدست آوردن اين اطلاعات و تحويل آن به متد سازنده كلاس JTree، از متد getProperties كلاس System موجود در بسته java.lang استفاده شده است. از جمله اين مشخصات مي توان به موارد زير اشاره نمود:
کد:
  
Key Meaning ------------------- ------------------------------ "file.separator" File separator (e.g., "/") "java.class.path" Java classpath "java.class.version" Java class version number "java.home" Java installation directory "java.vendor" Java vendor-specific string "java.vendor.url" Java vendor URL "java.version" Java version number "line.separator" Line separator "os.arch" Operating system architecture "os.name" Operating system name "path.separator" Path separator (e.g., ":") "user.dir" User's current working directory "user.home" User home directory "user.name" User account name
همانطور كه در ليست بالا مشاهده مي كنيد، اين مشخصات به صورت Key/Value مي باشد. يعني به ازاي هر كليد يك مقدار باز گردانده مي شود. اگر در متد فوق كليد خاصي را به عنوان آرگومان ورودي ارسال كنيد، فقط مقدار معادل آن باز گردانده مي شود ولي اگر متد فوق را بدون آرگومان استفاده نماييد، كليه مشخصات پيش فرض را به خروجي باز مي گرداند. به عبارت زير دقت كنيد.
System.getProperty("path.separator");
3- نكته سوم در اين كد، استفاده از يكي از متد‌هاي كلاس ToolTipManager با نام registerComponent مي باشد. وظيفه كلاس فوق مديريت رفتارهاي كامپوننت Tooltip مورد استفاده در ساير كامپوننت هاي جاوا مي باشد. اين كلاس بر نحوه نمايش متن راهنماي Tooltip زماني كه اشاره گر ماوس روي item‌ مورد نظر مي رود و پنهان كردن آن، زماني كه ماوس از روي محدوده Item مورد نظر خارج مي شود و همچنين مدت زمان نمايش متن tooltip و ... نظارت دارد. اين كلاس براي انجام وظايف مطرح شده از كلاس MouseAdapter و واسط MouseMotionListener استفاده مي كند.
وظيفه متد registerComponent در اين كلاس آن است كه ساير كنترل هاي ديگر جاوا مانند JTree را كه قصد اضافه كردن Tooltip به خود را دارند، جهت مديريت Tooltip شان، به اين كلاس معرفي مي كند .

4- در برنامه فوق از واسط TreeCellRenderer استفاده شده است. هرگاه بخواهيم در ظاهر يك درخت تغييراتي ايجاد كنيم، مثلا رنگ يا نوع يا قلم فونت، آيكون مورد استفاده و ... را تغيير دهيم از اين واسط يا واسط پيش فرض، يعني DefaultTreeCellRenderer استفاده مي كنيم. در اين برنامه قصد داريم مقدار متد setToolTipText را براي هر گره تنظيم كنيم. به همين خاطر نياز است تا از واسط هاي فوق استفاده نماييم. به عنوان نمونه در كد زير نحوه تغيير آيكون گره هاي مختلف يك درخت نمايش داده شده است.
کد:
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); Icon customIcon = null;
... renderer.setLeafIcon(customIcon ); renderer.setClosedIcon(customIcon ); renderer.setOpenIcon(customIcon ); setCellRenderer(renderer);
5- نكته آخر در كد فوق استفاده از كلاس Dictionary مي باشد. اين كلاس يكي از كلاس هاي بسته java.util مي باشد. اين كلاس مانند يك ديكشنري عمل مي كند. يعني به ازاي هر كليد يك مقدار وجود دارد. در اين كلاس هر زوج كليد و مقدار متناظر آن، بصورت يك Object‌ ذخيره مي شوند و به اين ترتيب قابليت جستجو بر اساس كليدها در آن بوجود مي آيد.