失礼しました、例では普通のコマンドボタン使ってしまいましたが状況が違いすぎますね…
ボタンがフォーカスを受け付けないというのがどのような状況かわかっていないのですが、
ご説明ではテキストフィールドの入力確定イベントはそのボタンを押せば起きているよう
ですので、おそらくそのボタンはキーボードイベントをハンドルしていないグラフィック
オブジェクトなのではないかと思います。
この理解があっていれば、テキストフィールドの外側の背景をクリックしたときと同じ
ように、とにかく別のオブジェクトにフォーカスが移動するようにすれば事足りそうな
気もします。(全然、見当違いのとこを言っていたらすみません…)
先のコードのコマンドボタンの代わりにVBoxを使うように直してみました。
勉強不足なもので、お作法的に正しいのかちょっと自信がないですがとりあえず
期待しているようには動きました。
Code:
{value
|| コピー元TextField
def src-tf =
{TextField
width=3cm
}
|| コピー先TextField
def dst-tf =
{TextField
width=3cm,
editable? = false
}
|| コピー実行ボタン代わりのグラフィックオブジェクト
def copy-button =
{VBox
halign="center",
height = 1cm,
width = 2cm,
background = {FillPattern.get-orange},
border-color = {FillPattern.get-red},
border-width = 2pt,
{Fill},
{text Copy},
{Fill},
{on e:PointerPress at vb:VBox do
{if e.button == left-button then
{copy-button.enqueue-event {Action}}
}
},
{on Action do
|| TextFieldに入力されて確定されている値をコピー
{set dst-tf.value = src-tf.value}
}
}
|| Ctrl-cキー押下時イベント
def on-ctrl-c-key-proc =
{proc {}:void
|| 入力中のTextFieldのキーボードフォーカスを外すため、適当なVisualに
|| フォーカスをセットするようにリクエスト(ここではボタン代わりのVBoxへ)
{copy-button.request-key-focus}
|| ※ 入力中の TextField からフォーカスが外れた際に発生するイベントが
|| 全て処理された後にコマンドボタンのActionイベントハンドラを実行させる為、
|| handle-eventメソッドで直接Actionイベントハンドラを呼び出さずに
|| イベントキューにコマンドボタンの"Action"イベントを積む
{copy-button.enqueue-event {Action}}
}
|| キーボードショートカットを登録
{{get-gui-manager}.add-event-handler
{on kp:KeyPress do
{if kp.ctrl? and kp.value == 'c' then
{on-ctrl-c-key-proc}
}
}
}
||
{VBox
halign="center",
{VBox
{text 上段のテキストを下段へコピーします},
{text 「Copy」ボタンまたはCtrl+cキーを押してください}
},
src-tf,
copy-button,
dst-tf
}
}
>(そもそも、フォーカスを受け付けないボタンが鬼っ子な気もするのですが・・・)
単に見栄えの良いボタン代わりのものをグラフィックオブジェクトで作るとかでしたら
普通にやるだろうなぁと思うのですが、むしろ鬼っ子はこちらのような…
>さらには、FocusOutによって実行させた処理が Dailog を表示するような処理で、
Curlではなく他のウィンドウシステムで経験した話になってしまいますが、フォーカス
Outのイベントハンドラ内で、同期完了の関数を呼び出してその中でユーザに確認を
求めるダイアログを出すという仕様は鬼門だった覚えが…
こちら、ちょっと実験してみます。