【ご質問】
TextFieldのValueFinishedイベントやCommandButtonのActionイベントで
Enterキーの長押しやCommandButtonを連続ボタン押下された際に、
TextFieldやCommandButtonでイベントを一回のみ発生するようにしたいのですが、可能でしょうか。
【回答】
各コントロールでhandle-eventをオーバーライドして
各イベントを制御すれば宜しいのではないでしょうか。
詳細は以下のサンプルをご参照ください。
{curl 6.0,7.0,8.0 applet} {curl-file-attributes character-encoding = “shift-jis”}
||連続押しができないボタン {define-class public MyCommandButton {inherits CommandButton}
{constructor public {default …} {construct-super …} } {method public {handle-event event:Event}:void {if event isa Action then set self.enabled? = false {dispatch-events true} {super.handle-event event} {dispatch-events true} set self.enabled? = true else {super.handle-event event} } } }
{define-class public MyStandardTextFieldUI {inherits StandardTextFieldUI}
field public fire?:bool = true {constructor public {default …} {construct-super …} } {method public {on-raw-key-release e:RawKeyRelease}:void set self.fire? = true } {method public {on-pointer-press e:PointerPress}:void set self.fire? = true }
} ||ValueFinishedイベント抑制TextField {define-class public MyTextField {inherits TextField}
{constructor public {default …} {construct-super …} set self.ui-object = {MyStandardTextFieldUI} }
{method public {handle-event event:Event}:void {if event isa ValueFinished and (self.ui-object asa MyStandardTextFieldUI).fire? then {super.handle-event event} set (self.ui-object asa MyStandardTextFieldUI).fire? = false elseif not event isa ValueFinished then {super.handle-event event} elseif not (self.ui-object asa MyStandardTextFieldUI).fire? then || else {super.handle-event event} set (self.ui-object asa MyStandardTextFieldUI).fire? = true } } }
{value {VBox spacing = 10pt, {MyTextField width = 100pt, {on e:ValueFinished at tf:TextField do {dump e} } }, {MyCommandButton label = “二度押し禁止”, {on e:Action do {dump e} ||時間の掛かる処理の代わり {sleep 3s} } } } }
|