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、レシーバーの が である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 に答える