我有一个使用The Racket Graphical Interface Toolkit创建图形用户界面的应用程序。我还有一个带有几个字段的框架,它是用下面的代码创建的:
#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有没有一种方法可以动态确定选定的字段?因此,询问所选场到该帧,并且如果该场被选择,则检索对该场的引用。
发布于 2013-04-28 06:01:54
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 发布于 2013-04-27 16:18:44
我想我找到了一个解决方案,但它似乎是一个肮脏的解决方案。
我扩展了frame%类,以便可以捕获on-subwindow-focus事件。在捕获这些事件时,我检查它是否是焦点(而不是非焦点),如果接收器的object-name是text-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 https://stackoverflow.com/questions/16249705
复制相似问题