树状结构的实现

功能:1.添加,删除,修改结点。2.更改叶子结点图标。3.显示隐藏连接线


代码:


import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

public class 实战 extends JFrame implements ActionListener{

	private ImageIcon[] image = new ImageIcon[3];
	private JButton button_add;
	private JButton button_update;
	private JButton button_delete;
	private JButton button_change;
	private JButton button_display;
	private JTextField textField;
	private JTree tree;
	private DefaultTreeModel treeModel;
	private JComboBox comboBox;
	private DefaultMutableTreeNode root;
	private final JScrollPane scrollPane_1;
	private JTextArea textArea;
	public 实战(){
		setTitle("树的综合应用");
		setBounds(100, 100, 400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel panel_1 = new JPanel(new FlowLayout(FlowLayout.CENTER,3,3));
		JLabel label_1 = new JLabel("节点文字:");
		label_1.setFont(new Font("宋体", Font.BOLD, 10));
		panel_1.add(label_1);
		
		textField = new JTextField(10);
		textField.setFont(new Font("宋体", Font.BOLD, 10));
		panel_1.add(textField);
		
		button_add = new JButton("添加");
		button_add.setFont(new Font("宋体", Font.BOLD, 10));
		panel_1.add(button_add);
		button_add.addActionListener(this);
		
		button_update = new JButton("修改");
		button_update.setFont(new Font("宋体", Font.BOLD, 10));
		panel_1.add(button_update);
		button_update.addActionListener(this);
		
		button_delete = new JButton("删除");
		button_delete.setFont(new Font("宋体", Font.BOLD, 10));
		panel_1.add(button_delete);
		button_delete.addActionListener(this);
		
		getContentPane().add(panel_1,BorderLayout.NORTH);
		
		JSplitPane splitPane = new JSplitPane();
		splitPane.setDividerLocation(100);
		root = new DefaultMutableTreeNode("部门分类");
		
		DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("基础部");
		DefaultMutableTreeNode node11 = new DefaultMutableTreeNode("经理");
		DefaultMutableTreeNode node12 = new DefaultMutableTreeNode("员工A");
		DefaultMutableTreeNode node13 = new DefaultMutableTreeNode("员工B");
		
		node1.add(node11);
		node1.add(node12);
		node1.add(node13);
		
		DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("设计部");
		DefaultMutableTreeNode node21 = new DefaultMutableTreeNode("经理");
		DefaultMutableTreeNode node22 = new DefaultMutableTreeNode("员工A");
		DefaultMutableTreeNode node23 = new DefaultMutableTreeNode("员工B");
		
		node2.add(node21);
		node2.add(node22);
		node2.add(node23);
		
		root.add(node1);
		root.add(node2);
		
		treeModel = new DefaultTreeModel(root);
		
		tree = new JTree(treeModel);
		TreeSelectionModel selectionModel = tree.getSelectionModel();
		selectionModel.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);//设置为连选模式
		tree.setFont(new Font("宋体", Font.BOLD, 10));
		scrollPane_1 = new JScrollPane();
		scrollPane_1.setViewportView(tree);
		splitPane.setLeftComponent(scrollPane_1);
		
		final JScrollPane scrollPane_2 = new JScrollPane();
		textArea = new JTextArea();
		textArea.setFont(new Font("宋体", Font.BOLD, 10));
		scrollPane_2.setViewportView(textArea);//显示单击结点的路径
		
		splitPane.setRightComponent(scrollPane_2);
		
		getContentPane().add(splitPane,BorderLayout.CENTER);
		
		JPanel panel_3 = new JPanel(new FlowLayout(FlowLayout.CENTER,3,3));
		JLabel label_2 = new JLabel("选择图标:");
		label_2.setFont(new Font("宋体", Font.BOLD, 10));
		panel_3.add(label_2);
		
		for(int i=0;i<3;i++){
			image[i] = new ImageIcon(this.getClass().getResource("02-"+(i+1)+".png"));
		}
		comboBox = new JComboBox(image);
		panel_3.add(comboBox);
		
		button_change = new JButton("更改叶子结点图标");
		button_change.setFont(new Font("宋体", Font.BOLD, 10));
		panel_3.add(button_change);
		button_change.addActionListener(this);
		
		button_display = new JButton("隐藏连接线");
		button_display.setFont(new Font("宋体", Font.BOLD, 10));
		panel_3.add(button_display);
		button_display.addActionListener(this);
		
		getContentPane().add(panel_3,BorderLayout.SOUTH);
		
        tree.addTreeSelectionListener(new TreeSelectionListener() {
			
			@Override
			public void valueChanged(TreeSelectionEvent e) {
				if(!tree.isSelectionEmpty()){
					TreePath[] selectionPath = tree.getSelectionPaths();
					for(int i=0;i<selectionPath.length;i++){
						TreePath treePath = selectionPath[i];
						Object[] path = treePath.getPath();
						for(int j=0;j<path.length;j++){
							DefaultMutableTreeNode node = (DefaultMutableTreeNode) path[j];
							textArea.append(node.getUserObject()+(j==(path.length-1)?"":"->"));
						}
						textArea.append("\n");
					}
					textArea.append("\n");
				}
			}
		});
	}
	public static void main(String[] args) {
		new 实战().setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == button_add){//添加
			String text = textField.getText();
			DefaultMutableTreeNode node = new DefaultMutableTreeNode(text);
			TreePath treePath = tree.getSelectionPath();
			DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) treePath.getLastPathComponent();
			treeModel.insertNodeInto(node, parentNode, parentNode.getChildCount());
			TreePath path = treePath.pathByAddingChild(node);
			if(!tree.isVisible()){
				tree.makeVisible(treePath);
			}
		}
		if(e.getSource() == button_delete){//删除
			//待删除的结点
			DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
			if(!node.isRoot()){
				DefaultMutableTreeNode nextsilbing = node.getNextSibling();
				//如果下一个结点不存在,则选中其父节点
				nextsilbing = (DefaultMutableTreeNode) node.getParent();
				treeModel.removeNodeFromParent(node);
				tree.setSelectionPath(new TreePath(nextsilbing.getPath()));
			}
		}
		if(e.getSource() == button_update){//修改
			//得到待修改结点的路径
			TreePath selectionPath = tree.getSelectionPath();
			DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
		//	DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
			node.setUserObject(textField.getText());
			treeModel.nodeChanged(node);
			tree.setSelectionPath(selectionPath);
		}
		if(e.getSource() == button_change){//更改叶子节点的图标
			ImageIcon temp = (ImageIcon) comboBox.getSelectedItem();
			DefaultTreeCellRenderer treeCellRenderer = (DefaultTreeCellRenderer) tree.getCellRenderer();
			treeCellRenderer.setLeafIcon(temp);
			Enumeration enumeration = root.preorderEnumeration();
			while(enumeration.hasMoreElements()){
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) enumeration.nextElement();
				if(node.isLeaf()){
					treeModel.nodeChanged(node);
				}
			}
		}
		if(e.getActionCommand().equals("隐藏连接线")){
			System.out.println(button_display.getText());
			tree.putClientProperty("JTree.lineStyle", "None");
			scrollPane_1.setViewportView(tree);
			button_display.setText("显示连接线");
		}
		if(e.getActionCommand().equals("显示连接线")){
			System.out.println(button_display.getText());
			tree.putClientProperty("JTree.lineStyle", "Angled");
			scrollPane_1.setViewportView(tree);
			button_display.setText("隐藏连接线");
		}
	}
}


程序效果如图:



注意:代码需要三张图片.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值