Jtree 增加结点

ublic class JTreeDemo extends JFrame implements ActionListener,
  TreeSelectionListener {
private static final long serialVersionUID = 3604526229381602695L;
private JButton btnAdd = new JButton("添加节点");
private JButton btnRemove = new JButton("删除节点");
private JTextField txtAdd = new JTextField(20);
private DefaultMutableTreeNode root = new DefaultMutableTreeNode("JTree演示");
private JTree tree = new JTree(root);
private DefaultMutableTreeNode selectedNode = null;

public JTreeDemo() {
super("JTree演示");
this.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.add(btnAdd);
panel.add(btnRemove);
panel.add(txtAdd);
tree.addTreeSelectionListener(this);
btnAdd.addActionListener(this);
btnRemove.addActionListener(this);
this.add(new JScrollPane(tree), BorderLayout.CENTER);
this.add(panel, BorderLayout.PAGE_END);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.pack();
this.setVisible(true);
}

//@Override
public void valueChanged(TreeSelectionEvent e) {
selectedNode = (DefaultMutableTreeNode) e.getNewLeadSelectionPath()
.getLastPathComponent(); //标记选中的节点
}

//@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnAdd && !txtAdd.getText().equals("")
&& selectedNode != null) {
//添加节点
DefaultMutableTreeNode addNode = new DefaultMutableTreeNode(txtAdd
.getText());
selectedNode.add(addNode);
tree.updateUI();
}
else if (e.getSource() == btnRemove && selectedNode != null
&& selectedNode != root) {
selectedNode.removeFromParent(); //移除节点
selectedNode = null;
tree.updateUI();
}
}

public static void main(String[] args) {
new JTreeDemo();
}
}

 

 

 

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.beancontext.BeanContext;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

import com.sun.xml.internal.messaging.saaj.packaging.mime.util.BEncoderStream;

public class MainFrame extends JFrame {


public static void main(String args[]) {
try {
MainFrame frame = new MainFrame();
Dimension frameSize = frame.getSize();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if(frameSize.width>screenSize.width){
frameSize.width=screenSize.width;
}
if(frameSize.height>screenSize.height){
frameSize.height=screenSize.height;
}

frame.setLocation((screenSize.width-frameSize.width)/2, (screenSize.height-frameSize.height)/2);

frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

private JTree tree;
private DefaultMutableTreeNode root = new DefaultMutableTreeNode("语言");
private DefaultMutableTreeNode menu_accp = new DefaultMutableTreeNode("英语");
private DefaultMutableTreeNode menu_benet = new DefaultMutableTreeNode("法语");
private DefaultMutableTreeNode menu_accp_s1 = new DefaultMutableTreeNode("4级");
private DefaultMutableTreeNode menu_accp_s2 = new DefaultMutableTreeNode("6级");
private DefaultMutableTreeNode menu_accp_y2 = new DefaultMutableTreeNode("8级");


private JTextField txtParent;
private JTextField txtNode;
private JTextField txtType;
private JTextField txtChild;
private JPopupMenu popupMenu;

/**
* Create the frame
*/
public MainFrame() {
super();
getContentPane().setLayout(null);
setBounds(100, 100, 535, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(24, 10, 173, 317);
getContentPane().add(scrollPane);
tree = new JTree(root);
tree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(e.getModifiers()==Event.META_MASK){
addPopup(getContentPane(), popupMenu);
popupMenu.show(getContentPane(),e.getX()+30,e.getY()+40);
}
}
});
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
Object nodeInfo = node.getUserObject();

if(node.isRoot()){
txtParent.setText("");
txtNode.setText(nodeInfo.toString());
txtType.setText("根节点");
txtChild.setText(node.getChildCount() + "");
}else{
txtParent.setText(node.getParent().toString());
txtNode.setText(nodeInfo.toString());
if(node.isLeaf()){
txtType.setText("叶节点");
}else{
txtType.setText("枝节点");
}
txtChild.setText(node.getChildCount() + "");
}

}
});
scrollPane.setViewportView(tree);

txtParent = new JTextField();
txtParent.setBounds(339, 49, 90, 21);
getContentPane().add(txtParent);

txtNode = new JTextField();
txtNode.setBounds(339, 107, 90, 21);
getContentPane().add(txtNode);

txtType = new JTextField();
txtType.setBounds(339, 167, 90, 21);
getContentPane().add(txtType);

txtChild = new JTextField();
txtChild.setBounds(339, 231, 90, 21);
getContentPane().add(txtChild);

final JLabel label = new JLabel();
label.setText("父类型节点");
label.setBounds(225, 49, 90, 15);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("节点的名称");
label_1.setBounds(225, 107, 90, 15);
getContentPane().add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("节点的类型");
label_2.setBounds(225, 167, 90, 15);
getContentPane().add(label_2);

final JLabel label_3 = new JLabel();
label_3.setText("子节点的个数");
label_3.setBounds(225, 231, 90, 15);
getContentPane().add(label_3);

popupMenu = new JPopupMenu();


final JMenuItem menuItem = new JMenuItem();
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
model.removeNodeFromParent(node);
}
});
menuItem.setText("删除");
popupMenu.add(menuItem);
//
}

private static void addPopup(Component component, final JPopupMenu popup) {
component.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
showMenu(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
showMenu(e);
}
private void showMenu(MouseEvent e) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
});
}
}

 

<think>嗯,用户想了解Java中JTree组件的使用教程和示例,以及问题解决。首先,我需要回忆一下JTree的基本知识。根据引用里的内容,JTree是用来显示树形结构数据的,比如文件系统或者组织结构。构造方法有几种,比如使用默认模型、数组、或者TreeNode作为根节点。可能需要先介绍如何创建JTree,然后添加节点,处理事件,比如选择事件。 用户提供的引用中提到,DefaultMutableTreeNode是用来创建树节点的,可以添加子节点。还有监听器的添加,比如例子中的JTreeSelectionListenerDemo,这说明需要演示如何给JTree添加选择监听器。引用里也提到了TreeNode和MutableTreeNode接口,说明节点是可以修改的。 接下来,我应该按照步骤来组织回答。首先,创建JTree的基本步骤,包括根节点的创建,添加子节点,然后构建树并放入JFrame中。然后,如何处理事件,比如选中节点时获取信息。可能还需要提到如何自定义渲染器或者编辑器,但引用中没有详细提到,可能需要根据已有信息回答,或者建议查阅更多资料。 示例代码部分,用户提供的例子中有JTreeSelectionListenerDemo,可以改编成一个简单的示例,展示如何创建树和添加监听器。要注意代码的正确性,比如使用SwingUtilities.invokeLater来保证线程安全。另外,引用中的代码片段可能有不完整的地方,需要补全必要的部分,比如设置JFrame的大小和可见性。 在常见问题部分,用户可能遇到的问题包括节点无法展开、事件不触发、显示不正确等。根据引用中的内容,可能需要调用expandRow方法展开节点,或者检查TreeModel是否正确。事件监听器部分需要确认是否正确添加,比如使用addTreeSelectionListener。 最后,生成相关问题时,需要考虑用户可能进一步想知道的内容,比如如何动态修改节点,自定义节点图标,或者处理大数据量时的性能优化。这些都可以作为相关问题提出,引导用户深入学习和解决问题。</think>### Java JTree组件使用教程及示例 #### 一、JTree组件基础 JTreeSwing中用于显示树形层次结构的组件,常用于文件系统、组织结构等场景[^3][^4]。其核心是`TreeNode`接口,而`DefaultMutableTreeNode`是常用实现类,支持动态增删子节点[^5]。 #### 二、基础使用步骤 1. **创建树节点** ```java DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("子节点1"); root.add(child1); // 添加子节点 ``` 2. **构建JTree并显示** ```java JTree tree = new JTree(root); // 使用根节点构造树[^4] JFrame frame = new JFrame("JTree示例"); frame.add(new JScrollPane(tree)); // 支持滚动 frame.setSize(300, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); ``` #### 三、添加事件监听 实现节点选择监听: ```java tree.addTreeSelectionListener(e -> { TreePath path = e.getPath(); DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); System.out.println("选中节点: " + node.getUserObject()); }); // [^1][^5] ``` #### 四、完整示例代码 ```java import javax.swing.*; import javax.swing.tree.*; public class JTreeDemo extends JFrame { public JTreeDemo() { DefaultMutableTreeNode root = new DefaultMutableTreeNode("公司部门"); DefaultMutableTreeNode devDept = new DefaultMutableTreeNode("开发部"); devDept.add(new DefaultMutableTreeNode("前端组")); devDept.add(new DefaultMutableTreeNode("后端组")); root.add(devDept); JTree tree = new JTree(root); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(e -> { TreePath path = tree.getSelectionPath(); if (path != null) { System.out.println("当前选中: " + path.getLastPathComponent()); } }); add(new JScrollPane(tree)); setTitle("组织结构树 - 示例"); setSize(350, 450); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new JTreeDemo().setVisible(true)); } } ``` #### 五、常见问题解决 1. **节点无法展开** ```java tree.expandRow(0); // 展开根节点 ``` 2. **事件未触发** - 确认正确添加`addTreeSelectionListener` - 检查`TreeModel`是否正确绑定[^4] 3. **显示异常** - 使用`JScrollPane`包裹JTree - 调用`tree.updateUI()`刷新界面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值