【问题标题】:Get the selected text-field% in a Racket GUI在 Racket GUI 中获取选定的文本字段%
【发布时间】:2013-04-21 09:51:43
【问题描述】:

我有一个使用The Racket Graphical Interface Toolkit 创建GUI 的应用程序。 我还有一个包含多个字段的框架,它是使用以下代码创建的:

#lang racket
(require racket/gui)

(define frame (new frame% [label "frame"]))
(define field-1 (new text-field% [label "field-1"] [parent frame])) ;; add field to frame
(define field-2 (new text-field% [label "field-2"] [parent frame]))
(define field-3 (new text-field% [label "field-3"] [parent frame]))

(send frame show #t) ;; show the frame

有没有一种方法可以动态确定所选字段?因此,向框架询问所选字段并检索对该字段的引用(如果该字段被选中)。

【问题讨论】:

    标签: user-interface scheme racket


    【解决方案1】:

    text-field% 实现了window<%> 接口,因此您可以直接使用on-focus

    #lang racket
    (require racket/gui)
    
    (define my-text-field%
      (class text-field%
        (super-new)
        (define/override (on-focus on?)
          (when on? (printf "~a\n" (send this get-label))))))
    
    (define frame (new frame% [label "Frame"]))
    (define field-1 (new my-text-field% [label "field-1"] [parent frame]))
    (define field-2 (new my-text-field% [label "field-2"] [parent frame]))
    (define field-3 (new my-text-field% [label "field-3"] [parent frame]))
    
    (send frame show #t) ;; show the frame 
    

    【讨论】:

      【解决方案2】:

      我想我找到了一个解决方案,但它似乎是一个肮脏的解决方案。

      我扩展了frame% 类,以便捕获on-subwindow-focus 事件。在捕获这些事件时,我检查它是否是焦点(而不是非焦点),如果接收者的object-nametext-field%,则可以注册焦点。

      实现示例的代码:

      #lang racket
      (require racket/gui)
      
      (define my-frame%
        (class frame%
          (super-new)
          (define/override (on-subwindow-focus r e)
            (when (and e (eq? 'object:text-field% (object-name r)))
              (printf "selected ~a~n" (send r get-label))))))
      
      (define frame (new my-frame% [label "Frame"]))
      (define field-1 (new text-field% [label "field-1"] [parent frame])) ;; add field to frame
      (define field-2 (new text-field% [label "field-2"] [parent frame]))
      (define field-3 (new text-field% [label "field-3"] [parent frame]))
      
      (send frame show #t) ;; show the frame 
      

      【讨论】:

        猜你喜欢
        • 2015-05-19
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2011-06-28
        • 1970-01-01
        相关资源
        最近更新 更多