我喜欢在GUI中生成一个没有选择功能的表格。我尝试改变选择和样式,但选择功能仍然如截图所示。
(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],则无法再调整列宽,并隐藏列中较长的文本。有没有办法禁用选择功能而不在文本后显示“...”,这意味着显示列中的全文。
答案 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
。
在此解决方案中,请注意'multiple
中style
的使用情况;有一些关于'single
的东西使得列表框想要在点击后选择一些东西,即使拦截鼠标事件也是如此。