zeyuphoenix

          愿我愛的人快樂,愿愛我的人快樂,為了這些,我愿意不快樂.

          JTree--樹(節點渲染和資源管理器加載)(一)

          前面已經把樹的基本使用、樹的事件和樹的數據取得寫完了,并看了一個Sun提供的最簡單的樹的例子,這一專題我們講兩個方面,一個是使用樹的RendererEditor構造一棵我們自己的樹;一個樹使用SwingWorker完成一棵資源管理器樹的加載.

          先看渲染的例子:

          我們為我們的樹增加了可用與否、可見與否和節點圖片的屬性,當然你也可以自己添加想要的屬性,比如順序等.

          整個實現的過程很清晰,也不復雜,我們首先實現我們自己的TreeNode,它繼承于DefaultMutableTreeNode,我們在里面添加自己的屬性;然后是實現樹的節點的RendererEditor,Renderer里我們設置可用也否,選擇狀態,節點圖片等;Editor里我們設置樹的容器布局.最后構造樹時使用setRenderersetEditor就可以了,需要注意的是如果僅僅是呈現,設置Renderer就可以了,如果除了呈現還有操作的話,必須都要設置.

          先看我們自己的TreeNode, 繼承于DefaultMutableTreeNode,

          /**

           * the tree node that I rewrite it.

          */

          publicclass MyTreeNode extends DefaultMutableTreeNode {

          我們添加了屬性:

              /** is select or not. */

              privatebooleanisSelected = false;

          節點的選擇狀態

              /** is enable. */

              privatebooleanenabled = false;

          節點使用與否

              /** is visible or not. */

              privatebooleanisVisible = false;

          節點可見與否

              /** it's icon. */

              private Icon icon = null;

              /** icon name. */

              private String iconName = null;

          節點圖片和圖片名字

          然后是構造函數,我們初始化屬性,或使用默認的:

          public MyTreeNode() {

              this(null, true, false, true, true, null);

          }

          public MyTreeNode(Object userObject, boolean allowsChildren,

              boolean isSelected, boolean enabled, boolean isVisible, Icon icon) {

              super(userObject, allowsChildren);

              this.isSelected = isSelected;

              this.enabled = enabled;

              this.isVisible = isVisible;

              this.icon = icon;

                 setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTI

           ON);

          }

          然后就是一些設置和取得屬性的方法,這個類就相當于一個Bean.

          然后就是Rnederer,我們這里繼承于DefaultTreeCellRenderer

          publicclass MyTreeRenderer extends DefaultTreeCellRenderer {

          然后復寫它的getTreeCellRendererComponent方法:

          @Override

          public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,

               boolean hasFocus) {

          然后設置節點的屬性:

          首先是顯示文本:

          String stringValue = tree.convertValueToText(value, sel, expanded, leaf, row, hasFocus);

          setText(stringValue);

          然后是可用與否:

                 boolean nodeIsEnabled = ((MyTreeNode) value).isEnabled();

                 boolean isEnabled = (treeIsEnabled && nodeIsEnabled);

                 setEnabled(isEnabled);

          然后是是圖片

              Icon icon = ((MyTreeNode) value).getIcon();

          setIcon(icon);

          還有一些基本的屬性,比如背景色等:

              setForeground(getTextSelectionColor());

          再來需要看的類就是Editor,它繼承于DefaultTreeCellEditor:

          publicclass MyCellEditor extends DefaultTreeCellEditor {

          因為我們使用的是JLabel作為顯示控件,所以我們的主要實現是布局處理,對于事件可以不需要考慮.我們復習了DefaultTreeCellEditor的默認布局:

              /**

               * Container responsible for placing the editingComponent.

               */

              privateclass MyEditorContainer extends

                     DefaultTreeCellEditor.EditorContainer {

          復寫它的doLayout方法:

              @Override

          publicvoid doLayout() {

          取得節點的邊緣和大小:

          r = tree.getBounds(r);

          eSize.width = r.width - (offset * n);

          editingComponent.setLocation(offset, 0);

          設置節點的位置和大小:

               setSize(new Dimension(eSize.width + offset, cSize.height));

          最后就是使用了,很簡單和以前一樣,直接使用JTree的設置方法就可以了:

                MyTreeRenderer renderer = new MyTreeRenderer();

                tree.setCellRenderer(renderer);

                tree.setEditable(true);

                tree.setCellEditor(new MyCellEditor(tree,

                     (DefaultTreeCellRenderer) tree.getCellRenderer()));

          posted on 2010-04-21 21:36 zeyuphoenix 閱讀(2871) 評論(0)  編輯  收藏 所屬分類: JTree的使用

          導航

          <2010年4月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          統計

          常用鏈接

          留言簿(52)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新巴尔虎左旗| 建宁县| 兰坪| 南通市| 临猗县| 民权县| 尉氏县| 宝山区| 永平县| 金寨县| 航空| 略阳县| 宣武区| 永定县| 平原县| 沙洋县| 开封市| 福鼎市| 松原市| 页游| 翼城县| 津南区| 岑巩县| 元朗区| 城步| 白玉县| 精河县| 湾仔区| 萨迦县| 凤山县| 孝昌县| 卓尼县| 万安县| 日喀则市| 奉新县| 桂东县| 商洛市| 威远县| 平遥县| 绍兴市| 胶南市|