【新手求助】【JTree相关】学习点击事件的时候出现一些问题

QiaoDog 2015-09-07 09:42:17
哈哈哈我又来向大家求助啦

最近在自学JTree相关的知识,碰到了一些问题



这是我在网上看到的一个范例,这个是点击某个节点,他会打印出来你选中的对象

下面的是这个程序的源码
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class TreeDemo {
public static void main(String[] args) {

// 创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。
// public DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部");
node1.add(new DefaultMutableTreeNode(new User("小花")));
node1.add(new DefaultMutableTreeNode(new User("小虎")));
node1.add(new DefaultMutableTreeNode(new User("小龙")));

DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部");
node2.add(new DefaultMutableTreeNode(new User("小叶")));
node2.add(new DefaultMutableTreeNode(new User("小雯")));
node2.add(new DefaultMutableTreeNode(new User("小夏")));

DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理");

top.add(new DefaultMutableTreeNode(new User("总经理")));
top.add(node1);
top.add(node2);
final JTree tree = new JTree(top);
JFrame f = new JFrame("JTreeDemo");
f.add(tree);
f.setSize(300, 300);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加选择事件
tree.addTreeSelectionListener(new TreeSelectionListener() {

@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();

if (node == null)
return;

Object object = node.getUserObject();
if (node.isLeaf()) {
User user = (User) object;
System.out.println("你选择了:" + user.toString());
}

}
});
}
}

class User {
private String name;

public User(String n) {
name = n;
}

// 重点在toString,节点的显示文本就是toString
public String toString() {
return name;
}
}




我想给这里面的user加上一个年龄的属性
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
那如果我要添加一个属性的话该怎么办 [/quote] 如果你想在显示出来 就写在 toString()方法里 比如
	@Override
	public String toString() {
		return name + ", " + age;
	}
这样就会显示名字和年龄了
  • 打赏
  • 举报
回复
就是说DefaultMutableTreeNode类中显示user的名字是调用的user类的 toString()方法,你的案例中显示“User@2dda6444”这样的信息也说明了现在调用的是继承自Object的 toString()方法,重写 toString()就行了 public String toName () { return name; } 改为 public String toString() { return name; }
QiaoDog 2015-09-07
  • 打赏
  • 举报
回复
我心生一计 就是在创建节点的时候我调用user的 toName 方法,这下应该能正常显示了吧,没想到在打印那块又出了问题
编译,运行都是正常的,但是在我点击了对象之后发现不能打印出来,会抛出错误

这是代码


import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class TestTree {
public static void main(String[] args) {

DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部");
node1.add(new DefaultMutableTreeNode(new User("小花",22).toName()));
node1.add(new DefaultMutableTreeNode(new User("小虎",29).toName()));
node1.add(new DefaultMutableTreeNode(new User("小龙",27).toName()));

DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部");
node2.add(new DefaultMutableTreeNode(new User("小叶",23).toName()));
node2.add(new DefaultMutableTreeNode(new User("小雯",25).toName()));
node2.add(new DefaultMutableTreeNode(new User("小夏",26).toName()));

DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理");

top.add(new DefaultMutableTreeNode(new User("总经理",40).toName()));
top.add(node1);
top.add(node2);

final JTree tree = new JTree(top);
JFrame f = new JFrame("JTreeDemo");
f.add(tree);
f.setSize(300, 300);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加选择事件
tree.addTreeSelectionListener(new TreeSelectionListener() {

@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();

if (node == null)
return;

Object object = node.getUserObject();
if (node.isLeaf()) {
User user = (User) object;
System.out.println("你选择了:" + user.toName() + ",其年龄是" + user.toAge());
}

}
});
}
}

class User {
private String name;
private int age;

public User(String n, int a) {
name = n;
age = a;
}

public String toName () {
return name;
}

public int toAge () {
return age;
}
}





这是运行结果
QiaoDog 2015-09-07
  • 打赏
  • 举报
回复
引用 2 楼 lonrence 的回复:
class User {
    private String name;
  
    public User(String n) {
        name = n;
    }
  
    // 重点在toString,节点的显示文本就是toString
    public String toString() {
        return name;
    }
}
案例里面已经说了 你的类里要重写toString
那如果我要添加一个属性的话该怎么办
  • 打赏
  • 举报
回复
class User {
    private String name;
  
    public User(String n) {
        name = n;
    }
  
    // 重点在toString,节点的显示文本就是toString
    public String toString() {
        return name;
    }
}
案例里面已经说了 你的类里要重写toString
QiaoDog 2015-09-07
  • 打赏
  • 举报
回复
接1楼

我于是改了下这段代码 给 user 添加了一个 age的 属性,并且写了 toName() 和 toAge () 两个方法

新的代码如下


import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class TestTree {
public static void main(String[] args) {

DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部");
node1.add(new DefaultMutableTreeNode(new User("小花",22)));
node1.add(new DefaultMutableTreeNode(new User("小虎",29)));
node1.add(new DefaultMutableTreeNode(new User("小龙",27)));

DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部");
node2.add(new DefaultMutableTreeNode(new User("小叶",23)));
node2.add(new DefaultMutableTreeNode(new User("小雯",25)));
node2.add(new DefaultMutableTreeNode(new User("小夏",26)));

DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理");

top.add(new DefaultMutableTreeNode(new User("总经理",40)));
top.add(node1);
top.add(node2);

final JTree tree = new JTree(top);
JFrame f = new JFrame("JTreeDemo");
f.add(tree);
f.setSize(300, 300);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加选择事件
tree.addTreeSelectionListener(new TreeSelectionListener() {

@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();

if (node == null)
return;

Object object = node.getUserObject();
if (node.isLeaf()) {
User user = (User) object;
System.out.println("你选择了:" + user.toName() + ",其年龄是" + user.toAge());
}

}
});
}
}

class User {
private String name;
private int age;

public User(String n, int a) {
name = n;
age = a;
}

public String toName () {
return name;
}

public int toAge () {
return age;
}
}




以下是我编译运行后的结果
发现有个问题:可以正常的打印出来user的属性,但是在GUI界面里面是不能显示user的名字的,这该怎么去改

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧