CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] Probleme KeyListener

march99
march99
Niveau 10
30 mai 2008 à 20:34:50

Bonjour voila j'ai un probleme pour faire fonctionner mon KeyListener : je comprend pas pk il ne marche pas , pourtant je l'ai bien ajouter aux JPanel et redefinie ces methodes :-(
Voici le source pour ceux qui voudraient bien m'aider :

    • ***********************************************
    • ******

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Couleurperso extends JFrame {
private JComboBox cb;
private Color couleur;
private int rouge;
private int vert;
private int bleu;
private int choix;
private boolean fin;

public Couleurperso(){
super("Couleur personalisé");
rouge=1;
vert=1;
bleu=1;
this.setDefaultCloseOperation(1);
couleur=Color.white;
cb= new JComboBox ( new String[] {"Choix","Rouge","Vert","Bleu"});
JPanel panneau_principal =((JPanel)this.getContentPane());
JPanel centre = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(couleur);
g.drawRect(0, 0, this.getWidth(), this.getHeight());
}
};
KeyListener kl = new KeyListener(){
public void keyReleased(KeyEvent e){
}
public void keyPressed(KeyEvent e){
}
public void keyTyped(KeyEvent f){
cb.setEnabled(true);
switch(choix){
case 1 :
if (f.getKeyChar() == '+')
rouge++;
else
rouge--;
if (rouge <0)
rouge=0;
break;
case 2 :
if (f.getKeyChar() == '+')
vert++;
else
vert--;
if (vert <0)
vert=0;
break;
case 3 :
if (f.getKeyChar() == '+')
bleu++;
else
bleu--;
if (bleu <0)
bleu=0;
break;
}
couleur= new Color(rouge,vert,bleu);
repaint();

}
};
centre.addKeyListener(kl);
panneau_principal.setPreferredSize(new Dimension(200,200));
panneau_principal.setLayout(new BorderLayout());
cb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
switch(cb.getSelectedIndex()){
case 1:
choix=1;
System.out.println("Coucou");
break;
case 2 :
choix = 2;
break;
case 3 :
choix = 3;
break;

}
}
});
panneau_principal.add(cb,BorderLayout.NORTH);

panneau_principal.add(centre,BorderLayout.CENTER
);
this.pack();
this.setVisible(true);
}

}

    • *****************************************

Ps : Cela consiste a ce que l'utilisateur puisse choisir une couleur personnalise , avec le KeyListener il augmente (+) ou (-) la valeur R ou v ou B

Merci d'avance

Kaoron
Kaoron
Niveau 9
30 mai 2008 à 21:33:45

Pour traiter des evenements clavier un keylistener doit avoir le focus clavier, or tu l'attaches à un JPanel qui est un conteneur passif!

Attaches le plutôt à ta ComboBox, c'est le seul composant focusable que tu aies sur ta frame.
Ensuite, j'imagine que tu souhaites utiliser fillRect() plutot que drawRect(), afin de colorier un rectangle plein plutôt que son contour!

march99
march99
Niveau 10
31 mai 2008 à 00:23:56

A oui j'ai pas fait gaffe ( pour le fillRect ) , merci je vais essayer sa :)

godrik
godrik
Niveau 30
31 mai 2008 à 10:09:56

Ca fait peut etre longtemps que j'ai plus fait de java, mais on a vraiment le droit de crée un objet keylistener comme ca ? Dans ma mémoire, KeyListener est une interface. Alors peut etre que la syntaxe que tu as utilisé crée une classe anonyme qui implémente keylistener. Cependant je ne l'ai jamais vu. (bon, la derniere fois que j'ai fait du java, il n'y avait pas de generics)

quel est ton probleme, ca compile au moins ?

Kaoron
Kaoron
Niveau 9
31 mai 2008 à 10:41:57

"Alors peut etre que la syntaxe que tu as utilisé crée une classe anonyme qui implémente keylistener."

C'est ça, pour implémenter une classe anonyme java utilise la syntaxe :

MaClasse monInstance = new MaClasse(<param>){
public Machin maMethodeRedéfinie1(){<instructions>}
}

march99
march99
Niveau 10
31 mai 2008 à 12:14:08

Ba on a etudié sa comme sa en cours nous :-( D'ailleur sa marchais mais plus la :-( Sinon j'ai reussis grace a la méthode de kaoron mais il reste un autre probleme :desole: En faite la JFrame la est appellée par une autre fenetre et doit lui retourner une Couleur . J'ai utilise une technique qui permet de relancer la methode des que je ne trouve aps le bon resultat mais il me fait une erreur de mémoire :-( . Donc si vous pouriez m'aider à trouver une solution ^^ Je vous remet le code :

    • ***********************************************
    • **********

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Couleurperso extends JFrame {
private JComboBox cb;
private Color couleur;
private int rouge;
private int vert;
private int bleu;
private int choix;
private boolean fin;

public Couleurperso(){
super("Couleur personalisé");
fin = false;
rouge=1;
vert=1;
bleu=1;
this.setDefaultCloseOperation(1);
couleur=Color.white;
cb= new JComboBox ( new String[] {"Choix","Rouge","Vert","Bleu"});
JPanel panneau_principal =((JPanel)this.getContentPane());
JPanel centre = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(couleur);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
}
};
KeyListener kl = new KeyListener(){
public void keyReleased(KeyEvent e){
}
public void keyPressed(KeyEvent e){
}
public void keyTyped(KeyEvent f){
cb.setEnabled(true);
System.out.println(f.getKeyChar());
switch(choix){
case 1 :
if (f.getKeyChar() == '+')
rouge++;
else
rouge--;
if (rouge <0)
rouge=0;
else if (rouge>255)
rouge=255;
break;
case 2 :
if (f.getKeyChar() == '+')
vert++;
else
vert--;
if (vert <0)
vert=0;
else if (vert>255)
vert=255;
break;
case 3 :
if (f.getKeyChar() == '+')
bleu++;
else
bleu--;
if (bleu <0)
bleu=0;
else if (bleu>255)
bleu=255;
break;
}
couleur= new Color(rouge,vert,bleu);
if (f.getKeyChar() == 'q'){
fin=true;
Couleurperso.this.setVisible(false);
}
repaint();

}
};
cb.addKeyListener(kl);
panneau_principal.setPreferredSize(new Dimension(200,200));
panneau_principal.setLayout(new BorderLayout());
cb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
switch(cb.getSelectedIndex()){
case 1:
choix=1;
break;
case 2 :
choix = 2;
break;
case 3 :
choix = 3;
break;

}
}
});
panneau_principal.add(cb,BorderLayout.NORTH);

panneau_principal.add(centre,BorderLayout.CENTER
);
this.pack();
this.setVisible(true);
}

public Color lance(){
if ( fin) return (new Color(rouge,vert,bleu));
else return lance();

}

}

    • ***********************************************
    • ******

Dans l'autre fenetre je fait cela :
Couleurperso coucou = new Couleurperso();
couleur=coucou.lance();

Merci d'avance,

march99
march99
Niveau 10
31 mai 2008 à 13:53:25

Bon en faite j'ai trouvé la solution ^^ Il me reste un dernier ptit probleme : quand l'utilisateur lance la fentre pour les couleurs personalisé ma fenetre principale je lui met : setVisible(false) et si l'utilisateur utilise correctement la fenetre des couleurs tout se passe bien . Mais s'il quitte la fenetre des couleurs avec la ptit croix rouge en haut a droite ba la fenetre principale ne se remet pas visible .
Donc pour ceux qui ont reussis a me suivre ^^ j'aimerai savoir si il y avait des evenements qui gere la fermeture d'une fenetre par la croix rouge ?

Kaoron
Kaoron
Niveau 9
31 mai 2008 à 14:03:48

Ce qui se passe, c'est que tu appelles récursivement la méthode lance() de ta classe... à l'infini.
En gros, ton programme pose un appel de méthode en mémoire, et tant que la condition n'est pas remplie, il en remet une couche... jusqu'à ce que tu aies appuyé sur q. Sauf qu'un ordi, ça va vite, super vite! En admettant que ton appel prenne seulement 4 octets (au pif) en mémoire, à un million d'opération par secondes (1MHz) l'empilement de tous tes appels successifs prendra 4 millions d'octets (4Mo) au bout de la première seconde!

Pire encore, tu es coincé dans cet appel à la méthode lance(), et rien ne te dit que le fil d'éxécution gérant les entrées clavier peut faire son boulot en parallèle. Si tu restes dans cette méthode là et que ton programme ne peut plus aller traiter les entrées, t'es mal barré!

Tu l'auras compris, ta démarche pour récupérer la valeur est mauvaise et c'est purement algorithmique.
1 / Abandonnes la récursivité (la même méthode qui s'appelle elle-même) pour récupérer une valeur simple. et révises un peu ce qu'est la récursivité au passage.
2 / Si tu veux récupérer ta couleur sur un evenement (validation avec 'q' par exemple), regardes plutôt du coté des Events/EventListeners. Tu fais de ta fenêtre principale un écouteur de Couleurperso (qui implémente par exemple ChangeListener), et tu implémentes une gestion d'écouteurs dans CouleurPerso. Lorsque ton keyListener reçoit un appui sur q, tu notifies les écouteurs que la couleur a été changée, et ils viennent la récupérer.
Ce n'est qu'une manière parmi d'autres.

Pour ce type de problèmes, tu ferais mieux d'aller sur le forum Programmation.
https://www.jeuxvideo.comom/forums/0-47-0-0-0-0-0-0.htm

march99
march99
Niveau 10
31 mai 2008 à 14:44:45

Mici en fait j'ai réussis à faire tout ce que je voulais :) Merci à tous pour votre aide

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment