2016-09-29 10 views
1

Мне нравится генерировать таблицу в графическом интерфейсе без функции выбор. Я попытался изменить выбор и стиль, но функция выбора по-прежнему остается такой, как показано на скриншоте.Как отключить функцию выбора списка-списка

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

ответ

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, которое заставляет окно списка хотеть что-то выбранное после щелчка, даже когда события мыши перехватываются.

+0

Мигает один раз, когда элемент в списке отображается. Пользователь может запутаться, если это ошибка программного обеспечения, когда они пытаются щелкнуть элемент. Я пытаюсь скрыть эту синюю подсветку. – Toat

+1

Спасибо, @Toat. Сначала я не заметил. Второй вариант (в редакции) должен избегать этого. – ohspite

+0

Работает, не смотря. '[style '(single clickable-headers)]' также работает во втором варианте. Я всегда смущаюсь, когда пришло время определить новый класс как unselectable-list-box% и до сих пор не знакомы с использованием, например define/override.Большое спасибо за ваш ответ :) – Toat

1

Вы можете использовать set-coumn-width установить ширину конкретного столбца, даже если таблица не включена. Метод также принимает ширину min и max, это устанавливает границы на большой или малой ширине, но имеет значение только в том случае, если список включен.

Кроме того, как вы заметили, если вы отключите список, пользователь также не сможет выбрать элемент.

Таким образом, чтобы поставить все это вместе, вы можете создать таблицу, в которой вы можете установить ширину, а также запретить пользователю нажав его, выполнив:

#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), но это ничего не изменило в графическом интерфейсе. – Toat

+1

А, вы хотите, чтобы пользователь мог прокручивать или просто хотите убедиться, что окно достаточно большое, чтобы изменить таблицу? Потому что вы также можете просто увеличить высоту окна. –