Java で <tab> キーストロークをキャプチャする最良の方法は何ですか?
-
25-09-2019 - |
質問
Java コマンドライン アプリケーションで <tab> キーストロークをキャプチャするのに問題があります。System.in.read() を使用しても、Tab キーを押しても何も表示されないようです。これに取り組む最善の方法は何でしょうか?
コンテキストを説明するために、ユーザーがコマンドの途中でタブ キーを押してコマンドをオートコンプリートできるようにしようとしています (bash シェルで行うのと同じように)。これを達成するためのより良いアプローチがあれば、喜んで提案を受け付けます (おそらく、System.in.read() を使用するのが、これにアプローチする最良の方法ではないでしょうか?)。
解決
見て Jライン. 。私自身は使用したことがありません。これは Windows DLL (JNI を使用) を使用し、コンソールをバッファー モードではなく文字/生モードに切り替える Linux サポートを備えています。私はこれまでにこれを使用したことがないので、自己責任で使用してください。また、それがあなたの問題に対処するかどうかは100%わかりませんが、試してみる価値はあります:)
編集: 動作することを確認できました
ConsoleReader cr = new ConsoleReader();
while (cr.readVirtualKey() != 0x09){
//loop till Tab is pressed
}
再度編集します: ライブラリには、コマンド ラインのオートコンプリート (タブを押すことによる) が含まれています...楽しむ :)
他のヒント
私はあなたのシェルがタブをキャプチャし、あなたのアプリケーションになってから、それを妨げていることを推測します。あなたはこれについて何かできることがないかもしれない...
InputStream からのデータは、ユーザーが Enter キーを押した場合にのみ使用可能になります。タブの後に Enter を押すとタブが表示されることがわかると思います。
C アプリケーションでも同様のものがあります。シェルは生のキーストロークを必要とするため、入力モードをクックから生に設定します。Readline は、Linux でこのために使用される通常のライブラリです。Windows では何が一般的なのかわかりません。私が考える限り、ここでの選択肢は JNI を使用するものだけです。