如何禁用列表框的选择功能

时间:2016-09-29 06:37:03

标签: user-interface listbox racket selection

我喜欢在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) 

如果我使用[enabled #f],则无法再调整列宽,并隐藏列中较长的文本。有没有办法禁用选择功能而不在文本后显示“...”,这意味着显示列中的全文。

enter image description here

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

在此解决方案中,请注意'multiplestyle的使用情况;有一些关于'single的东西使得列表框想要在点击后选择一些东西,即使拦截鼠标事件也是如此。