2016-09-29 51 views
1

我喜歡在沒有選項的功能的GUI中生成表格。我嘗試改變選擇和風格,但選擇功能仍然保持如屏幕截圖所示。如何禁用列表框的選擇功能

The selection in blue highlight

(define list-box 
    (new list-box% [label #f] 
     [parent top-frame] 
     [choices '()] 
     [style '(extended column-headers)] 
     [columns (list "No." "Fruit" "Color")]  
     [stretchable-width #t] 
     [stretchable-height #t])) 
(send list-box set data) 

如果我使用的啓用#F],列寬度不能再調整和柱較長的文本是隱藏的。是否有某種方法可以在文本之後禁用選擇功能而不顯示「...」,這意味着在列中顯示全文。

enter image description here

回答

1

您可以設置一個回調函數只要它是明確的選擇:

(new list-box% 
    [parent top-frame] 
    [style '(single)] ; use 'single so at most one row is selected 
    ;; ... 
    [callback (lambda (list-box . _) 
       (define selection (send list-box get-selection)) 
       (when selection (send list-box select selection #f)))])) 

爲一個項目被選中並迅速取消此操作有時會導致在很短的閃光。爲了避免它,你可以在子類中從list-box%和攔截鼠標事件繼承:

(define unselectable-list-box% 
    (class list-box% 
    (super-new) 
    (define/override (on-subwindow-event window event) #t))) 

(define list-box 
    (new unselectable-list-box% 
     [parent top-frame] 
     [style '(multiple ; does NOT work with 'single 
       clickable-headers)] 
     ;; ... 
     )) 

頭部上的點擊仍然會產生column-control-event如果clickable-headers設置。

在此解決方案中,請注意在style中使用'multiple;有一些關於'single的信息,即使在鼠標事件被攔截時,列表框也希望在點擊後選擇某些內容。

+0

單擊列表框中的項目時,仍有藍色突出顯示閃爍一次。如果嘗試點擊該項目時出現軟件錯誤,用戶可能會感到困惑。我試圖隱藏那個藍色的亮點。 – Toat

+1

謝謝,@Toat。起初我沒有注意到。第二個選項(在編輯中)應該避免這種情況。 – ohspite

+0

它的工作原理是@ohspite。 '[style'(單擊可選標題)]'也適用於第二種選擇。當我們需要定義一個像unselectable-list-box%這樣的新類並且仍然不熟悉像define/override這樣的用法時,我總是感到困惑。非常感謝您的回答:) – Toat

1

您可以使用set-coumn-width來設置特定列的寬度,即使沒有啓用表。該方法還需要最小和最大寬度,這可以設置寬度大小的邊界,但只有在啓用列表時纔有意義。

此外,正如您注意到的,如果您禁用該列表,用戶將無法選擇一個項目。

所以,把它放在一起,你可以創建一個表,在這裏你可以設置寬度,以及這樣做防止用戶點擊它:

#lang racket/gui 

(define top-frame (new frame% 
         [label "Example"] 
         [width 500] 
         [height 500])) 

(define list-box 
    (new list-box% [label #f] 
     [parent top-frame] 
     [choices '()] 
     [style '(extended column-headers)] 
     [columns (list "No." "Fruit" "Color")] 
     [enabled #f] 
     [stretchable-width #t] 
     [stretchable-height #t])) 
(send list-box set '("1" "2" "3") '("4" "5" "6") '("7" "8" "9")) 
(send list-box set-column-width 0 10 10 10) 
(send list-box set-column-width 1 100 100 100) 
(send list-box set-column-width 2 50 50 50) 

(send top-frame show #t) 
+0

使用'[enabled #f]'也使**滾動條無效**,因爲它忽略了每次鼠標點擊。如果列表長度超過幀高度,則無法通過向下滾動來訪問列表的其餘部分。 – Toat

+0

我測試過[數量可見的項目](http://docs.racket-lang.org/gui/list-box_.html?q=set-column-width#%28meth._%28% 28%28lib._mred%2Fmain..rkt%29._list-box〜25%29._number-of-visible-items%29%29),但它並沒有改變GUI中的任何內容。 – Toat

+1

啊,你希望用戶能夠滾動,還是隻是想確保窗口足夠大來更改表格?因爲你也可以只是增加窗口的高度。 –