2017-09-25 2 views
0

キー入力をすべて保持する別のクラスをJFrameに追加しようとするたびに、Eclipseはこれを行うように指示します:frame.add(frame, new KeyInput());、エラーを返します:KeyListenerは常にJFrameに追加しようとするとエラーが表示されます

Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself 

。私はこのエラーを理解し、それがどこから来たのか:

frame.add(frame, new KeyInput()); 
      ^^^^^ 

が、私は、フレーム部品を取り出した場合、私はエラーを取得する:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
The method add(Component) in the type Container is not applicable for the arguments (KeyInput) 

私は理解しますが、得ることはありません。この1 gist:Eclipseは実際のエラーを検出しました。

+1

で解決されたKeyListenerの非常に一般的な問題です。コンポーネントを自分自身に追加しようとしているのはなぜですか?私は 'add'メソッドのAPIドキュメントを詳しく見ていきたいと考えています。また、KeyListenerの代わりに[Key Bindings](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)APIを使用して、プライマリを解決することも検討しますフォーカスに関連する問題 – MadProgrammer

+0

@MadProgrammer、私が言及したように、コンポーネントなしで、フレームは私が持っている唯一のものです、私はエラーが発生します。そして、私は既にKey Bindings APIを見てきましたが、私はそれらをどのように使用するのか手がかりがありません。 –

+1

質問はまだ残っていますが、なぜコンポーネントを自分自身に追加しようとしていますか? Javaのように、それは不正な操作です - [キー・リスナーの作成方法](https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)を読んだことがありますか? )? – MadProgrammer

答えて

1

が、あなたは(からjavax.swing.JFrame継承)

これはさらにしかし

How to write key listenersに概説するjava.awt.Componentで定義さaddKeyListenerを使用することが「べき」、KeyListenerのインスタンスであるKeyInputと仮定するとこれを行うことによって生じる可能性のある問題の数に制限はありません。あなたがベースフレームにリスナーを追加しているので、あなたがそれとユーザとの間の数の要素があるという事実を無視している、そのすべてがイベントを消費するか、フォーカス

JRootPane

KeyListenerを盗むことができ

  • フォーカス可能
  • で、キーボードフォーカス
があります。それはに登録されているコンポーネントが場合にのみ、キーイベントに応答します

これは、キーボード入力にも反応する他のコンポーネントがキーボードのフォーカスを奪う可能性があり、リスナーがトリガーされなくなることを意味します。これは

関連する問題