JTree如何选中一个结点的问题!!!

hccpro 2004-01-15 12:30:22
当删除最末层某一结点,我要选中其parent结点,但除root可以选中外,其它
结点都无法选中。

此时JTree已展开到要被选中的结点,我如下调用:(n是要被选中的结点)

TreeNode[] nodes = treeModel.getPathToRoot(n);
TreePath path = new TreePath(nodes);
int i = tree.getRowForPath(path); <---- i 总得到-1,但path变量内容正确
tree.setSelectionInterval(i, i);

最后两行换成tree.setSelectionPath(path);也没选中那个结点。

我在之前无论怎样调用tree.reload(); tree.makeVisiable(); tree.expandPath()都没用


我这个JTree大概有4、5层,设置有自己的TreeCellRenderer

有相应的TreeSelectionListener


非常着急,肯切大家指正到底哪地方用错了。

分不够可以再加
...全文
261 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hccpro 2004-01-17
totodo(土豆仙) 兄的链接也看过,稍微修改那个例子是可以实现选中parent结点的。

关键问题是我现在的代码却无法实现。

我又仔细检视了几遍代码,发现在一个刷新树的方法里有
treeModel = (DefaultTreeModel)tree.getModel();
这样重新赋值现有的treeModel是否会导致原model中取得的DefaultMutableTreeNode失效?

另外还有如下赋值:
setRoot(....),这是否也会导致原model内容变化?
  • 打赏
  • 举报
回复
stonecsdn 2004-01-17
学习
  • 打赏
  • 举报
回复
totodo 2004-01-17
代码没细看。长,

查看这个吧,肯定对你有帮助,是可以的。http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html
  • 打赏
  • 举报
回复
hccpro 2004-01-16
没找到其它相关的帖子。


楼上的方法我试试,但感觉功能上差不多。

如果搞定必给分!
  • 打赏
  • 举报
回复
hccpro 2004-01-16
不行,不好使,netcobol(初学者)兄的方法只是相应选择事件并执行某些功能。


我目前的树采用DefaultTreeModel做model,我把要删除结点(DefaultMutableTreeNode类型)

parent保持到Hashtable中,删除结点后从Hashtable中取出parent,然后通过DefaultTreeModel

的方法得到TreePath,然后选择此TreePath,但不起作用。

我分析发现结点删除后Hashtable中保存的parent没有更新,里面还有删除节点的信息,所以

使用该节点无法操作成功,估计问题就出在这。

但是我怎么让parent同步更新?调用tree.reload()也没用。
  • 打赏
  • 举报
回复
Leemaasn 2004-01-16
试试看
netcobol(初学者)
的方法吧。。。


应该是可以的。

  • 打赏
  • 举报
回复
stevenjzj 2004-01-16
up
  • 打赏
  • 举报
回复
YuLimin 2004-01-15
<---- i 总得到-1,但path变量内容正确???
  • 打赏
  • 举报
回复
netcobol 2004-01-15
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();
}
  • 打赏
  • 举报
回复
tiger_wkh52741 2004-01-15
前几天有人讨论过这个问题,何不去搜索一下.节省楼主的时间和分数!
  • 打赏
  • 举报
回复
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
申请成为版主
帖子事件
创建了帖子
2004-01-15 12:30
社区公告
暂无公告