2017-09-25 1 views
0

Chaque fois que j'essaie d'ajouter ma classe séparée qui contient toutes mes entrées clés à mon JFrame, Eclipse me dit de faire ceci: frame.add(frame, new KeyInput());, qui renvoie l'erreur :KeyListener me donne toujours une erreur en essayant de l'ajouter à mon JFrame

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

. Je comprends cette erreur et d'où il vient:

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

, mais si je prends le composant de cadre, je reçois l'erreur:

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) 

Ce que je ne comprends pas, mais je reçois la Gist: Eclipse a détecté une erreur réelle.

+1

Pourquoi essayez-vous d'ajouter un composant à lui-même? Je voudrais examiner de plus près la documentation de l'API pour la méthode 'add'. Je considérerais aussi l'API [Key Bindings] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) comme une alternative à KeyListener, car elle résout le problème principal. focus questions liées – MadProgrammer

+0

@MadProgrammer comme je l'ai mentionné, sans le composant, et le cadre est le seul que j'ai, je reçois une erreur. Et j'ai déjà regardé l'API Key Bindings, et je n'ai aucune idée de comment les utiliser. –

+1

La question demeure, pourquoi essayez-vous d'ajouter un composant à lui-même? Cela n'a aucun sens et, comme Java le dit, c'est une opération illégale - Avez-vous lu [Comment écrire un auditeur clé] (https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)? – MadProgrammer

Répondre

1

En supposant que KeyInput est une instance d'un KeyListener, alors vous "devez" être à l'aide addKeyListener défini dans java.awt.Component (qui javax.swing.JFrame hérite de)

Ce sont détaillées à l'How to write key listeners

Cependant, y a-t-il un certain nombre de problèmes qui pourraient résulter de cela? Parce que vous ajoutez l'auditeur au cadre de base, vous ne tenez pas compte du fait qu'il ya un nombre de composants entre celui-ci et l'utilisateur, tous pourraient consommer l'événement ou voler le focus

JRootPane

KeyListener ne répondra à des événements clés lorsque le composant il est enregistré:

  • est focalisable
  • et a le focus du clavier

Cela signifie que d'autres composants qui répondent également à l'entrée au clavier peuvent dérober la mise au point du clavier et votre écouteur ne sera plus déclenché. Ceci est un problème très commun avec KeyListener qui a été résolu par le Key bindings API