2016-04-27 80 views
0

我正在爲用戶輸入標題和博客然後提交它的球拍程序創建一個GUI。這是我對這些領域到目前爲止的代碼:如何對齊球拍GUI文本字段和按鈕

(define blogPost% 
    (class horizontal-panel% 
    (super-new) 
    (define titleoutput (new text-field% (label " title") 
          (min-height 20) 
          (min-width 200) 
          (vert-margin 20) 
          (horiz-margin 10) 
          (parent this))) 
    (define output (new text-field% (label "blog") 
         (style '(multiple)) 
         (min-height 20) 
         (vert-margin 20) 
         (min-width 400) 
         (parent this))) 
    (define (callback button event) 
     (define title-new-value (send titleoutput get-value)) 
     (define new-value (send output get-value)) 
     (save title-new-value new-value) 
     (send output set-value "") 
     (send titleoutput set-value "") 
     (send howisit show #t)) 
    (define button (new button% (label "Submit") 
         (vert-margin 0) 
         (horiz-margin 10) 
         (parent this) 
         (callback callback))) 
    )) 

它當前對準這樣的:

enter image description here

但我想標題文本框上面的博客領域,並提交按鈕居中置於底部。

+0

什麼是'save'和'howisit'?我收到未綁定的標識符錯誤。最少使虛擬實現像'(define(save title body)(printf「save〜v as:\ n〜v \ n」title body))'這樣可以作爲一個完整的例子編譯。 –

回答

2

我假設您以與your previous question相同的方式運行此代碼。在這方面,你用你的階級是這樣的:

(define f (new frame% [label "blog post GUI"] [min-width 400] [min-height 500])) 

(define tib (new blogPost% 
       [parent f])) 

(send f show #t) 

現在既然你定義blogPost%horizontal-panel%一個子類,它也繼承了所有的horizontal-panel%的初始化參數,包括alignment說法。所以,你可以通過[alignment '(left top)]初始化參數傳送給blogPost%類:

(define f (new frame% [label "blog post GUI"] [min-width 400] [min-height 500])) 

(define tib (new blogPost% 
       [parent f] 
       [alignment '(left top)])) 

(send f show #t) 

如果你想建立此默認爲您blogPost%類,你可以把它添加到(super-new)的形式:

(define blogPost% 
    (class horizontal-panel% 
    (super-new [alignment '(left top)]) 
    ...)) 

然而,如果你碰巧在其他地方有(new blogPost% ... [alignment '(left top)] ...),我相信這會破壞該代碼。

因此,爲了避免這種情況,很可能是最好使blogPost%類它自己的類,以便不用一個horizontal-panel%,那就一個horizontal-panel%,以同樣的方式,它已經有兩個文本字段和一個按鈕。如果你改變你傳遞給horizontal-panel%(這是在super-new隱含以前)的初始化參數使用blogPost%

這是因爲在此之後的變化是長期的更好,代碼不會打破。

(define blogPost% 
    (class object% ; object% instead of horizontal-panel% 
    ; This argument is explicit now. 
    ; If other code relies on other arguments, specify them here. 
    (init parent) 
    (super-new) 
    (define panel 
     (new horizontal-panel% ; this new call is explicit now 
      [parent parent] ; you can later add more arguments 
      [alignment '(left top)])) ; and it won't break things 
    (define titleoutput 
     (new text-field% 
      [label " title"] 
      [min-height 20] 
      [min-width 200] 
      [vert-margin 20] 
      [horiz-margin 10] 
      [parent panel])) ; panel instead of this 
    (define output 
     (new text-field% 
      [label "blog"] 
      [style '(multiple)] 
      [min-height 20] 
      [vert-margin 20] 
      [min-width 400] 
      [parent panel])) ; panel instead of this 
    (define (callback button event) 
     (define title-new-value (send titleoutput get-value)) 
     (define new-value (send output get-value)) 
     (save title-new-value new-value) 
     (send output set-value "") 
     (send titleoutput set-value "") 
     (send howisit show #t)) 
    (define button 
     (new button% 
      [label "Submit"] 
      [vert-margin 0] 
      [horiz-margin 10] 
      [parent panel] ; panel instead of this 
      [callback callback])) 
    )) 

(define f (new frame% [label "blog post GUI"] [min-width 400] [min-height 500])) 

(define tib (new blogPost% 
       [parent f])) 

(send f show #t) 

當然,用這種方法,你將無法使用您blogPost%類的實例爲horizontal-panel%定義的方法,但是從長遠來看,這是一件好事,因爲好。如果你將來想要改變實現來使用horizontal-panel%以外的東西,你可以。

+0

非常感謝你!這正是我需要的! –

+0

另外我的保存功能將變量保存到數據庫中,但它對於gui來說並不是非常必要的。你做的很好! –

+0

我只是想知道,你有多瞭解鬆耦合? –