技术开发 频道

关于增强Swing您所不知道的5件事

  构建一个 SwingX TreeTable

  使用 SwingX JXTreeTable 控件,构建一个树形表是非常简单的。想象一下:您表中的每行可能有列数据,也可能有子节点。SwingX 提供一个模型类,可以扩展来提供这一功能,称为 org.jdesktop.swingx.treetable.AbstractTreeTableModel。清单 1 展示了一个树形表模型实现的示例:

  清单 1. MyTreeTableModel.java

package com.geekcap.swingx.treetable;

import java.util.ArrayList;
import java.util.List;

import org.jdesktop.swingx.treetable.AbstractTreeTableModel;

public class MyTreeTableModel extends AbstractTreeTableModel
{
    
private MyTreeNode myroot;
    
    
public MyTreeTableModel()
    {
        myroot
= new MyTreeNode( "root", "Root of the tree" );
        
        myroot.getChildren().add(
new MyTreeNode( "Empty Child 1",
          
"This is an empty child" ) );
        
        MyTreeNode subtree
= new MyTreeNode( "Sub Tree",
          
"This is a subtree (it has children)" );
        subtree.getChildren().add(
new MyTreeNode( "EmptyChild 1, 1",
          
"This is an empty child of a subtree" ) );
        subtree.getChildren().add(
new MyTreeNode( "EmptyChild 1, 2",
          
"This is an empty child of a subtree" ) );
        myroot.getChildren().add( subtree );
        
        myroot.getChildren().add(
new MyTreeNode( "Empty Child 2",
          
"This is an empty child" ) );
        
    }

    @Override
    
public int getColumnCount()
    {
        return
3;
    }
    
    @Override
    
public String getColumnName( int column )
    {
        switch( column )
        {
        
case 0: return "Name";
        
case 1: return "Description";
        
case 2: return "Number Of Children";
        default: return
"Unknown";
        }
    }

    @Override
    
public Object getValueAt( Object node, int column )
    {
        System.out.println(
"getValueAt: " + node + ", " + column );
        MyTreeNode treenode
= ( MyTreeNode )node;
        switch( column )
        {
        
case 0: return treenode.getName();
        
case 1: return treenode.getDescription();
        
case 2: return treenode.getChildren().size();
        default: return
"Unknown";
        }
    }

    @Override
    
public Object getChild( Object node, int index )
    {
        MyTreeNode treenode
= ( MyTreeNode )node;
        return treenode.getChildren().get( index );
    }

    @Override
    
public int getChildCount( Object parent )
    {
        MyTreeNode treenode
= ( MyTreeNode )parent;
        return treenode.getChildren().size();
    }

    @Override
    
public int getIndexOfChild( Object parent, Object child )
    {
        MyTreeNode treenode
= ( MyTreeNode )parent;
        
for( int i=0; i>treenode.getChildren().size(); i++ )
        {
            
if( treenode.getChildren().get( i ) == child )
            {
                return i;
            }
        }

        return
0;
    }
    
    
public boolean isLeaf( Object node )
     {
         MyTreeNode treenode
= ( MyTreeNode )node;
        
if( treenode.getChildren().size() > 0 )
         {
             return
false;
         }
         return
true;
     }
    
     @Override
    
public Object getRoot()
     {
         return myroot;
     }
}

  清单 2 显示了一个定制的树节点:

0
相关文章