`

带有可编辑功能的JTree代码

 
阅读更多
package PreD.view.task;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class EditJTree {
	JFrame jf;

	JTree tree;
	// 上面JTree对象对应的model
	DefaultTreeModel model;

	// 定义几个初始节点
	DefaultMutableTreeNode root = new DefaultMutableTreeNode("中国");
	DefaultMutableTreeNode guangdong = new DefaultMutableTreeNode("广东");
	DefaultMutableTreeNode guangxi = new DefaultMutableTreeNode("广西");
	DefaultMutableTreeNode foshan = new DefaultMutableTreeNode("佛山");
	DefaultMutableTreeNode shantou = new DefaultMutableTreeNode("汕头");
	DefaultMutableTreeNode guilin = new DefaultMutableTreeNode("桂林");
	DefaultMutableTreeNode nanning = new DefaultMutableTreeNode("南宁");

	// 定义需要被拖动的TreePath
	TreePath movePath;

	JButton addSiblingButton = new JButton("添加兄弟节点");
	JButton addChildButton = new JButton("添加子节点");
	JButton deleteButton = new JButton("删除节点");
	JButton editButton = new JButton("编辑当前节点");

	public void init() {
		guangdong.add(foshan);
		guangdong.add(shantou);
		guangxi.add(guilin);
		guangxi.add(nanning);
		root.add(guangdong);
		root.add(guangxi);

		jf = new JFrame("树");
		tree = new JTree(root);
		// 获取JTree对应的TreeModel对象
		model = (DefaultTreeModel) tree.getModel();
		// 设置JTree可编辑
		tree.setEditable(true);
		MouseListener ml = new MouseAdapter() {
			// 按下鼠标时候获得被拖动的节点
			public void mousePressed(MouseEvent e) {
				// 如果需要唯一确定某个节点,必须通过TreePath来获取。
				TreePath tp = tree.getPathForLocation(e.getX(), e.getY());
				if (tp != null) {
					movePath = tp;
				}
			}

			// 鼠标松开时获得需要拖到哪个父节点
			public void mouseReleased(MouseEvent e) {
				// 根据鼠标松开时的TreePath来获取TreePath
				TreePath tp = tree.getPathForLocation(e.getX(), e.getY());

				if (tp != null && movePath != null) {
					// 阻止向子节点拖动
					if (movePath.isDescendant(tp) && movePath != tp) {
						JOptionPane.showMessageDialog(jf,
								"目标节点是被移动节点的子节点,无法移动!", "非法操作",
								JOptionPane.ERROR_MESSAGE);
						return;
					}
					// 既不是向子节点移动,而且鼠标按下、松开的不是同一个节点
					else if (movePath != tp) {
						System.out.println(tp.getLastPathComponent());
						// add方法可以先将原节点从原父节点删除,再添加到新父节点中
						((DefaultMutableTreeNode) tp.getLastPathComponent())
								.add((DefaultMutableTreeNode) movePath
										.getLastPathComponent());
						movePath = null;
						tree.updateUI();
					}
				}
			}
		};
		tree.addMouseListener(ml);

		JPanel panel = new JPanel();

		addSiblingButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				// 获取选中节点
				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();
				// 如果节点为空,直接返回
				if (selectedNode == null)
					return;
				// 获取该选中节点的父节点
				DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode
						.getParent();
				// 如果父节点为空,直接返回
				if (parent == null)
					return;
				// 创建一个新节点
				DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
						"新节点");
				// 获取选中节点的选中索引
				int selectedIndex = parent.getIndex(selectedNode);
				// 在选中位置插入新节点
				model.insertNodeInto(newNode, parent, selectedIndex + 1);
				// --------下面代码实现显示新节点(自动展开父节点)-------
				// 获取从根节点到新节点的所有节点
				TreeNode[] nodes = model.getPathToRoot(newNode);
				// 使用指定的节点数组来创建TreePath
				TreePath path = new TreePath(nodes);
				// 显示指定TreePath
				tree.scrollPathToVisible(path);
			}
		});
		panel.add(addSiblingButton);

		addChildButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				// 获取选中节点
				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();
				// 如果节点为空,直接返回
				if (selectedNode == null)
					return;
				// 创建一个新节点
				DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
						"新节点");
				// 直接通过model来添加新节点,则无需通过调用JTree的updateUI方法
				// model.insertNodeInto(newNode, selectedNode,
				// selectedNode.getChildCount());
				// 直接通过节点添加新节点,则需要调用tree的updateUI方法
				selectedNode.add(newNode);
				// --------下面代码实现显示新节点(自动展开父节点)-------
				TreeNode[] nodes = model.getPathToRoot(newNode);
				TreePath path = new TreePath(nodes);
				tree.scrollPathToVisible(path);
				tree.updateUI();
			}
		});
		panel.add(addChildButton);

		deleteButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();
				if (selectedNode != null && selectedNode.getParent() != null) {
					// 删除指定节点
					model.removeNodeFromParent(selectedNode);
				}
			}
		});
		panel.add(deleteButton);

		editButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				TreePath selectedPath = tree.getSelectionPath();
				if (selectedPath != null) {
					// 编辑选中节点
					tree.startEditingAtPath(selectedPath);
				}
			}
		});
		panel.add(editButton);

		jf.add(new JScrollPane(tree));
		jf.add(panel, BorderLayout.SOUTH);
		jf.pack();
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
	}

	public static void main(String[] args) {
		new EditJTree().init();
	}
}
 
分享到:
评论

相关推荐

    Jtable和JTree的写法示例代码

    1. `JTree()`:返回带有示例模型的JTree。 2. `JTree(Object[] value)`:创建一个JTree,其中数组的每个元素都是新根节点的子节点。 3. `JTree(TreeNode root)`:以指定的TreeNode作为根节点创建JTree。 4. `JTree...

    Java Swing JComboBox下拉列表框的示例代码

    * setEditable(boolean flag):设置下拉列表框是否可编辑。 示例代码 以下是一个简单的示例代码,演示如何使用 JComboBox: ```java package com.xiets.swing; import javax.swing.*; import java.awt.event....

    Java Swing中的表格(JTable)和树(JTree)组件使用实例

    - 示例代码1展示了如何创建一个带有默认数据的`JTable`。首先,定义列名和数据,然后创建`DefaultTableModel`,并将其传递给`JTable`构造函数。接着,将`JTable`添加到滚动条面板`JScrollPane`中,以便实现滚动功能...

    UML设计器源代码

    Swing组件的可定制性极高,可以通过JTable、JTree、JTabbedPane等组件构建出复杂的应用程序。 2. UML设计器核心组件: UML设计器通常包含类图、对象图、用例图、序列图等多种图表的绘制功能。在这款基于Swing的UML...

    swing入门教程以及代码

    4. JTabbedPane:创建带有多个选项卡的组件容器。 总之,Swing为Java开发人员提供了丰富的组件库和功能,用于构建功能强大的桌面应用程序。通过深入学习和实践,你可以创建出具有吸引力且易于使用的图形界面。现在...

    Java Swing 开发源代码

    - **JTabbedPane**: 创建带有多个面板的选项卡布局。 2. **模型-视图-控制器(MVC)**: Swing采用MVC设计模式,其中每个组件都有一个模型(Model)来存储数据,一个视图(View)来展示数据,以及一个控制器...

    Window Builder功能介绍

    - JScrollPane:提供了带有滚动条的面板,当组件超出可视区域时可以滚动查看。 - JSplitPane:用于将容器拆分成多个窗格,用户可以调整各个窗格的大小。 - JTabbedPane:选项卡面板,可以实现多卡片界面的用户交互,...

    java图形化界面编程资料.zip

    例如,JTable可以用来显示和编辑表格数据,JTabbedPane可以创建带有多个选项卡的界面,而JTree和JList则可以展示层次结构的数据。 在Java图形化界面编程中,事件处理是关键的一环。当用户与界面元素交互时,会产生...

    java swing(影印版)

    还有JOptionPane用于显示对话框,以及JTabbedPane用于创建带有多个选项卡的面板。 总之,学习这本影印版教材,你将能全面了解和掌握Java Swing的各种组件、布局管理、事件处理、高级特性以及UI定制,为开发高效、...

    java swing

    此外,Swing包含了一些复杂的组件,如JTable用于显示和编辑表格数据,JTree用于展示层次结构的数据,以及JTabbedPane用于创建带有多个选项卡的用户界面。这些组件都提供了丰富的API,可以方便地进行数据绑定、排序、...

    knowlege7.0(swing使用)例子

    此外,Swing提供了许多高级组件,如JTable用于显示和编辑表格数据,JTree用于展示层次结构的数据,以及JTabbedPane用于创建带有选项卡的用户界面。这些组件可以极大地提升应用程序的功能和复杂性。 在实际项目开发...

    Swing经典复习题目

    8. **JTabbedPane**:用于创建带有多个面板的选项卡式界面。 9. **国际化支持**:Swing内置了对多语言的支持,方便创建支持不同语言的应用程序。 10. **AWT兼容**:虽然Swing是轻量级组件,但它与重量级的Abstract ...

    Java数据库编程宝典2

    7.5.4 使用带有DELETE命令的子查询 7.5.5 关联子查询 7.6 JDBC ResultSet 7.6.1 ResultSetMetaData 7.6.2 使用具有JDBC的SELECT来返回RecordSet 7.7 基于Swing的SQL查询面板 7.7.1 View菜单 7.7.2 ...

    Java数据库编程宝典4

    7.5.4 使用带有DELETE命令的子查询 7.5.5 关联子查询 7.6 JDBC ResultSet 7.6.1 ResultSetMetaData 7.6.2 使用具有JDBC的SELECT来返回RecordSet 7.7 基于Swing的SQL查询面板 7.7.1 View菜单 7.7.2 ...

    Java数据库编程宝典1

    7.5.4 使用带有DELETE命令的子查询 7.5.5 关联子查询 7.6 JDBC ResultSet 7.6.1 ResultSetMetaData 7.6.2 使用具有JDBC的SELECT来返回RecordSet 7.7 基于Swing的SQL查询面板 7.7.1 View菜单 7.7.2 ...

    Java数据库编程宝典3

    7.5.4 使用带有DELETE命令的子查询 7.5.5 关联子查询 7.6 JDBC ResultSet 7.6.1 ResultSetMetaData 7.6.2 使用具有JDBC的SELECT来返回RecordSet 7.7 基于Swing的SQL查询面板 7.7.1 View菜单 7.7.2 ...

    java_swing_study

    12. **JTabbedPane**: 用于创建带有多个选项卡的界面,每个选项卡可以包含一个组件或容器。 13. **Swing定时器(javax.swing.Timer)**: 用于在指定间隔后执行一次或重复执行某个任务,常用于动画效果或定时触发...

    Java_Swing_with_Samples.pdf

    Swing不仅支持基本的GUI组件如按钮、文本框等,还提供了更高级的组件,例如表格、树形结构和带有样式文本的编辑器等。 #### 二、Swing架构基础 在深入探讨Swing之前,我们首先需要了解几个关键的概念,这些概念...

Global site tag (gtag.js) - Google Analytics