<----  i 总得到-1,但path变量内容正确???

解决方案 »

  1.   

    package com.hhj.examples;import javax.swing.event.TreeSelectionListener;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.DefaultMutableTreeNode;
    import java.util.HashSet;
    import java.util.Set;
    import java.util.Iterator;
    import com.hhj.examples.util.DBUtil;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import com.hhj.examples.table.ResultsModel;
    import javax.swing.BorderFactory;
    import java.awt.Color;
    import javax.swing.border.TitledBorder;public class DataSourceTreeSelectionListener implements TreeSelectionListener {
        public DataSourceTreeSelectionListener(DatabaseBrowse browser) {
            this.browser = browser;
        }    public void valueChanged(TreeSelectionEvent tree) {
            TreePath[] paths = this.browser.getDbTree().getSelectionPaths();
            if (paths == null || paths.length == 0)
                return;
            boolean tableSelected = false;
            String column;
            String table;
            String columnsParam = null;
            String tableParam = null;        String message = null;
            String executeSQL = null;        for (int j = 0; j < paths.length; j++) {
                switch (paths[j].getPathCount()) {
                    case 2:
                        scheme = (String) ( ( (DefaultMutableTreeNode) (paths[j].
                            getPathComponent(1))).getUserObject());
                        System.out.println(scheme);
                        this.columns.clear();
                        break;
                    case 3:
                        if (scheme == null)
                            return;
                        tableParam = (String) ( ( (DefaultMutableTreeNode) (paths[j].
                            getPathComponent(2))).getUserObject());
                        columnsParam = "*";
                        tableSelected = true;
                        message = "Complete " + scheme + "." + tableParam +
                            " table displayed!";
                        executeSQL = "Select * from " + scheme + "." + tableParam;
                        this.columns.clear();
                        break;
                    case 4:
                        if (scheme == null)
                            return;
                        table = (String) ( ( (DefaultMutableTreeNode) (paths[j].
                            getPathComponent(2))).getUserObject());
                        if (tableParam == null)
                            tableParam = table;                    column = (String) ( ( (DefaultMutableTreeNode) (paths[j].
                            getPathComponent(3))).getUserObject());
                        this.columns.add(column);
                        Iterator iterator = this.columns.iterator();
                        boolean first = true;
                        while (iterator.hasNext()) {
                            if (first) {
                                columnsParam = iterator.next() + "";
                                first = false;
                            } else {
                                columnsParam += "," + iterator.next();
                            }
                        }
                        tableSelected = true;
                        executeSQL = "Select " + columnsParam + " from " +
                            this.scheme + "." + tableParam;
                        message = "Complete " + columnsParam + " dispalyed from " +
                            this.scheme + "." + tableParam + " table!";
                        break;
                }
                if (tableSelected) {
                    try {
                        this.execute(executeSQL, tableParam);
                    } catch (SQLException ex) {
                        System.out.println("Waring!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1");
                        this.browser.getStatus().setText(ex.getErrorCode() + ":" +
                            ex.getMessage());
                        return;
                    }
                    this.browser.getTablePane().setBorder(
                        BorderFactory.createTitledBorder(
                        BorderFactory.createLineBorder(Color.darkGray),
                        tableParam,
                        TitledBorder.CENTER,
                        TitledBorder.DEFAULT_POSITION
                        ));
                    this.browser.getStatus().setText(message);
                }
            }
            System.out.println("tree changed!");
        }    private void execute(String sql, String tableName) throws SQLException {
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            ArrayList columnNames = new ArrayList();
            Iterator iterator = this.columns.iterator();        try {
                conn = DBUtil.getConnection(this.browser.getDrive(),
                                            this.browser.getUrl(),
                                            this.browser.getUserID(),
                                            this.browser.getPassword());
                //Get all the columns for the current table
                ResultSet columnRs = conn.getMetaData().getColumns(null, null,
                    tableName, null);
                if (this.columns.size() == 0) {
                    while (columnRs.next()) {
                        columnNames.add(columnRs.getString("COLUMN_NAME"));
                    }
                } else {
                    while (iterator.hasNext()) {
                        columnNames.add(iterator.next());
                    }            }
                if (columnNames.isEmpty())
                    return;
                columnNames.add(0,"INDEX");
                this.model.setColumnNames( (String[]) columnNames.toArray(new
                    String[columnNames.size()]));            pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery();
                this.model.setResultSet(rs);
                this.browser.getTable().setModel(this.model);
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
                this.browser.getStatus().setText(ex.getMessage());
            } finally {
                DBUtil.freeConnection(conn);
            }    }    private DatabaseBrowse browser;
        private Set columns = new HashSet();
        private String scheme = null;
        private ResultsModel model = new ResultsModel();
    }
      

  2.   

    试试看
     netcobol(初学者)
    的方法吧
    应该是可以的。
      

  3.   

    不行,不好使,netcobol(初学者)兄的方法只是相应选择事件并执行某些功能。
    我目前的树采用DefaultTreeModel做model,我把要删除结点(DefaultMutableTreeNode类型)parent保持到Hashtable中,删除结点后从Hashtable中取出parent,然后通过DefaultTreeModel的方法得到TreePath,然后选择此TreePath,但不起作用。我分析发现结点删除后Hashtable中保存的parent没有更新,里面还有删除节点的信息,所以使用该节点无法操作成功,估计问题就出在这。但是我怎么让parent同步更新?调用tree.reload()也没用。
      

  4.   

    代码没细看。长,查看这个吧,肯定对你有帮助,是可以的。http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html
      

  5.   

    totodo(土豆仙) 兄的链接也看过,稍微修改那个例子是可以实现选中parent结点的。关键问题是我现在的代码却无法实现。我又仔细检视了几遍代码,发现在一个刷新树的方法里有
    treeModel = (DefaultTreeModel)tree.getModel();
    这样重新赋值现有的treeModel是否会导致原model中取得的DefaultMutableTreeNode失效?另外还有如下赋值:
    setRoot(....),这是否也会导致原model内容变化?