`
whq
  • 浏览: 46737 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

JTreeComboBox--Swing树形下拉框

阅读更多
    最近公司用SWing开发时,需要实现网友们称为的“树形下拉框的”效果。关于此效果B/S模式很容易实现,放到Swing上面事先就有点困难。这个东西弄了将近一下午,终于出效果了。先分享出去。希望共同提高!
package com.pos.utils.tree;

import java.awt.*;

/**
 * @author wanghaoqian
 * Description: 树形下拉列表框
 */
public class JTreeComboBox extends JComboBox {
	/**
	 * 显示用的树
	 */
	private JTree tree;

	public JTreeComboBox() {
		this(new JTree());
	}

	public JTreeComboBox(JTree tree) {
		this.setTree(tree);
	}

	/**
	 * 设置树
	 * 
	 * @param tree
	 *            JTree
	 */
	public void setTree(JTree tree) {
		this.tree = tree;
		if (tree != null) {
			this.setSelectedItem(tree.getSelectionPath());
			this.setRenderer(new JTreeComboBoxRenderer());
		}
		this.updateUI();
	}

	/**
	 * 取得树
	 * 
	 * @return JTree
	 */
	public JTree getTree() {
		return tree;
	}

	/**
	 * 设置当前选择的树路径
	 * 
	 * @param o
	 *            Object
	 */
	public void setSelectedItem(Object o) {
		tree.setSelectionPath((TreePath) o);
		getModel().setSelectedItem(o);
	}

	public void updateUI() {
		ComboBoxUI cui = (ComboBoxUI) UIManager.getUI(this);
		if (cui instanceof MetalComboBoxUI) {
			cui = new MetalJTreeComboBoxUI();
		} else if (cui instanceof MotifComboBoxUI) {
			cui = new MotifJTreeComboBoxUI();
		} else {
			cui = new WindowsJTreeComboBoxUI();
		}
		setUI(cui);
	}

	// UI Inner classes -- one for each supported Look and Feel
	class MetalJTreeComboBoxUI extends MetalComboBoxUI {
		protected ComboPopup createPopup() {
			return new TreePopup(comboBox);
		}
	}

	class WindowsJTreeComboBoxUI extends WindowsComboBoxUI {
		protected ComboPopup createPopup() {
			return new TreePopup(comboBox);
		}
	}

	class MotifJTreeComboBoxUI extends MotifComboBoxUI {
		protected ComboPopup createPopup() {
			return new TreePopup(comboBox);
		}
	}

	/**
	 * 
	 * Description: 树形结构而来的DefaultListCellRenderer
	 */
	class JTreeComboBoxRenderer extends DefaultListCellRenderer {
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
			if (value != null) {
				TreePath path = (TreePath) value;
				TreeNode node = (TreeNode) path.getLastPathComponent();
				value = node;
				TreeCellRenderer r = tree.getCellRenderer();
				JLabel lb = (JLabel) r.getTreeCellRendererComponent(tree,
						value, isSelected, false, node.isLeaf(), index,
						cellHasFocus);
				return lb;
			}
			return super.getListCellRendererComponent(list, value, index,
					isSelected, cellHasFocus);
		}
	}

	/**
	 * 测试
	 */
	public static void main(String args[]) {
		JFrame frame = new JFrame("JTreeComboBox 例子");
		frame.setSize(400, 320);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		frame.setLocation((d.width - frame.getSize().width) / 2,
				(d.height - frame.getSize().height) / 2);
		frame.getContentPane().setLayout(new FlowLayout());
		final JTreeComboBox box = new JTreeComboBox(new JTree());
		box.setPreferredSize(new Dimension(300, 21));
		frame.getContentPane().add(box);
		final JButton btt = new JButton("保存");
		btt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				box.setTree(new JTree());
				btt.setEnabled(false);
			}
		});
		frame.getContentPane().add(btt);
		frame.setVisible(true);
	}
}

/**
 * <p>
 * Description: TreePopup
 * </p>
 */
class TreePopup extends JPopupMenu implements ComboPopup {
	protected JTreeComboBox comboBox;
	protected JScrollPane scrollPane;

	protected MouseMotionListener mouseMotionListener;
	protected MouseListener mouseListener;
	private MouseListener treeSelectListener = new MouseAdapter() {
		public void mouseReleased(MouseEvent e) {
			JTree tree = (JTree) e.getSource();
			TreePath tp = tree.getPathForLocation(e.getPoint().x,
					e.getPoint().y);
			if (tp == null) {
				return;
			}
			comboBox.setSelectedItem(tp);
			togglePopup();
			MenuSelectionManager.defaultManager().clearSelectedPath();
		}
	};

	public TreePopup(JComboBox comboBox) {
		this.comboBox = (JTreeComboBox) comboBox;
		setBorder(BorderFactory.createLineBorder(Color.black));
		setLayout(new BorderLayout());
		setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled());
		JTree tree = this.comboBox.getTree();
		if (tree != null) {
			scrollPane = new JScrollPane(tree);
			scrollPane.setBorder(null);
			add(scrollPane, BorderLayout.CENTER);
			tree.addMouseListener(treeSelectListener);
		}
	}

	public void show() {
		updatePopup();
		show(comboBox, 0, comboBox.getHeight());
		comboBox.getTree().requestFocus();
	}

	public void hide() {
		setVisible(false);
		comboBox.firePropertyChange("popupVisible", true, false);
	}

	protected JList list = new JList();

	public JList getList() {
		return list;
	}

	public MouseMotionListener getMouseMotionListener() {
		if (mouseMotionListener == null) {
			mouseMotionListener = new MouseMotionAdapter() {
			};
		}
		return mouseMotionListener;
	}

	public KeyListener getKeyListener() {
		return null;
	}

	public void uninstallingUI() {
	}

	/**
	 * Implementation of ComboPopup.getMouseListener().
	 * 
	 * @return a <code>MouseListener</code> or null
	 * @see ComboPopup#getMouseListener
	 */
	public MouseListener getMouseListener() {
		if (mouseListener == null) {
			mouseListener = new InvocationMouseHandler();
		}
		return mouseListener;
	}

	protected void togglePopup() {
		if (isVisible()) {
			hide();
		} else {
			show();
		}
	}

	protected void updatePopup() {
		setPreferredSize(new Dimension(comboBox.getSize().width, 200));
		Object selectedObj = comboBox.getSelectedItem();
		if (selectedObj != null) {
			TreePath tp = (TreePath) selectedObj;
			((JTreeComboBox) comboBox).getTree().setSelectionPath(tp);
		}
	}

	protected class InvocationMouseHandler extends MouseAdapter {
		public void mousePressed(MouseEvent e) {
			if (!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()) {
				return;
			}
			if (comboBox.isEditable()) {
				Component comp = comboBox.getEditor().getEditorComponent();
				if ((!(comp instanceof JComponent))
						|| ((JComponent) comp).isRequestFocusEnabled()) {
					comp.requestFocus();
				}
			} else if (comboBox.isRequestFocusEnabled()) {
				comboBox.requestFocus();
			}
			togglePopup();
		}
	}
}
  • 大小: 6 KB
分享到:
评论

相关推荐

    bootstrap树形下拉框 下拉框树形菜单

    Bootstrap Tree形下拉框是一种将传统的下拉菜单与树形结构结合的UI组件,它使得在有限的空间内展示层级关系的数据变得更加直观和易用。在Web开发中,Bootstrap框架提供了丰富的样式和组件,大大简化了网页设计的工作...

    bootstrap select树形下拉框

    Bootstrap Select树形下拉框是一种将传统HTML下拉选择框与树形结构相结合的组件,它使得用户在有限的空间内可以展示层次化的选项,提高了用户体验。Bootstrap Select是基于流行的前端框架Bootstrap开发的,因此它...

    bootstrap树形下拉框 下拉框树形菜单(花了一小时修改过的)

    这个组件是基于流行的前端框架Bootstrap和JavaScript库构建的,使得在网页设计中实现树形下拉框变得简单高效。 在Bootstrap中,树形下拉框主要依赖于`bootstrap-treeview.js`这个JavaScript插件,它扩展了Bootstrap...

    bootstrap树形下拉框 下拉框树形菜单(修改版)

    在Bootstrap中,下拉框(Dropdown)是一种常见的交互元素,而"bootstrap树形下拉框 下拉框树形菜单(修改版)"则是将传统的下拉菜单与树形结构相结合,以提供更复杂的选项选择体验。 在Web开发中,有时我们需要在一...

    layui组件之树形下拉框

    "layui组件之树形下拉框"是Layui框架中的一个重要组件,用于在下拉菜单中展示层级结构的数据,常用于选择组织结构、地区分类等具有树状关系的场景。 ### layui组件简介 Layui是一个轻量级的前端框架,它包含了基础...

    c# 带树形显示的下拉框

    在这种情况下,“带树形显示的下拉框”是一种很好的解决方案,它将传统的下拉框与树形视图的功能相结合,允许用户以更直观的方式浏览和选择数据。下面我们将深入探讨这个主题。 1. **控件设计** - **自定义控件**...

    部门或人员下拉框树形

    "部门或人员下拉框树形"是一种常见的UI元素,它将传统的下拉框与树形结构相结合,以提供更直观、高效的筛选和选择体验。这个设计尤其适用于组织结构复杂、部门或人员众多的企业系统,用户可以通过展开和折叠节点来...

    layui-多选下拉框-xm-select-demo源码

    《layui-多选下拉框-xm-select:前端开发中的高效解决方案》 在现代Web开发中,用户界面的交互性和易用性是至关重要的。layui框架以其轻量级、高效和丰富的组件库,成为了众多开发者青睐的选择。尤其在构建多选...

    为dwz扩展树形下拉框

    标题“为dwz扩展树形下拉框”指的是在DWZ(Dynamic Web Zone)框架中对树形下拉框功能的扩展。DWZ是一个基于jQuery的前端开发框架,主要用于构建富交互式的Web应用。这个扩展可能涉及到在原有的DWZ组件基础上增加或...

    下拉框实现树结构带禁用.vue

    下拉框实现树结构带禁用.vue

    适用于bootstrap风格的easyUI树形下拉框

    下载之前请看好,不是所有都适用,只是树形下拉框的风格比较贴近bootstrap &lt;link rel="stylesheet" type="text/css" href="easyUI/css/easyui.css"&gt; &lt;link rel="stylesheet" type="text/css" href="easyUI/...

    结合ztree的下拉框树形结构数据多选,单选

    在这里,下拉框被扩展为一个树形结构,这意味着当用户点击下拉按钮时,会展示一个包含层级关系的数据列表。 "树形结构"则是指数据以节点和边的形式呈现,每个节点可以有子节点,形成一个嵌套的层次。zTree就是用来...

    在下拉框里面绑定树形显示

    在下拉框里面绑定树形显示 1、递归绑定 2、树形显示下拉框列表

    bootstrap-select 下拉框demo(含多种样式)

    bootstrap-select 下拉框demobootstrap-select 下拉框demobootstrap-select 下拉框demobootstrap-select 下拉框demobootstrap-select 下拉框demobootstrap-select 下拉框demobootstrap-select 下拉框demobootstrap-...

    bootstrap treeview可搜索下拉树形

    Bootstrap Treeview是一款基于jQuery和Bootstrap库的插件,它提供了美观且功能丰富的树形视图。这个特定的压缩包文件包含了一个实现可搜索下拉树形功能的示例,这在许多Web应用中非常有用,比如用于导航菜单、组织...

    javascript经典特效---下拉框选择背景.rar

    《JavaScript经典特效——下拉框选择背景》 在网页设计中,交互性和用户体验至关重要,而JavaScript作为一种客户端脚本语言,为提升网页动态效果提供了无限可能。本文将详细讲解如何使用JavaScript实现一个经典的...

    树形下拉框样式

    在IT领域,"树形下拉框样式"是一种常见的用户界面元素,主要用于数据组织和导航。它结合了传统的下拉框功能与树形结构,使得用户可以方便地浏览和选择层级关系的数据。这种设计通常应用于文件系统、组织结构或者分类...

Global site tag (gtag.js) - Google Analytics