2013-08-27 44 views
1

我已经创建了一个自定义小部件 - 一个由多个按钮,标签,图像以及可能需要添加的其他小部件组成的SWT组。我想将此自定义小部件作为树项目,以便我可以获取树的缩进和展开/折叠功能。如何将自定义小部件与SWT中的TreeItem关联?

这里是一个形象,显示了我想实现:

enter image description here

我创造了这个例子用谷歌Web Toolkit和我想用SWT来实现它。

SWT TreeItem具有设置文本和图像的方法,但我找不到使树项目成为自定义小部件的方法。如果无法将自定义小部件与SWT树项目相关联,则有关使用缩进和展开/折叠功能在树中组织自定义小部件的其他方法的建议也会非常有用。谢谢!

+0

看一看JFace的'TreeViewer'代替。 – Baz

+1

@Baz谢谢你的建议,巴兹。我看了一下JFace的'TreeViewer',但根据我的理解,对定制树项目的支持仍然非常有限。一个'LabelProvider'可以用来设置树形浏览器中包含的每个项目的图像和文本,但是我找不到像“上面的图片”那样的“更好的”项目。我发现'TreeViewer'教程和代码片段都具有非常简单的树项目,只有一个图像和一个文本标签...' – Stef

+0

'TreeViewer'与TableViewer非常相似,因此您可能想尝试类似[这](http://www.subshel​​l.com/en/subshel​​l/blog/Eclipse-RCP-Comboboxes-inside-a-JFace-TableViewer100.html),而是一个'TreeViewer'。我现在没有时间去测试它... – Baz

回答

1

Eclipse Nebula项目的PGroup窗口小部件完成这项工作。它可以让你附上SWT复合材料并支持折叠和扩展。可以通过对PGroup的内容和布局数据(例如GridData)使用布局(例如,GridLayout)来指定组件内部组件的缩进来实现缩进。

ExpandBar(这是一个标准SWT widget)也似乎是一个可能的解决方案,但我没有尝试过。

0

这似乎是可以使用的事件SWT.PaintItem添加自定义绘制:

https://www.eclipse.org/articles/Article-CustomDrawingTableAndTreeItems/customDraw.htm

来源: Embed custom widget in SWT Tree or Table

1 Display display = new Display(); 
2 Shell shell = new Shell(display); 
3 shell.setBounds(10, 10, 350, 200); 
4 Image xImage = new Image (display, 16, 16); 
5 GC gc = new GC(xImage); 
6 gc.setForeground(display.getSystemColor(SWT.COLOR_RED)); 
7 gc.drawLine(1, 1, 14, 14); 
8 gc.drawLine(1, 14, 14, 1); 
9 gc.drawOval(2, 2, 11, 11); 
10 gc.dispose(); 
11 final int IMAGE_MARGIN = 2; 
12 final Tree tree = new Tree(shell, SWT.CHECK); 
13 tree.setBounds(10, 10, 300, 150); 
14 TreeItem item = new TreeItem(tree, SWT.NONE); 
15 item.setText("root item"); 
16 for (int i = 0; i < 4; i++) { 
17  TreeItem newItem = new TreeItem(item, SWT.NONE); 
18  newItem.setText("descendent " + i); 
19  if (i % 2 == 0) newItem.setData(xImage); 
20  item.setExpanded(true); 
21  item = newItem; 
22 } 
23 tree.addListener(SWT.MeasureItem, new Listener() { 
24  public void handleEvent(Event event) { 
25  TreeItem item = (TreeItem)event.item; 
26  Image trailingImage = (Image)item.getData(); 
27  if (trailingImage != null) { 
28   event.width += trailingImage.getBounds().width + IMAGE_MARGIN; 
29  } 
30  } 
31 }); 
32 tree.addListener(SWT.PaintItem, new Listener() { 
33  public void handleEvent(Event event) { 
34  TreeItem item = (TreeItem)event.item; 
35  Image trailingImage = (Image)item.getData(); 
36  if (trailingImage != null) { 
37   int x = event.x + event.width + IMAGE_MARGIN; 
38   int itemHeight = tree.getItemHeight(); 
39   int imageHeight = trailingImage.getBounds().height; 
40   int y = event.y + (itemHeight - imageHeight)/2; 
41   event.gc.drawImage(trailingImage, x, y); 
42  } 
43  } 
44 }); 
45 shell.open(); 
46 while (!shell.isDisposed()) { 
47  if (!display.readAndDispatch()) display.sleep(); 
48 } 
49 xImage.dispose(); 
50 display.dispose(); 
相关问题