2017-09-14 91 views
1

我使用下面的代碼爲一個小的GUI程序:GUI組件佈局/方案

#lang racket/gui 

(define ff (new frame% 
       [label "Adjust widths"] 
       [height 100] 
       [width 300])) 
(new message% [parent ff][label "testing"]) 
(new text-field% [parent ff][label "tf1"]) 
(new text-field% [parent ff][label "tf2- a long prompt"]) 
(new text-field% [parent ff][label "tf3    "]) 
(new text-field% [parent ff][label "tf4    "]) 
(send ff show #t) 

但是,我沒能獲得所需的佈局: enter image description here

我怎樣才能得到上述佈局。我看到text-field和其他組件具有最小寬度和可拉伸寬度。如果這些是默認的,哪些是實際的,那我不清楚。如何修復text-field的寬度?我應該使用table-panel包嗎?謝謝你的幫助。

編輯:我檢查了https://docs.racket-lang.org/gui/windowing-overview.html?q=gui並嘗試了不同的選項,例如[min-width 50][stretchable width #f],但顯然不可能將文本字段的大小固定爲特定值。

回答

1

一種可能性是首先將標籤設置爲最大寬度,然後將其更改爲所需的標籤。這至少對我有用。

#lang racket/gui 

(define ff (new frame% 
       [label "Adjust widths"] 
       [height 100] 
       [width 300])) 
(new message% [parent ff][label "testing"]) 
(define strings 
    '("tf1" "tf2- a long prompt" "tf3" "tf4")) 
(define str-max (argmax string-length strings)) 
(define txt-fields 
    (for/list ([str (in-list strings)]) 
    (new text-field% [parent ff] [label str-max]))) 

(for ([tf (in-list txt-fields)] 
     [str (in-list strings)]) 
    (send tf set-label str)) 

(send ff show #t) 

enter image description here

由於字體可能沒有一個固定的寬度,你可能希望使用下劃線最大長度的字符串。

另一種可能是通過傳遞#f作爲參數來刪除文本字段的標籤,並使您自己使用message%,您可以通過其實際控制寬度min-width。您可能需要將郵件和文本字段放入horizontal-panel%

+0

很好的2種方法來解決這個問題。 – rnso