2017-09-14 268 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