2016-04-27 117 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

我只是想知道,你有多了解松耦合? –