簡體   English   中英

SWT Tree和TreeItem:刪除或更改展開/折疊指示器的繪圖行為

[英]SWT Tree and TreeItem: Remove or change the drawing behavior of the expand/collapse indicator

我在SWT(沒有JFace)工作,我正在嘗試自定義我正在使用側邊欄的樹的行為。

樹中的頂級項目不應該是可選擇的; 他們基本上是標題。 只能選擇這些項目的子項。 因此,我希望UI的行為能夠表明這一點; 點擊其中一個頂級項目應該展開或折疊,但不應在指標之外提供任何類型的視覺反饋,以改變其狀態和孩子的可見性變化。

問題似乎是在OS X上,展開/折疊指示器是一個三角形(不知道它是圖像還是unicode字符),它指向右或向下,但也基於“選擇”狀態着色。 我已設法覆蓋頂級項目的所有相關行為,但箭頭更改顏色除外。

  • 我使用了一個SWT.EraseItem監聽器來掛鈎背景圖,這樣背景就不會改變顏色。 這按預期工作。
  • 我使用了SWT.PaintItem監聽器來確保頂級項目中的文本不會改變顏色。 這符合預期,但似乎對指標沒有任何影響; 我甚至嘗試過重置GC的前景色,但指示燈的顏色仍然會改變:

未選中

未選中的

選擇和丑陋

我試圖做的一些事情,都失敗了:

  • 只需在指標頂部繪制一個矩形。 無論我將PaintListener附加到什么位置,指標似乎始終位於頂部。

  • 在Selection事件類型上使用Listener,檢查event.item是否是頂級項之一,然后擺弄事件位和重繪標志。 這似乎根本不起作用; 這種行為完全不可預測。 代碼看起來像這樣:

     sideBar.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { TreeItem eventItem = (TreeItem) event.item; if(sideBarRoots.contains(event.item)) { event.detail = 0; event.type = 0; event.doit = false; sideBar.setRedraw(false); } else { sideBar.setRedraw(true); event.type = SWT.Selection; event.doit = true; } } }); 

    由於重繪標志只是一個提示,有時它被正確設置而其他人則沒有。 它可以沒有效果,也可以鎖定到側邊欄中沒有重繪的狀態。

我知道很多這種行為高度耦合到底層本機小部件的行為,但我想知道是否有任何方法可以獲得我正在尋找的行為而無需從頭開始自定義小部件?

我認為在你的情況下,理想情況下你不應該允許在樹頭上進行選擇。

您可以取消選擇事件,不允許它被點擊。 但這可能是一個小小的kludgy實現,特別是對於鍵導航。

如果可能的話,更安全的方法是在選擇樹父節點時移動選擇。 所以它應該像這樣工作,如果通過鍵盤或鼠標選擇父節點:您展開節點並將選擇移動到第一個子節點。

這樣你就可以避免所有的繪畫技巧來隱藏選擇狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM