`
yianpuodiaotu
  • 浏览: 241548 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Tree Check 带复选框的树

阅读更多

 

在SWT/JFace中,带复选框树最好使用ContainerCheckedTreeViewer(或者CheckedTreeViewer)来实现,今天遇到直接使用tree来实现的。

简单备记:

import java.awt.image.BufferedImage;
import java.io.File;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.filechooser.FileSystemView;
import javax.swing.plaf.IconUIResource;

import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.internal.UIPlugin;
/**
 * <p>
 * Title: MultiDirectoryDialog.java
 * </p>
 * <p>
 * Description: 文件选择框,支持多选
 * </p>
 * 
  */
public class MultiDirectoryDialog extends Dialog {

	// 菜单提示
	private String message = "";
	private Shell parent;
	// 列表树
	private Tree tree;
	// 用来获取系统文件的相关信息
	private FileSystemView fsv;

	// 用来存放选择的文件夹,用分号隔开
	private StringBuilder resultFile = new StringBuilder("");

	/**
	 * 构造方法
	 * 
	 * @param parent
	 *            父类
	 */
	public MultiDirectoryDialog(Shell parent) {
		super(parent);
		this.parent = parent;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets
	 * .Composite)
	 */
	protected Control createDialogArea(Composite parent) {

		parent.setDragDetect(false);
		Composite container = (Composite) super.createDialogArea(parent);
		container.setLayout(new FormLayout());

		final Label showTipLabel = new Label(container, SWT.NONE | SWT.MULTI);
		showTipLabel.setText(message);
		final FormData fd_showTipLabel = new FormData();
		fd_showTipLabel.top = new FormAttachment(0, 15);
		fd_showTipLabel.bottom = new FormAttachment(0, 32);
		fd_showTipLabel.right = new FormAttachment(0, 170);
		fd_showTipLabel.left = new FormAttachment(0, 30);
		showTipLabel.setLayoutData(fd_showTipLabel);

		final Composite treeComposite = new Composite(container, SWT.BORDER);
		treeComposite.setDragDetect(false);
		treeComposite.setLayout(new FormLayout());
		// treeComposite.set
		// scrolledComposite.setAlwaysShowScrollBars(true);
		final FormData fd_scrolledComposite = new FormData();
		fd_scrolledComposite.right = new FormAttachment(100, 0);
		fd_scrolledComposite.left = new FormAttachment(0, 0);
		fd_scrolledComposite.bottom = new FormAttachment(100, 0);
		fd_scrolledComposite.top = new FormAttachment(0, 50);
		treeComposite.setLayoutData(fd_scrolledComposite);
		// 新建树
		tree = new Tree(treeComposite, SWT.DEFAULT);
		final FormData fd_tree = new FormData();
		fd_tree.left = new FormAttachment(0, 5);
		fd_tree.bottom = new FormAttachment(0, 300);
		fd_tree.top = new FormAttachment(0, 0);
		fd_tree.right = new FormAttachment(0, 400);
		tree.setLayoutData(fd_tree);
		treeComposite.setData(tree);

		// 为树增加单击方法
		tree.addListener(SWT.Expand, new Listener() {
			public void handleEvent(final Event event) {
				final TreeItem item = (TreeItem) event.item;
				TreeItem[] items = item.getItems();
				for (int i = 0; i < items.length; i++) {
					if (items[i].getData() != null)
						return;
					items[i].dispose();
				}

				// 初始化该文件下的节点
				File file = (File) item.getData();
				File[] childFile = file.listFiles();
				for (File sfile : childFile) {
					if (sfile.isDirectory()) {
						initFile(item, sfile);
					}
				}

			}

		});

		// 获取系统文件信息
		fsv = FileSystemView.getFileSystemView();
		File[] file = fsv.getRoots();

		TreeItem item = new TreeItem(this.tree, SWT.NONE);
		String fileName = file[0].getName();
		item.setText(fileName);
		item.setData(file[0]);
		Image img = getIcon(file[0]);
		if (img != null)
			item.setImage(img);
		// new TreeItem(item, 0);
		listFile(item, file[0], 1);
		return container;
	}

	/**
	 * 本类用来初始化文件夹下的文件夹
	 * 
	 * @param treeitem
	 *            父节点
	 * @param file
	 *            要初始化的文件夹
	 * @param flag
	 *            0:由外部调用,其它:递归调用
	 */
	private void listFile(TreeItem treeitem, File file, int flag) {
		File[] childFile = file.listFiles();
		if (flag == 0) {// 如果是外部调用,则再初始一级,以用来显示图标前的十一号。
			for (File sfile : childFile) {
				if (sfile.isDirectory()) {
					// 初始化item的相关数据
					TreeItem item = initFile(treeitem, sfile);
					// 初始化下一级item
					listFile(item, sfile, 1);// 只多这一行
				}
			}

		} else {// 如果是自身调用,则说明已经为第二级文件夹,不需要再初始化下一级
			for (File sfile : childFile) {
				if (sfile.isDirectory()) {
					initFile(treeitem, sfile);
				}
			}
		}
	}

	/**
	 * 初始化item的相关数据
	 * 
	 * @param treeitem
	 *            要初始化item的父item
	 * @param file
	 *            初始化item对应的file
	 * @return 初始化后的item
	 */
	private TreeItem initFile(TreeItem treeitem, File file) {

		TreeItem item = new TreeItem(treeitem, SWT.NONE);
		item.setText(fsv.getSystemDisplayName(file));

		item.setData(file);
		Image img = getIcon(file);
		if (img != null)
			item.setImage(img);
		// 如果还是文件夹,则加一个空节点,以使十号显示出来
		if (file.isDirectory())
			new TreeItem(item, 0);
		return item;
	}

	/**
	 * 获取文件图标
	 * 
	 * @param file
	 *            要获取图标的文件
	 * @return 图标
	 */
	public Image getIcon(File file) {
		ImageData imageData = null;
		// 取得awt的icon对像并转化为swt的image对像
		Icon icon = fsv.getSystemIcon(file);
		if (icon instanceof IconUIResource) {
		} else {
			// BufferedImage bi = ImageConvertor.getBufferedImage((ImageIcon)
			// icon);
			// imageData = ImageConvertor.getImageData(bi);
			// imageData = new Image(Display.getDefault(),50,50).getImageData();
		}
		Image img = null;

		if (imageData != null)
			img = new Image(parent.getDisplay(), imageData);

		return img;
	}

	/**
	 * Create contents of the button bar
	 * 
	 * @param parent
	 */
	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		createButton(parent, IDialogConstants.OK_ID, "确定", true);
		createButton(parent, IDialogConstants.CANCEL_ID, "取消", false);
	}

	/**
	  SWT.MULTI创建出可以让用户作出多重选取的tree。SWT.CHECK样式的Tree会产生checkbox的Tree。如果使用了SWT.CHECK的样式,就需要判断哪些项目被选取了。通过调用TreeItem的getChecked()来判断某个项目是否被checked。下面的程序在循环中判断每个TreeItem的状态:
		TreeItem[] tia=t.getItems();
		  for(int i=0;i<tia.length;i++){
		   if(tia[i].getChecked()){
		    System.out.print("Checked");
		   }
		  TreeItem []child=tia[i].getItems();
		  for(int n=0;n<child.length;n++)
		   if(child[n].getChecked())
		    System.out.print("Checked");
		    }
		
		以上的代码只能用在仅有一层子项目的tree上。多层的tree需要循环运算来处理。
		
		SWT.CHECK样式的Tree对象在你需要让用户对Tree作出多重选取但又不想要SWT.MULTI模式的额外成本的时候是合适的(但若是要使用选取出的TreeItem来采取某些像是产生list内容这样的动作时则不适用)
	 */
	protected void buttonPressed(int buttonId) {
		if (buttonId == IDialogConstants.OK_ID) {

			TreeItem[] treeitem = tree.getItems();
			for (int i = 0; i < treeitem.length; i++) {
				if (treeitem[i].getChecked()) {
					if (treeitem[i].getChecked()) {
						File file = (File) treeitem[i].getData();
						resultFile.append(file.getPath()).append(";");
					}
				}
				TreeItem[] child = treeitem[i].getItems();
				for (int n = 0; n < child.length; n++)
					if (child[n].getChecked()) {
						File file = (File) child[n].getData();
						resultFile.append(file.getPath()).append(";");
					}
			}
			System.out.println(resultFile.toString());
		}
		super.buttonPressed(buttonId);
	}

	/**
	 * 设置 message
	 * 
	 * @return
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * 获取message
	 * 
	 * @param message
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * @return
	 */
	public StringBuilder getResultFile() {
		return resultFile;
	}

	/**
	 * @param resultFile
	 */
	public void setResultFile(StringBuilder resultFile) {
		this.resultFile = resultFile;
	}

	public static void main(String[] args) {
		final Display display = Display.getDefault();
		final Shell shell = new Shell(display, SWT.ON_TOP | SWT.CLOSE);
		shell.setSize(327, 253);
		Dialog dialog = new MultiDirectoryDialog(shell);
		if (dialog.open() == IDialogConstants.OK_ID) {// 是否单击“确定”按钮
			System.out.println("helo");
		}

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();

	}
}
分享到:
评论
1 楼 樊明涛 2011-07-28  
这篇文章不错  解决了我的燃眉之急啊 [color=darkred][/color]

相关推荐

    Flex实现带复选框的列表树

    在Flex开发中,创建一个带有复选框的列表树是一种常见的需求,这通常用于实现用户对多级数据的筛选和选择。"Flex实现带复选框的列表树"这一主题涵盖了Flex编程、UI组件设计以及事件处理等多个方面的知识点。下面我们...

    jQuery高性能带复选框的树形结构插件

    **jQuery高性能带复选框的树形结构插件——highchecktree** 在Web开发中,树形结构常常用于展示层级关系的数据,例如组织结构、文件系统等。`highchecktree`是一个专门针对这种情况设计的jQuery插件,它能高效地...

    基于layui模块制作的一款带复选框的tree结构树拓展包(带复选框)

    "基于layui模块制作的一款带复选框的tree结构树拓展包(带复选框)"是指layui框架的一个扩展组件,它将传统的tree结构与复选框相结合,实现了可勾选的树节点。在实际应用中,用户可以通过勾选不同级别的节点来选择...

    flex带复选框多选树三态树

    本文将详细探讨"flex带复选框多选树三态树"这一主题,它融合了Flex布局、复选框交互以及多选树结构的三态逻辑。 首先,"flex带复选框的树"是指在Flex布局中,每个树节点不仅包含文本信息,还包含一个复选框。复选框...

    【JavaScript源代码】element的el-tree多选树(复选框)父子节点关联不关联.docx

    在el-tree中,如果需要实现多选(复选框)功能,我们可以利用`show-checkbox`属性来开启复选框。在处理父子节点之间的关联性时,`check-strictly`属性扮演着关键角色。 `check-strictly`属性决定了父子节点之间是否...

    树形复选框(Checkbox)

    在提供的`checktree`文件中,可能包含了HTML、CSS和JavaScript代码,通过这些代码我们可以深入了解如何实现这样一个树形复选框组件。对于开发者而言,理解并掌握这一技术可以帮助他们在项目中创建出更加直观、易用的...

    带有复选框的JS树状菜单

    "带有复选框的JS树状菜单"是一个常见的需求,它允许用户通过视觉层次结构来组织和选择数据。这种类型的菜单常用于文件管理器、设置面板或权限配置等场景。下面将详细介绍这个主题涉及的关键知识点。 首先,我们需要...

    用delphi7.0 做的带复选框树,是一个完整源码可直接复用

    压缩包中的“checktree最好的递归树”可能是指实现复选框树的一种优化方法,即使用递归算法来处理节点间的依赖关系。递归是一种强大的编程技术,适用于处理树形结构数据。在处理复选框树时,递归可以帮助我们高效地...

    vue实现带复选框的树形菜单

    在Vue.js框架中实现带复选框的树形菜单是一种常见的UI设计,通常用于显示层次结构的数据,并允许用户进行多级选择。这个例子展示了如何结合第三方库ZTree来创建这样一个功能。ZTree是一个基于JavaScript的树状菜单...

    js树状地区三级级联带复选框

    在JavaScript编程领域,"js树状地区三级级联带复选框"是一个常见的需求,尤其在构建具有地域选择功能的Web应用时。这个功能允许用户通过一个层级结构来选择国家、省份和城市,同时提供了复选框以支持多选。在本篇中...

    两款带复选框的树形结构

    在IT行业中,尤其是在...总的来说,`jQuery.tree`和`jQuery.treeview`为开发者提供了方便的工具,以创建带有复选框的树形结构,提升用户体验。正确地集成和使用这些插件,可以在多种场景下实现高效的数据管理和操作。

    checkTree:复选框树

    复选框树 * &lt;一级标签&gt;&lt;input data-id="{'fid':0}"/&gt; &lt;二级标签&gt;&lt;\input data-id="{'fid':0,'sid',2}"/&gt; &lt;三级标签&gt;&lt;\input data-id="{'fid':0,'sid',2,'tid':3}"/&gt;&lt;/三级标签&gt; &lt;三...

    dtree用法带右键菜单,带复选框

    本文将详细介绍如何使用 dtree 来实现带有右键菜单和复选框功能的树形结构。 #### 二、dtree基本用法 为了更好地理解 dtree 的工作原理,我们首先通过官方示例来了解其基础配置和用法: 1. **引入 CSS 和 ...

    EXT TREE 扩展CHECKBOX JS

    EXT TREE扩展CHECKBOX JS是一种在EXT JS框架下对树形组件(Tree Panel)进行增强,实现复选框功能的技术。EXT JS是一个强大的JavaScript GUI库,它提供了丰富的组件和功能,用于构建复杂的Web应用程序。在EXT JS中,...

    Ext checktree

    1. **基本结构**:Ext checktree是Ext JS中的TreePanel的一个变体,它扩展了基本的树形视图,添加了复选框功能。每个节点都可以有一个复选框,用户可以通过勾选或取消勾选来选择或取消选择节点。 2. **配置选项**:...

    纯JS+HTML写的checkBox Tree 级联选中 好用无BUG

    在前端开发中,CheckBox Tree(复选框树)是一种常见的组件,用于展示具有层级关系的数据,并支持用户进行多级选择。这个"纯JS+HTML写的checkBox Tree 级联选中"实例,解决了其他示例中可能存在的BUG,提供了一个...

    jquery checktree

    总结起来,jQuery CheckTree是一个强大的工具,它为Web开发人员提供了一种简便的方式来创建交互式的树形结构复选框。无论是在后台管理系统、文件浏览器还是内容分类中,都能发挥重要作用。掌握这个插件的使用,无疑...

    jquery.checktree.rar

    每个节点通常会包含一个复选框(checkbox),用户可以通过点击复选框或者节点文本来选择或取消选择节点。 要实现默认选中项,你需要: 1. **遍历树结构**:获取所有节点,可以通过DOM遍历或者jQuery的选择器来实现...

Global site tag (gtag.js) - Google Analytics