2016-09-29 18 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)))])) 

これは、1つのアイテムが選択され、すぐに選択解除されると、短いフラッシュが発生することがあります。これを回避するには、サブクラスで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)] 
     ;; ... 
     )) 

clickable-headersが設定されている場合は、ヘッダーをクリックすると、まだcolumn-control-eventを生成します。

このソリューションでは、をstyleに使用していることに注意してください。 'singleについては、マウスイベントが傍受されても、リストボックスにクリック後に何かを選択させたいことがあります。

+0

リストボックスの項目をクリックすると、一度点滅する青色のハイライトが表示されます。ユーザーがアイテムをクリックしようとしたときにソフトウェアエラーが発生すると、混乱することがあります。私はその青いハイライトを隠そうとしています。 – Toat

+1

ありがとう、@ Toat。私は最初に気付かなかった。 2番目のオプション(編集中)はそれを避けるべきです。 – ohspite

+0

これは、@ohspiteで動作します。 '[スタイル '(シングルクリック可能なヘッダ)]'も第2のオプションで動作します。 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._ visible-items%29%29)、GUIでは何も変更されませんでした。 – Toat

+1

ああ、ユーザーがスクロールできるようにしたいのですか、またはウィンドウがテーブルを変更するのに十分な大きさであることを確認したいだけですか?あなたはまたウィンドウの高さを上げることもできるからです。 –

関連する問題