2013-08-27 41 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(); 
相關問題