Thread Rating:
  • 216 Vote(s) - 2.68 Average
  • 1
  • 2
  • 3
  • 4
  • 5
キー押下イベントを無視するには?
05-20-2014, 06:10 PM,
#1
キー押下イベントを無視するには?
以前、画面にロックをかける、という機能を実装したのですが、
マウスによるボタン押下のイベントはうまくロックできるのですが、
FocusManager に対するキー押下(KeyPress)のイベントはロックできていませんでした。

具体的には、下記のアプレットで、「画面をロック」ボタン押下で画面をロックしますが、
F1キーを連打すると、画面ロックの解除後に、F1キーの押下イベントが流れ、
メッセージがポップアップ表示されてしまいます。

これを、画面ロック中にF1キーを押しても、そのキー押下イベントは無視するようにしたいです。

ある一定期間に押されたキーのイベントを破棄するには
どのような方法があるのでしょうか。
ご存知の方は教えてください。

Code:
||画面をロックするためにバリアを張るフレーム
{define-class public BarrierFrame {inherits OverlayBox}
  {constructor public {default ...}
    {construct-super {splice ...}}
  }

  field barrier-screen-frame:Graphic =
      {Fill background =  "transparent"}

  field private _barrier?:bool = false
  {getter public {barrier?}:bool
    {return self._barrier?}
  }
  {setter public {barrier? val:bool}:void
    set self._barrier? = val
    {if self._barrier?  then
        {self.add self.barrier-screen-frame}
    else
        {dispatch-events false}
        {self.barrier-screen-frame.detach}
    }
  }

}

{def bf = {BarrierFrame}}

{def td = {TextField}}

{def lock-cb =
    {CommandButton
        label = "画面のロック",
        {on Action at cb:CommandButton do
            set td.value = "ロック中"
            def fm =  {cb.get-focus-manager}
            {dispatch-events false}
            set bf.barrier? = true
            {read-from {url "http://www.yahoo.com"}}
            set bf.barrier? = false
            set  td.value = ""
        }
    }
}

{def fnc-cb =
    {CommandButton
        label = "メッセージ表示(F1)",
        {on Action do
            {popup-message "hello world"}
        } ,
        ||画面表示時にFocusManager に、アクセルキーを設定
        {on AttachEvent at button:CommandButton do

            def fm =  {button.get-focus-manager}
            set fm.standard-accelerators? = false
            def key-accel-string = "F1"
            def key-accel = {KeyAccel key-accel-string = key-accel-string,
                                {on Action do
                                    {button.take-action}
                                }
                            }
            {fm.add-key-accel key-accel}
        }
    }
}

{do
    {bf.add {VBox  td, lock-cb,  fnc-cb  }  }
    def d:Dialog = {Dialog bf}
    {d.show}
}
Reply
05-21-2014, 12:42 PM,
#2
RE: キー押下イベントを無視するには?
とりあえず、画面のロック前後で、FocusManager のキーアクセルを、引きはがし&再設定して、
キープレスイベントを空振りさせることはできそうです。

もっと良い方法はないものですかね・・・。

Code:
||画面をロックするためにバリアを張るフレーム
{define-class public BarrierFrame {inherits OverlayBox}
  {constructor public {default ...}
    {construct-super {splice ...}}
  }

  field barrier-screen-frame:Graphic =
      {Fill background =  "transparent"}

  field private _barrier?:bool = false
  {getter public {barrier?}:bool
    {return self._barrier?}
  }
  {setter public {barrier? val:bool}:void
    set self._barrier? = val
    {if self._barrier?  then
        {self.add self.barrier-screen-frame}
    else
        {dispatch-events false}
        {self.barrier-screen-frame.detach}
    }
  }

}

{def bf = {BarrierFrame}}

{def td = {TextField}}

||FocusManager に設定するアクセルキーを管理する配列変数
{def ary-key-accels = {{Array-of KeyAccel}}}

{def lock-cb =
    {CommandButton
        label = "画面のロック",
        {on Action at cb:CommandButton do
            set td.value = "ロック中"

            def fm =  {cb.get-focus-manager}

            ||ロック中のキー押下イベントが流れてしまわないように、
            ||フォーカスマネージャからキーアクセルを引きはがす
            {dispatch-events false}
            {for e in ary-key-accels do
                {fm.remove-key-accel e}
            }
            {dispatch-events false}

            set bf.barrier? = true

            {read-from {url "http://www.yahoo.com"}}

            set bf.barrier? = false
            set  td.value = ""

            ||フォーカスマネージャのキーアクセルをもとに戻す
            {dispatch-events false}
            {for e in ary-key-accels do
                {fm.add-key-accel e}
            }
            {dispatch-events false}

            set td.value = ""
        }
    }
}

{def fnc-cb =
    {CommandButton
        label = "メッセージ表示(F1)",
        {on Action do


            {popup-message "hello world"}
        } ,
        ||画面表示時にFocusManager に、アクセルキーを設定
        {on AttachEvent at button:CommandButton do

            def fm =  {button.get-focus-manager}
            set fm.standard-accelerators? = false
            def key-accel-string = "F1"
            def key-accel = {KeyAccel key-accel-string = key-accel-string,
                                {on Action do
                                    {button.take-action}
                                }
                            }
            {fm.add-key-accel key-accel}

            ||アクセルキーを管理配列に追加
            {ary-key-accels.append key-accel}
        }
    }
}

{do
    {bf.add {VBox  td, lock-cb,  fnc-cb  }  }
    def d:Dialog = {Dialog bf}
    {d.show}
}

Reply

Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1085')