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

TreeItem实现Hyperlink的效果

 
阅读更多

在swt中,Hyperlink可以实现 '点击跳转' 的效果。例如,在PDE的MANIFEST.MF的 Activator 点击该标签可以跳转到对应的Activator的类。


org.eclipse.pde.internal.ui.editor.plugin.rows.ReferenceAttributeRow.createLabel(Composite, FormToolkit)

 

	protected void createLabel(Composite parent, FormToolkit toolkit) {
		if (!part.isEditable()) {
			super.createLabel(parent, toolkit);
			return;
		}

		Hyperlink link = toolkit.createHyperlink(parent, getPropertyLabel(), SWT.NULL);
		link.addHyperlinkListener(new HyperlinkAdapter() {
			public void linkActivated(HyperlinkEvent e) {
				if (!isReferenceModel()) {
					openReference(); // !!!Action
				} else {
					Display.getCurrent().beep();
				}
			}
		});
		PDETextHover.addHoverListenerToControl(fIC, link, this);
	}
 

 

如果需要在TreeItem上实现这样的效果需要怎么做呢?需要实现下面的UI显示:

1、 TreeItem的显示的Label需要有下划线

2、 文字颜色


在印象中,swt有一个paint的事件:SWT.Paint可以在发生paint事件,对元素UI进行重绘:

org.eclipse.swt.widgets.Control.addPaintListener(PaintListener)

 

public void addPaintListener (PaintListener listener) {
	checkWidget ();
	if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
	TypedListener typedListener = new TypedListener (listener);
	addListener (SWT.Paint,typedListener); //!!!
}

 

 但是TreeItem不是继承自Control。同时也没有重绘的事件发生。

Object

---Widget

------Item

---------TreeItem

 

在google后,找到了 http://www.iteye.com/topic/1113343 的文章,TreeItem可以通过Tree的SWT.PaintItem时来重绘。实现代码如下:

 

 

		// 1> 修改字体颜色
		this.tree.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
		
		tree.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				if (e.detail == SWT.CHECK) {
					TreeItem item = (TreeItem) e.item;
					handleChanged((EObject) item.getData(), item.getChecked());
				} else {
					// 3> 点击open
					openReference(e.item.getData());
				}
			}
		});
		
		/**
		 * 2> 加下划线
		 */
		tree.addListener(SWT.PaintItem, new Listener() {
			public void handleEvent(Event event) {
				TreeItem item = (TreeItem) event.item;

				Rectangle bounds = item.getBounds();
				int textHeight = bounds.height;
				int textWidth = bounds.width;
				
				// 默认paint已经绘制了Text
				//event.gc.drawText(item.getText(), bounds.x, bounds.y, true);

				int descent = event.gc.getFontMetrics().getDescent();
				int lineY = bounds.y + textHeight - descent + 1;
				event.gc.drawLine(bounds.x, lineY, bounds.x + textWidth, lineY);
			}
		});
  
http://www.iteye.com/topic/1113343 写道
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public class Snippet300 {
	private static int IMAGE_MARGIN = 2;
	private static Image xImage;
	private static Display display;

	public static void main(String[] args) {
		display = new Display();
		Shell shell = new Shell(display);
		shell.setBounds(10, 10, 350, 200);
		createImage();
		final Tree tree = new Tree(shell, SWT.CHECK);
		tree.setBounds(10, 10, 300, 150);
		TreeItem item = new TreeItem(tree, SWT.NONE);
		item.setImage(xImage);
		item.setText("root item");
		for (int i = 0; i < 4; i++) {
			TreeItem newItem = new TreeItem(item, SWT.NONE);
			newItem.setText("descendent " + i);
			// if (i % 2 == 0) {
			// newItem.setData(xImage);
			// }
			newItem.setImage(xImage);
			item.setExpanded(true);
			item = newItem;
		}
		treeAddListener(tree);

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

	private static void createImage() {
		xImage = new Image(display, 16, 16);
		GC gc = new GC(xImage);
		gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
		gc.drawLine(1, 1, 14, 14);
		gc.drawLine(1, 14, 14, 1);
		gc.drawOval(2, 2, 11, 11);
		gc.dispose();
	}

	private static void treeAddListener(final Tree tree) {
		Listener listener = new Listener() {
			public void handleEvent(Event event) {
				TreeItem item = (TreeItem) event.item;
				Image image = (Image) item.getImage();
				switch (event.type) {
				case SWT.MeasureItem: {
					if (image == null)
						break;
					event.width += 2 * (image.getBounds().width + IMAGE_MARGIN);
					break;
				}
				case SWT.EraseItem: {
					event.detail &= ~SWT.FOREGROUND;
					break;
				}
				case SWT.PaintItem: {
					if (image == null)
						break;
					int x, y;
					int itemH = tree.getItemHeight();
					int imageH = image.getBounds().height;
					int imageW = image.getBounds().width;

					// draw the 1 image
					x = event.x;
					y = event.y + (itemH - imageH) / 2;
					event.gc.drawImage(image, x, y);

					// draw the 2 image
					x += IMAGE_MARGIN + imageW;
					event.gc.drawImage(image, x, y);

					// draw the string
					String text = item.getText();
					x += IMAGE_MARGIN + imageW;
					y = event.y + 2;
					event.gc.drawText(text, x, y);

					// draw the 3 image
					x += event.width - imageW;
					y = event.y + (itemH - imageH) / 2;
					event.gc.drawImage(image, x, y);
					break;
				}
				}
			}
		};

		tree.addListener(SWT.MeasureItem, listener);
		tree.addListener(SWT.EraseItem, listener);
		tree.addListener(SWT.PaintItem, listener);
	}
}
 
  • 大小: 2.5 KB
  • 大小: 2 KB
分享到:
评论
1 楼 cutesunshineriver 2012-04-01  

相关推荐

    jstree javascript js tree treeitem j2ee java

    2. **CSS样式文件**:用于定义jstree的视觉样式,包括节点的外观、展开/折叠的动画效果等。 3. **示例或教程**:可能包含HTML文件和示例数据,帮助用户了解如何在自己的项目中使用jstree。 4. **文档**:可能包含...

    wpf实现DataGrid列表控件实现树形结构,并且展开控件ToggleButton可以放在任意一列,也可以冻住多列不可拖动

    2. **ToggleButton**: 要在任意列放置展开/折叠按钮,我们可以自定义一个DataGridTemplateColumn,将ToggleButton作为CellTemplate,并通过数据绑定来控制其IsChecked属性,以此来实现展开和折叠的效果。同时,可以...

    TREEITEM DOWNLOAD

    在IT行业中,树形控件(TREEITEM)是一种常见的用户界面元素,广泛应用于各种软件和应用程序中,用于展示层次结构的数据。"TREEITEM DOWNLOAD"这个标题暗示我们将探讨如何下载、安装以及使用与树形控件相关的资源,...

    gwt 中实现简单的树状菜单

    - 通常,我们会为每个TreeItem设置一个Widget(如Label、Hyperlink等)作为其显示内容,并在需要时添加事件监听器。 ```java TreeItem childItem = new TreeItem(new Label("子节点内容")); childItem....

    vue+ java 实现多级菜单递归效果

    TreeItem 组件包括了一个模板,用于显示树形结构的数据,并且可以递归调用自己来实现多级菜单递归效果。 五、CSS 样式 在本文中,我们使用 CSS 样式来美化我们的多级菜单递归效果。我们使用 CSS 样式来设置树形...

    WPF下的TreeTable实现示例

    在TreeView的每个项模板中,嵌入一个DataGrid,当点击TreeItem时,DataGrid会显示与该TreeItem关联的详细数据。 3. **数据绑定** WPF的强项在于数据绑定,TreeTable的实现同样依赖于数据绑定。你需要一个数据模型...

    QTreeView+自定义Model实现示例

    自定义`QAbstractItemModel`主要是为了实现数据的高效存储和检索,以及定制化的数据操作。以下是一些关键步骤和知识点: 1. **继承自定义Model**:首先,你需要创建一个类继承自`QAbstractItemModel`。这个类将实现...

    Android Recyclerview实现多级树形列表

    1. **数据模型**:定义一个数据类,例如`TreeItem`,包含数据字段如标题、子项列表以及表示当前状态的字段(是否展开)。这个类还需要提供方法来处理子项的添加、删除和展开/折叠操作。 2. **适配器**:创建一个`...

    c# 图片放大功能代码实现

    `TreeItem.cs`可能是用于树形结构的数据模型,而`album.sql`可能是数据库脚本,与图片放大功能的直接关系不大,但在实际项目中可能会用于存储和检索图片信息。 总结来说,C#实现图片放大功能的关键在于使用...

    《使用UITableView实现树视图》一文源代码

    然而,它不仅可以用来显示线性的数据结构,还可以通过巧妙的设计实现树形视图。本文将深入探讨如何利用UITableView来构建一个TreeView,以实现iPhone上的树状数据展示。 首先,我们需要理解UITableView的基本工作...

    QTreeView实现节点拖动.zip

    本示例"QTreeView实现节点拖动.zip"着重展示了如何扩展`QTreeView`的功能,使其支持节点的拖放操作,这在数据管理、分类或重组等场景中非常实用。下面我们将详细讨论如何实现这个功能。 首先,要实现节点拖放,我们...

    java树形控件实现代码

    对于JavaFX,对应的树形控件是TreeView,它同样使用TreeItem类作为节点,并提供了类似的功能,如事件监听、样式定制等。JavaFX的TreeView在图形效果和性能上可能优于Swing的JTree。 9. **实际应用示例** 在实际...

    swt...zhedie.rar_SWT_site:www.pudn.com_折叠菜单

    在SWT中,我们可以使用`Tree`和`TreeItem`类来创建这样的效果。 首先,我们需要导入必要的SWT库: ```java import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt....

    iOS下实现的树形列表结构

    在iOS开发中,构建树形列表结构是一种常见的需求,它能够有效地展示层级关系的数据,比如文件系统、组织架构等。本篇文章将详细讲解如何在...在实际项目中,还可以结合手势识别、动画效果等技术,提升用户的操作体验。

    AngularJS递归指令实现Tree View效果示例

    在AngularJS中,实现Tree View效果常常涉及到递归指令的使用。这主要因为树形结构数据需要能够自我包含和扩展,而递归指令恰好能够处理这种自引用的情况。本示例将详细介绍如何通过AngularJS创建一个可扩展和交互的...

    flex advancedDataGrid 中如何实现带checkbox的树

    这可以通过自定义一个ActionScript类来实现,比如`TreeItem`,其中包含`label`(节点文本)和`selected`(复选状态)等属性。 ```actionscript public class TreeItem { public var label:String; public var ...

    smartGwt 树(tree) 增删改

    本篇将深入探讨如何在SmartGWT中实现树(Tree)的增删改功能。 首先,了解SmartGWT中的树(Tree)组件。Tree是一种可视化控件,可以显示层次结构的数据,通常用于展示目录结构、组织结构等。SmartGWT的Tree继承自...

    Tree animation

    对于树动画,我们可能需要自定义`Node`和`TreeItem`,并通过调整它们的位置、大小、颜色等属性来实现动画。例如,当一个节点被选中时,我们可以让其逐渐放大或改变颜色,以吸引用户的注意力。 除了基本的动画技巧,...

    Java实现C#中的TreeView结构.zip

    每个节点(`TreeItem`)可以包含子节点,形成一个层次结构。我们需要定义一个数据模型来存储树的数据,并将其与`TreeView`绑定。 接下来,我们将讨论如何将这一实现集成到Struts2、Spring和Hibernate的环境中。...

Global site tag (gtag.js) - Google Analytics