4

我有一个使用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

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

4

2 回答 2

3

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-27T22:01:53.640 回答
0

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

我扩展了frame%课程,以便捕捉on-subwindow-focus事件。在捕捉这些事件时,我检查它是否是焦点(而不是非焦点),如果object-name接收者的 是 a 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 
于 2013-04-27T08:18:43.717 回答