ZK フレームワークにCTRLキー リスナーを実装しました。ただし、Firefox と Chrome で問題が発生しています。
CTRL+RまたはCTRL+AまたはCTRL+を押すSと、アプリケーション イベントが発生しますが、Firefox と Chrome ではデフォルトCTRLイベントも発生します。それぞれ更新、すべて選択、保存します。たとえば、CTRL+を押すAと、イベントが発生し、ページ上のすべてのテキストが選択されます。
それがZKの問題なのか、それとも私が何か間違ったことをしているのか、誰にでも教えてもらえますか。
注:イベントは、テキスト ボックスだけでなく、ページ全体に対して発生します。
ZULでは、次を使用しました:
<window apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('com.web.viewmodel.MyViewModel')"
width="100%" height="100%" mode="embedded" ctrlKeys="^a^q^r^s^d"
onCtrlKey="@command('doFireCtrlKeyEvent',code=event.getKeyCode())">
..そして私の Java ViewModel で私は以下を使用しました。このメソッドはイベントをキャッチし、対応するに渡しますViewModel
:
@Command
public void doFireCtrlKeyEvent(@ContextParam(ContextType.VIEW) Component view, @org.zkoss.bind.annotation.BindingParam("code") String ctrlKeyCode) {
int keyCode = Integer.parseInt(ctrlKeyCode);
String ctrlKey = "";
switch (keyCode) {
case 65:
ctrlKey = "CTRL+A";
break;
case 81:
ctrlKey = "CTRL+Q";
break;
case 82:
ctrlKey = "CTRL+R";
break;
case 83:
ctrlKey = "CTRL+S";
break;
case 68:
ctrlKey = "CTRL+D";
break;
}
Map map = new HashMap();
map.put("ctrlKeyCode", ctrlKey);
Tabpanel tabPanel = mainTab.getSelectedPanel();
Tab tab = mainTab.getSelectedTab();
Include inc = (Include) tabPanel.getChildren().get(0);
if (inc != null) {
if (inc.getFirstChild() instanceof Window) {
Window win = (Window) inc.getFirstChild();
Map maps = win.getAttributes();
Binder bind = (Binder) maps.get("binder");
if (bind == null)
return;
bind.postCommand("doCtrlKeyAction", map);
}
if (inc.getFirstChild() instanceof Hbox) {
Hbox hbox = (Hbox) inc.getFirstChild();
Map maps = hbox.getAttributes();
Binder bind = (Binder) maps.get("binder");
if (bind == null)
return;
bind.postCommand("doCtrlKeyAction", map);
}
}
}