Salut à tous, j'ai un projet à rendre bientot, et je n'arrives pas à afficher un bouton avec mon programme. Je dois réaliser un jeu taquin, j'ai deja les bases, qui sont de pouvoir bouger les cases en fonction des clics, et de placer les images aux cases amovible. J'ai regardé comment placer un bouton, sauf que quand j'exécute mon programme, rien ne se passe.
Programme main :
package BaseProjet;
public class Main {
public static void main(String[] args){
//----------------------------------------//
// DEFINITION DES CARACTERISTIQUES DU JEU //
//----------------------------------------//
int Largeur = 3; // NOMBRE DE CASE EN LARGEUR
int Hauteur = 3; // NOMBRE DE CASE EN HAUTEUR
int Taille = 220; // TAILLE EN PIXEL D'UNE CASE
//------------------------//
// CREATION D'UNE FENETRE //
//------------------------//
Fenetre FenJeu=new Fenetre("Taquin",Largeur,Hauteur,Taille);
Fenetre FenImage=new Fenetre("Image",Largeur,Hauteur,Taille);
//---------------------------------------//
// CREATION D'UN PANNEAU DANS LA FENETRE //
//---------------------------------------//
new Affichage(FenJeu,Largeur,Hauteur,Taille);
new Image(FenImage,Largeur,Hauteur,Taille);
//---------------------------//
// RENDRE LA FENETRE VISIBLE //
//---------------------------//
FenJeu.setVisible(true);
FenImage.setVisible(true);
}
}
Programme bouton :
package BaseProjet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Bouton extends JFrame{
private static final long serialVersionUID = 1L;
private JPanel pan = new JPanel();
private JButton bouton = new JButton("Mélanger");
public Bouton(){
this.setTitle("Animation");
this.setSize(300, 150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
//Ajout du bouton à notre content pane
pan.add(bouton);
this.setContentPane(pan);
this.setVisible(true);
}
}merci d'avance !
Ben dans le main tu n'instancie jamais de fenêtre Bouton, forcément
( et c'est voulu le fait d'ouvrir une nouvelle fenêtre pour afficher un bouton... ? )
rajoute Bouton nouveauBtn = new Bouton();
dans le main
tu ferais mieux d'afficher une seule JFrame (fenêtre) pour tout ton jeu et y coller plusieurs panels, tu peux utiliser window builder comme plugin pour faciliter le placement des composants sur une JFrame ou une JPanel :
https://eclipse.org/windowbuilder/
Ah merci ca marche !
T'en fait pas, je fais juste un petit truc, mais pour etre sur, ce bouton serai capable de commander des autres programme si je fais appel à lui dans des sous programmes ?
Des autres programmes, tu veux dire des autres classes ?
Pour accéder à une classe d'une autre classe, tu la passe en paramètre à la première, par exemple si tu veux que ton bouton appelle une méthode de la classe Main :
Dans le main :
Bouton nouveauBtn = new Bouton(this);Classe Bouton :
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Bouton extends JFrame implements ActionListener
{
private static final long serialVersionUID = 1L;
private JPanel pan = new JPanel();
private JButton bouton = new JButton("Mélanger");
Main main;
public Bouton(Main parMain)
{
main = parMain;
//On passe en paramètre une classe Main à l'instanciation
this.setTitle("Animation");
this.setSize(300, 150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
//Ajout du bouton à notre content pane
pan.add(bouton);
this.setContentPane(pan);
this.setVisible(true);
}
//Methode pour l interface ActionListener
@Override
public void actionPerformed(ActionEvent parEvt)
{
//Si la source de l'action est le bouton, on execute la methode dans ta classe main
if(parEvt.getSource() == bouton)
main.taMethodeDeTaClasseMain();
}
}
Oui je parlais bien des autres class,
Donc si j'ai bien compris les lignes permettant de faire appel au bouton serai :public void actionPerformed(ActionEvent parEvt)
{
if(parEvt.getSource() == bouton)
main.taMethodeDeTaClasseMain();
Parce que je dois trouver un codage qui me permettrais de mélanger le jeu. Pour t'expliquer rapidement, j'ai des images associé à des cases, (3x3 avec une case vide pour les déplacements ) et je dois ajouter une fonction mélanger pour commencer le jeu, sauf que j'ai aucune idée de par ou commencer, je te montre le programme qui gère l'affichage et donc les cases, si jamais tu a le temps de m'aider :
package BaseProjet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Affichage extends JPanel implements MouseMotionListener, MouseListener, KeyListener {
//------------------------------------------//
// ATTRIBUS //
//------------------------------------------//
/**
*
*/
private static final long serialVersionUID = 1L;
private int l,h,t; // NOMBRE DE CASES EN LARGEUR ET HAUTEUR ET TAILLE
private int x=2,y=2; // POSITION DU PERSONNAGE DANS LE TABLEAU
private int[][] c; // TABLEAU
private int xm; // ABSCISSE DU CLICK
private int ym; // ORDONNEE DU CLICK
private boolean click; // ETAT DU CLICK
private Color LesCouleurs[]=new Color[10]; // 10 ELEMENTS
//------------------------------------------//
// CONSTRUCTEUR DE L'AFFICHAGE //
//------------------------------------------//
public Affichage(Fenetre UneFenetre, int largeur, int hauteur, int taille) {
// INITIALISATION DES CARACTERISTIQUES DU JEU
this.l=largeur;
this.h=largeur;
this.t=taille;
this.c=new int[l][h];
// NUMEROTER LES CASES
for (int j=0;j<this.h;j++)
for (int i=0;i<this.h;i++)
this.c[i][j]=3*j+i+1;
//------------------------------------------//
// COULEUR DES ELEMENTS DU JEU //
//------------------------------------------//
Random randomGenerator = new Random();
LesCouleurs[0]=new Color(0,0,0);
for (int i=1;i<this.h*this.l;i++)
LesCouleurs[i]=new Color(2*randomGenerator.nextInt(100),
2*randomGenerator.nextInt(100),
2*randomGenerator.nextInt(100));
// ASSOCIER CE PANNEAU A LA FENETRE
UneFenetre.setContentPane(this);
// ECOUTER LA SOURIS ET LA CLAVIER
addMouseMotionListener(this);
addMouseListener(this);
setFocusable(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
//---------------------------------------------//
// REALISER UN DEPLACEMENT SI CLICK //
//---------------------------------------------//
if (this.click) Deplacement(Gestion());
// CONSOLE POUR VERIFICATION
System.out.println();
for (int j=0;j<this.h;j++){
for (int i=0;i<this.h;i++)
System.out.print(this.c[i][j]+" ");
System.out.println();
}
//-----------------------------------------------//
// AFFICHAGE DU JEU SUR CONSOLE ET SUR GRAPHIQUE //
//-----------------------------------------------//
//System.out.println();
//System.out.println("Affichage du tableau ci-dessous:");
//System.out.println();
/*for (int j=0;j<this.h;j++){
for (int i=0;i<this.h;i++){
g.setColor(LesCouleurs[this.c[i][j]]);
g.fillRect(i*this.t, j*this.t, this.t, this.t);
}
}*/
ImageIcon image[] = new ImageIcon[10];
for (int i=0;i<10;i++)
image[i] = new ImageIcon ("0"+i+".jpg") ;
for (int j=0;j<this.h;j++)
for (int i=0;i<this.h;i++)
if (c[i][j]!=9)
g.drawImage (image[c[i][j]].getImage(),i*this.t, j*this.t,this.t, this.t, null);
}
private int Gestion() {
//-----------------------------------------//
// COMPARER LES COORDONNEES DE LA SOURIS //
// ET CELLE DU PERSONNAGE PUIS RETOURNER //
// UNE COMMANDE CLAVIER EN CONSEQUENCE //
//-----------------------------------------//
int commande = 0;
if (this.xm==this.x+1 && this.ym==this.y) commande = 39; // DROITE
if (this.ym==this.y+1 && this.xm==this.x) commande = 40; // BAS
if (this.xm==this.x-1 && this.ym==this.y) commande = 37; // GAUCHE
if (this.ym==this.y-1 && this.xm==this.x) commande = 38; // HAUT
return commande; // PAS DE DEPLACEMENT
}
private void Deplacement(int code) {
// MEMORISER LES COORDONNEES DU PERSONNAGE
int xold=this.x;
int yold=this.y;
// MODIFIER LES COORDONNEES DU PERSONNAGE SI CELA EST POSSIBLE
if (code==37 && this.x!=0) this.x--;
if (code==38 && this.y!=0) this.y--;
if (code==39 && this.x!=l-1) this.x++;
if (code==40 && this.y!=h-1) this.y++;
System.out.println(c[xold][yold]+"<->"+c[this.x][this.y]);
int mem = c[this.x][this.y];
c[this.x][this.y]=c[xold][yold];
c[xold][yold]=mem;
}
public static void temporisation(int tempo)
{
try
{
Thread.sleep( tempo ) ;
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
public void keyPressed(KeyEvent e) {
// REPEINDRE LE JEU
repaint();
}
/*Action de MouseMotionListener */
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseDragged( MouseEvent e ) {}
public void mouseClicked(MouseEvent e) {
//-----------------------------------------//
// RECUPERER LES COORDONNEES DE LA SOURIS //
//-----------------------------------------//
xm=e.getX()/this.t;
ym=e.getY()/this.t;;
click = true;
repaint();
}
public void mouseMoved(MouseEvent e){}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
Oui tu vois tu as déja MouseListener, KeyListener etc... Pour récupérer l'action sur un composant c'est Actionlistener, oublie pas de l'implémenter en haut (tu le rajoute à la suite des implements x...)
Puis comme tu as dit tu rajoutes la méthode dans la classe :
public void actionPerformed(ActionEvent parEvt)
{
if(parEvt.getSource() == nomdubouton)
{
System.out.println("Le bouton a été cliqué");
}
}
Pour récupérer la source de l'action, tu fais parEvt.getSource(); donc pour vérifier que ça vient du bon bouton tu fais if(parEvt.getSource() == lenomdubouton) ...
Attention si ton bouton est dans une classe et que tu veux interagir avec une autre classe il faut la passer en paramètre du constructeur comme je t'ai montré au dessus
Ok merci beaucoup pour ton aide
Juste une dernière question, comment mettre le action listener ? parce que j'ai essayé de l'implémenter, sauf que ca m'a mis une erreur, j'ai donc essayer de rajouter une ligne importe etc actionlistener comme mouselistener, et ca me metre toujours une erreur : Actionlistener cannot be resolved to a type
Au temps pour moi, il suffisait de mettre une majuscule au L, sauf que maintenant j'ai une erreur sur affichage : The type Affichage must implement the inherited abstract method ActionListener.actionPerformed(ActionEvent)
En français ça donne il faut implémenter la méthode blablabla, c'est celle juste au dessus regarde voir
Excuse moi j'ai du m'absenter, je dois les placer ou ces lignes de codes :
public void actionPerformed(ActionEvent parEvt)
{
if(parEvt.getSource() == nomdubouton)
{
System.out.println("Le bouton a été cliqué");
}
}
dans la classe du bouton, je te l'ai donnée au dessus et c'est déja dans le code
Yep j'ai réussis merci, sinon par hasard, tu saurais pas comment généré des clilcs aléatoire en x et en y pour mélanger le taquin ?
J'ai pas très bien compris, mais tu peux simuler la pression sur un bouton avectonBoutton.doClick();
Si tu peux poster un screen de ton programme et me dire ou cliquer ça serait mieux

Voila, la fenetre du milieu c'est le jeu, et faut cliquer sur des cases aléatoirement pour le mélanger
Tu pourrais faire une boucle qui génère un nombre entre 37 et 40 et à chaque tour cela envoie la commande associée ?
for(int i=0; i<20; i++)
{
int commande = random.nextInt(40 - 37 + 1) + 37;
//tu fais ta fonction qui bouge le taquin en fonction du numéro de la commande ici
}J'ai pas compris tout ton code mais si chaque chiffre entre 37 et 40 correspond à gauche droite haut et bas alors tu devrais pouvoir faire quelque chose, ici ça enverrais une série de 20 touches aléatoires, il faut que tu rajoutes le code qui bouge le taquin en fonction de la commande dans la variable commande à la place de mon commentaire
j'ai essayer de le placer, mais ca me met cette erreur sur : random.nextInt
erreur : random cannot be resolved
for(int i=0; i<20; i++)
{
Random random = new Random();
int commande = random.nextInt(40 - 37 + 1) + 37;
//tu fais ta fonction qui bouge le taquin en fonction du numéro de la commande ici
}
package BaseProjet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Bouton extends JFrame {
private JButton button1 = new JButton("Bouton");
public static void main(String[] args) {
new Bouton();
}
public Bouton() {
this.setSize(275, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ClickListener cl = new ClickListener();
button1.addActionListener(cl);
button1.doClick();
this.add(button1);
this.setVisible(true);
}
private class ClickListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
button1.setText("Mélanger");
for(int i=0; i<20; i++)
{
Random random = new Random();
int commande = random.nextInt(40 - 37 + 1) + 37;
//tu fais ta fonction qui bouge le taquin en fonction du numéro de la commande ici
}
}
}}Je l'ai mis ici, mais ca fait rien, je dois le mettre autre part ?
Mais c'est normal que ça fasse rien je t'ai bien écrit
"il faut que tu rajoutes le code qui bouge le taquin en fonction de la commande dans la variable commande à la place de mon commentaire"
Faut te débrouiller un peu, pas copier coller bêtement, essaye de comprendre le code...
Si tu comprends pas pourquoi ça fait rien je sais pas comment tu as fait le reste