2

Java プログラムで chm ファイルを開こうとしています。ここで、プログラム全体のどこかでCtrl+を押したときに、この chm ファイルが開かれるようにします。h

次のコードを使用してchmファイルを開いていますが、動作しています。問題は、プロジェクト全体でCtrl+を使用してファイルを開くことです。h

public class Testproject {    
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("hh.exe path of the chm file here/abc.chm");
        }
        catch(Exception ex) {
            System.out.println("exceptioin is"+ex);
        }
    }
}
4

2 に答える 2

2

私のコメントで既に述べたように、KeyEvents のアプリケーション グローバル インターセプト用に設計されたクラスはKeyEventDispatcherです。

KeyEventDispatcher は、現在の KeyboardFocusManager と連携して、すべての KeyEvent のターゲティングとディスパッチを行います。現在の KeyboardFocusManager に登録された KeyEventDispatcher は、ターゲットにディスパッチされる前に KeyEvents を受け取ります。これにより、各 KeyEventDispatcher は、イベントの再ターゲット、消費、イベント自体のディスパッチ、またはその他の変更を行うことができます。

したがって、タスクは、dispatch(KeyEvent) メソッドで必要なことを行うディスパッチャーを実装することです。次のようになります。

public class MyDispatcher implements KeyEventDispatcher {

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (!e.isConsumed()) {
            if (processMyStuff(e)) {
                e.consume();
            }
        }
        return false;
    }

    protected boolean processMyStuff(KeyEvent e) {
        if (!isMyTrigger(e)) return false;
        doMyStuff();
        return true; 
    }

}

// usage:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
    .addKeyEventDispatcher(new MyDispatcher());

グローバル リスナーをツールキットに追加することで、いくつかの注意事項を守って目標を達成できることに注意してください。

  • 原則として、特に正確な要件を満たすように設計されている場合は、作業に最も適したツールを使用してください。
  • AWTEventListener は、セキュリティが制限されたコンテキストでは機能しない可能性があります
于 2013-03-27T12:17:48.923 に答える
2

キーバインディングを追加するほとんどの方法は、コンポーネントごとに行うため、おそらくダイアログを含むすべてのトップレベルウィンドウのバインディングを作成する必要があり、これはかなり面倒です. そのため、イベント ディスパッチ システムの中央の場所でイベントを取得する必要があります。

考えられる方法の 1 つToolkit.addAWTEventListenerは、カスタム リスナーを最初の引数KEY_EVENT_MASKとして、2 番目の引数として使用することです。この方法で登録されたリスナーは、すべてのキーストロークの通知を受ける必要があるため、それらをキャストして+でKeyEventあるかどうかを検査し、それに応じて動作させることができます。Ctrlh

于 2013-03-21T07:35:07.983 に答える