簡體   English   中英

在swingX中添加和刪除Jtreetable中的元素

[英]Adding and removing elements in Jtreetable in swingX

我正在學習如何在SwingX中實現TreeTable。 首先,我有一個表模型:

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

import org.jdesktop.swingx.treetable.AbstractTreeTableModel;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;

public class MyTreeTableModel extends AbstractTreeTableModel 
{
    private MyTreeNode myroot;
    //here we add new children
    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" ) );    

    }

    public void addChildren(){
        myroot.getChildren().add( new MyTreeNode( "Empty Child 1", "This is an empty child" ) );
    }

    //get colunmcount
    public int getColumnCount() 
    {
        return 4;
    }

    @Override
    public String getColumnName( int column )
    {
        switch( column )
        {
        case 0: return "Description";
        case 1: return "Amount";
        case 2: return "Date";
        case 3: return "Paid";

        default: return "Unknown";
        }
    }

    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";
        }
    }

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

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

    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;
            }
        }

        // TODO Auto-generated method stub
        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;
     }
     }

class MyTreeNode
{
    private String name;
    private String description;
    private List<MyTreeNode> children = new ArrayList<MyTreeNode>();

    public MyTreeNode() 
    {
    }

    public MyTreeNode( String name, String description ) 
    {
        this.name = name;
        this.description = description;
    }

    public String getName() 
    {
        return name;
    }

    public void setName(String name) 
    {
        this.name = name;
    }

    public String getDescription() 
    {
        return description;
    }

    public void setDescription(String description) 
    {
        this.description = description;
    }

    public List<MyTreeNode> getChildren() 
    {
        return children;
    }

    public String toString()
    {
        return "MyTreeNode: " + name + ", " + description;
    }

在這里我試圖運行它:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

import models.ExpenseModel;

import org.jdesktop.swingx.JXTreeTable;


public class SwingXExample extends JFrame 
{
    private JTabbedPane tabs = new JTabbedPane();

    private MyTreeTableModel treeTableModel = new MyTreeTableModel();
    private JXTreeTable treeTable = new JXTreeTable( treeTableModel );

    public SwingXExample()
    {
        super( "SwingX Examples" );

        // Build the tree table panel
        JPanel treeTablePanel = new JPanel( new BorderLayout() );
        treeTablePanel.add( new JScrollPane( treeTable ) );
        tabs.addTab( "JXTreeTable", treeTablePanel );


        JButton add_button = new JButton("+");
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setBounds(10, 260, 300, 30);
        getContentPane().add(buttonsPanel);
        buttonsPanel.setLayout(new GridLayout(0, 3, 0, 0));
        buttonsPanel.add(add_button);  
        add_button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                // Get active table
                treeTableModel.addChildren();
            }
        });

        // Add the tabs to the JFrame

        add( tabs );

        setSize( 1024, 768 );
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation( d.width / 2 - 512, d.height/2 - 384 );
        setVisible( true );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }


    public static void main( String[] args )
    {
        AppStarter starter = new AppStarter( args );
        SwingUtilities.invokeLater( starter );
    }
}

class AppStarter extends Thread
{
    private String[] args;

    public AppStarter( String[] args )
    {
        this.args = args;
    }

    public void run()
    {
        SwingXExample example = new SwingXExample();
    }

}

問題是,我的方法addChildren完全不起作用,當我按下按鈕時表不會更新。 另外,我想知道如何從表中刪除一些東西。 如果有人知道我在這里做錯了什么,請幫助我。

在對JavaDocs進行一些挖掘之后,我對沒有找到fireXxx方法感到很失望......

所以我開始挖掘DefaultTreeTableModel的源代碼,因為它有一個insertNodeInto方法......

public void insertNodeInto(MutableTreeTableNode newChild,
        MutableTreeTableNode parent, int index) {
    parent.insert(newChild, index);

    modelSupport.fireChildAdded(new TreePath(getPathToRoot(parent)), index,
            newChild);
}

所以,還有另一個類用於為事件通知提供支持,真棒......現在,我們如何才能訪問它?

在回復代碼后,我發現......

public abstract class AbstractTreeTableModel implements TreeTableModel {

    /**
     * Provides support for event dispatching.
     */
    protected TreeModelSupport modelSupport;

因此, modelSupportAbstractTreeTableModel定義為protected 不是我想做的方式,但它確實如此。

因此,在addChildren方法中,您需要觸發一個事件,告訴視圖已插入新節點...

public void addChildren(){
    MyTreeNode newChild = new MyTreeNode( "Empty Child 1", "This is an empty child" );
    myroot.getChildren().add(newChild);
    modelSupport.fireChildAdded(
        new TreePath(getPathToRoot(myroot)), 
        myroot.getChildren().size() - 1,
        newChild);
}

或者某些......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM