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

swt tree demo with a text editor

 
阅读更多
项目需要,从XML中读取数据生成一个Tree,然后可以对叶子节点的值(属性不可以)进行编辑,并最后保存。

/**
 * chega
 * 2012-12-17下午2:11:42
 */
package com.java2s.www;

import java.io.File;
import java.io.IOException;

import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class E10FieldTree
{

	public static void main(String[] args) throws JDOMException, IOException
	{
		final Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout(new GridLayout(1, false));
		final E10FieldTree e10 = new E10FieldTree(shell);

		Composite btnComp = new Composite(shell, SWT.NONE);
		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
		btnComp.setLayoutData(gridData);
		// btnComp.setBackground(display.getSystemColor(SWT.COLOR_RED));
		FormLayout layout = new FormLayout();
		btnComp.setLayout(layout);
		Button btn = new Button(btnComp, SWT.PUSH);
		FormData data = new FormData();
		data.top = new FormAttachment(0, 0);
		data.right = new FormAttachment(100, -40);
		data.bottom = new FormAttachment(100);
		btn.setText("Save");
		btn.setLayoutData(data);

		btn.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(SelectionEvent selectionevent)
			{
				try
				{
					e10.saveXML();
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}

		});
		shell.setSize(new Point(600, 500));
		shell.setVisible(true);
		while (!shell.isDisposed())
		{
			if (!display.readAndDispatch())
			{
				display.sleep();
			}
		}
		display.dispose();
	}

	public void saveXML() throws IOException
	{
		XMLOutputter outputter = new XMLOutputter();
		Format format = Format.getPrettyFormat();
		// jdom在输出到不同的目的地时,中文可能会产生乱码。输出到文件用FileOutputStream而不能用FileWriter,输出到控制台要用PrintWriter而不能直接用System.out(见网上讨论)
		// 还可以强制设定输出编码,这样就不用考虑中文编码问题了
		format.setEncoding("utf-8");
		outputter.output(this.document, System.out);
	}

	private Shell		parent;
	private TreeViewer	treeViewer;
	private Text		text;
	private TreeEditor	editor;
	private Document	document;
	private Document	copyDocument;
	private boolean		isEditing	= false;

	public E10FieldTree(Shell parent) throws JDOMException, IOException
	{
		this.parent = parent;
		this.init();
	}

	private void init() throws JDOMException, IOException
	{
		this.treeViewer = new TreeViewer(this.parent, SWT.SINGLE | SWT.FULL_SELECTION);
		GridData data = new GridData(GridData.FILL_BOTH);
		this.treeViewer.getTree().setLayoutData(data);
		this.treeViewer.getTree().setLinesVisible(true);
		this.treeViewer.getTree().setHeaderVisible(true);
		this.treeViewer.setAutoExpandLevel(1);
		TreeColumn column1 = new TreeColumn(this.treeViewer.getTree(), 0);
		column1.setText("Key");
		column1.setWidth(150);
		TreeColumn column2 = new TreeColumn(this.treeViewer.getTree(), 1);
		column2.setText("Value");
		column2.setWidth(250);
		document = new SAXBuilder().build(new File("Group_ITEM.xml"));
		this.copyDocument = (Document) this.document.clone();
		this.treeViewer.setContentProvider(new ITreeContentProvider() {

			@Override
			public void dispose()
			{
			}

			@Override
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
			{
			}

			@Override
			public Object[] getElements(Object inputElement)
			{
				if (inputElement == document)
				{
					return new Element[] { document.getRootElement() };
				}
				else
				{
					Element ele = (Element) inputElement;
					return ele.getChildren().toArray();
				}
			}

			@Override
			public Object[] getChildren(Object parentElement)
			{
				Element ele = (Element) parentElement;
				return ele.getChildren().toArray();
			}

			@Override
			public Object getParent(Object element)
			{
				Element ele = (Element) element;
				return ele.getParentElement();
			}

			@Override
			public boolean hasChildren(Object element)
			{
				return this.getChildren(element).length > 0;
			}

		});
		this.treeViewer.setLabelProvider(new ITableLabelProvider() {

			@Override
			public void addListener(ILabelProviderListener listener)
			{
			}

			@Override
			public void dispose()
			{
			}

			@Override
			public boolean isLabelProperty(Object element, String property)
			{
				return false;
			}

			@Override
			public void removeListener(ILabelProviderListener listener)
			{
			}

			@Override
			public Image getColumnImage(Object element, int columnIndex)
			{
				return null;
			}

			@Override
			public String getColumnText(Object element, int columnIndex)
			{
				Element ele = (Element) element;
				if (columnIndex == 0)
				{
					return ele.getName();
				}
				if (columnIndex == 1)
				{
					if (!((ITreeContentProvider) treeViewer.getContentProvider()).hasChildren(element))
					{
						return ele.getValue();
					}
				}
				return null;
			}
		});
		this.treeViewer.setInput(document);
		this.treeViewer.expandAll();

		editor = new TreeEditor(this.treeViewer.getTree());
		editor.grabHorizontal = true;
		editor.grabVertical = true;
		text = new Text(this.treeViewer.getTree(), SWT.SINGLE | SWT.BORDER);
		text.setVisible(false);

		final FocusListener focusListener = new FocusAdapter() {

			@Override
			public void focusGained(FocusEvent focusevent)
			{
				beginEdit();
			}

			@Override
			public void focusLost(FocusEvent focusevent)
			{
				finishEdit();
			}
		};

		text.addFocusListener(focusListener);

		text.addKeyListener(new KeyAdapter() {

			@Override
			public void keyReleased(KeyEvent keyevent)
			{
				// 回车直接确认修改
				if (keyevent.character == SWT.CR)
				{
					finishEdit();
				}
				// ESC取消修改
				if (keyevent.character == SWT.ESC)
				{
					cancelEdit();
				}
			}

		});

		this.treeViewer.getTree().addMouseListener(new MouseAdapter() {

			@Override
			public void mouseDown(MouseEvent e)
			{
				TreeItem selectedItem = treeViewer.getTree().getItem(new Point(e.x, e.y));
				if (selectedItem == null)
				{
					return;
				}
				// 只有叶节点才允许修改
				if (selectedItem.getItemCount() == 0)
				{
					if (canEdit(e.x, 1))
					{
						editor.setEditor(text, selectedItem, 1);
						text.setText(selectedItem.getText(1));
						text.selectAll();
						text.forceFocus();
					}
				}
			}

		});
	}

	/**
	 * 开始修改
	 */
	protected void beginEdit()
	{
		this.isEditing = true;
		text.setText(editor.getItem().getText(1));
		text.selectAll();
		text.setVisible(true);
	}

	/**
	 * 提交修改(提交修改的时候同时修改Document对象)
	 */
	protected void finishEdit()
	{
		if(!this.isEditing){
			return ;
		}
		System.out.println("finishEdit");
		this.isEditing = false;
		editor.getItem().setText(1, text.getText().trim());
		((Element) editor.getItem().getData()).setText(text.getText().trim());
		text.setText("");
		text.setVisible(false);
	}

	/**
	 * 取消修改
	 */
	protected void cancelEdit()
	{
		this.isEditing = false;
		text.setText("");
		text.setVisible(false);
	}

	/**
	 * 判断x坐标是否在第columnIdx列内(起始列索引为0)
	 * 
	 * @param x
	 * @param columnIdx
	 * @return
	 */
	protected boolean canEdit(int x, int columnIdx)
	{
		if (columnIdx >= this.treeViewer.getTree().getColumnCount())
		{
			return false;
		}
		int leftWidth = 0;
		int rightWidth = 0;
		for (int i = 0; i < columnIdx; i++)
		{
			leftWidth += this.treeViewer.getTree().getColumn(i).getWidth();
		}
		rightWidth = leftWidth + this.treeViewer.getTree().getColumn(columnIdx).getWidth();
		return leftWidth <= x && x <= rightWidth;
	}

	/**
	 * 取得原始的Document
	 * 
	 * @return
	 */
	public Document getOriginalDocument()
	{
		return this.copyDocument;
	}

	public Document getDocumentInUse()
	{
		return this.document;
	}
}




XML文件是我们项目中的文件,就不提供了,随便一个XML都可以拿来测试。
分享到:
评论

相关推荐

    swt tree学习文档

    ### SWT Tree 学习文档知识点总结 #### 一、SWT Tree 概念与应用场景 SWT (Standard Widget Toolkit) 是一种用于构建图形用户界面(GUI)的应用程序框架,广泛应用于Java开发环境中。SWT提供了丰富的组件库,使得...

    SWT_demo.zip_DEMO_SWT_SWT_demo_swt demo

    本示例"SWT_demo.zip_DEMO_SWT_SWT_demo_swt demo"提供了多种SWT控件的演示,旨在帮助开发者理解和应用这些组件。 在描述中提到的几个关键知识点包括: 1. **按钮(Buttons)**:SWT提供不同类型的按钮,如普通...

    SWT Tree 完整的树例子源码

    **SWT Tree 全面解析** SWT(Standard Widget Toolkit)是Java中用于构建桌面应用程序的一个开源GUI库,它是Eclipse开发平台的基础。在SWT中,Tree组件用于展示层次结构的数据,类似于Windows资源管理器中的文件...

    swt Tree 例子项目代码

    在这个名为“swt Tree 例子项目代码”的工程中,我们主要关注的是如何使用`org.eclipse.swt.widgets.Tree`类来创建和管理树形结构的数据展示。 `Tree`是SWT中的一个关键组件,用于构建类似于Windows资源管理器或...

    SWT开发组件demo

    本包“SWT开发组件demo”聚焦于SWT组件的使用,通过示例代码和详细说明,帮助开发者更好地理解和应用这些组件。 1. **基础组件**:SWT的基础组件包括按钮(Button)、文本框(Text)、单选按钮(RadioButton)、复...

    swt创建tree的例子

    SWT(Standard Widget Toolkit)是Eclipse项目提供的一种用于创建Java图形用户界面(GUI)的开源库,它提供了丰富的控件和组件,包括我们这里关注的Tree组件。Tree组件在GUI应用中通常用来展示层级结构的数据,比如...

    swt-demo.zip

    这个名为"swt-demo.zip"的压缩包包含了一个基于SWT实现的图片列表预览应用,它展示了如何利用SWT库来创建功能丰富的图像浏览界面。以下是关于SWT和这个特定示例应用的一些详细知识点: 1. SWT简介:SWT是Sun ...

    SWT调用OCX组件DEMO

    1. **SWT的使用**:SWT提供了一系列与操作系统窗口系统直接交互的类和接口,如Button、Text、Shell等,使得开发者能够创建出与本机操作系统一致的用户界面。在SWT中,每个控件都有对应的Java对象,通过这些对象可以...

    使用SWT+WinBuilder制作的JavaDemo程序

    通过学习研究,发现参照 Eclipse 自带的 ControlExample SWT 示例程序,并结合 WinBuilder可以很好的进行可视化开发出完全满足我要求的JavaDemo程序,方便演示效果和进行扩展,特共享出来。

    SWT控件知识学习笔记

    ### SWT控件知识学习笔记 #### 一、SWT/JFace常用组件介绍 SWT (Standard Widget Toolkit) 是 Eclipse 平台的一个图形界面工具包,它提供了与平台无关的 GUI 组件,允许开发者构建高性能的应用程序。SWT/JFace ...

    SWT 各种小示例集中

    1. **基础控件**:SWT提供了一系列的基础控件,如按钮(Button)、文本框(Text)、列表(List)、组合框(Combo)、树(Tree)、表格(Table)等。每个控件都有相应的事件监听和方法,例如按钮的点击事件、文本框的文本更改事件...

    jquery swt demo 弹窗

    "jQuery SWT demo 弹窗"这个主题聚焦于如何利用jQuery来实现窗口或对话框的效果,通常这种效果在医疗和教育领域有广泛应用,比如展示警告信息、用户确认操作或者提供详细信息的浮窗。 jQuery的核心特性包括选择器、...

    SWT Browser浏览器小程序

    用SWT 组建实现一个简单的浏览器实例。具有搜索功能,

    SWT tableEditor删除后刷新

    TableEditor通常会绑定一个控件(如Text、Button等)到一个特定的TableItem和Column。当用户开始编辑时,这个控件会显示在对应的单元格内。在完成编辑后,通常我们会调用TableEditor的`dispose()`方法来移除编辑器,...

    java swt自定义控件

    Java SWT(Standard Widget Toolkit)是Java平台上用于创建桌面应用程序的一个库,它提供了丰富的用户界面元素,如按钮、文本框、列表等。SWT是Eclipse IDE的基础,它通过与操作系统直接交互来提供本地化的图形用户...

    tree的遍历

    在这个特定的例子中,我们关注的是“tree的遍历”,并通过Delphi编程语言来实现。Delphi是一款强大的面向对象的 Pascal 编程工具,以其高效的编译器和丰富的类库而闻名,非常适合开发桌面应用程序。 树的遍历主要...

    SWT表格管理类(包括表头排序,隔行颜色,表格宽度自适应)

    SWT表格管理类,包括表头排序事件,table宽度自适应事件,隔行颜色事件

    SWT Table单元格编辑功能

    Text text = (Text) editor.getEditor(); editor.getItem().setText(EDITABLECOLUMN, text.getText()); } }); newEditor.selectAll(); newEditor.setFocus(); editor.setEditor(newEditor, item, ...

    org.eclipse.swt.win32

    org.eclipse.swt.custom.TableTree.class org.eclipse.swt.custom.TableTreeEditor.class org.eclipse.swt.custom.TableTreeItem.class org.eclipse.swt.custom.TextChangeListener.class org.eclipse.swt.custom....

Global site tag (gtag.js) - Google Analytics