Mettre à jour le contenu d'une fenêtre

Résolu/Fermé
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 - 13 mai 2014 à 23:08
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 - 18 mai 2014 à 11:46
Bonjour,

Suite à mon précédent post, j'aimerais savoir comment faire pour mettre à jour le contenu de ma fenêtre quand je clique sur l'un des boutons de commande.

Dans le programme, j'ai créé une classe pour ouvrir ma fenêtre, m'affichant un tableau de boutons dont seuls quartes sont actifs (haut, bas, gauche, droite et reset). Dans cette classe, j'ai créé une procédure dans laquelle je donne les actions à effectuer quand l'utilisateur appuie sur un des boutons de commande. J'ai déjà essayé de faire marcher le truc vite fait dans la console et tout vas très bien, mais quand je fait afficher le jeu dans la fenêtre, rien ne se passe quand j'appuie sur les boutons de commande.

Merci d'avance pour votre aide.

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
13 mai 2014 à 23:22
(Re)Bonsoir,

Il faudrait voir comment tu as fait ton code, en particulier sur le lien entre les boutons et le démarrage des actions.

Est-ce que tu utilises une proglet particulière ?
0
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 274
13 mai 2014 à 23:57
J'ai fait une classe "JFrame implements Action listner" dans laquelle j'ai créé le tableau de boutons et j'ai affecté des couleurs aux boutons en fonction du contenu que j'ai dans un tableau d'entiers prédéfini.
Dans la classe, j'ai créé un procédure "public void actionPerformed(ActionEvent clic)" dans laquelle je fait effectuer les actions pour faire bouger la valeur représentant le pacman dans le tableau d'entier quand on clique sur un des boutons et je ne trouve pas comment changer l'apparence des boutons après ça...

Je travail dans la projet "Manuel ISN", je ne sais pas si ça changera grand chose de passer dans "Java prog"...
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 mai 2014 à 07:40
Est-ce que l'action s'exécute ou pas du tout ?
Dans ton constructeur as-tu pensé à faire un
addActionListener(this)
?
0
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 274
14 mai 2014 à 08:44
j'ai un
boutons[n][m].addActionListener(this);
pour écouter chacun des boutons du tableau puis j'ai un
boutons[n][m].setEnabled(false);
pour désactiver les boutons dont je ne me sert pas.
0
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 274
14 mai 2014 à 16:14
J'ai essayé de mettre un
Fenetre.repaint();
(pour refaire ma fenêtre) mais j'ai cette erreur :
Erreur de syntaxe ligne 203 :
non-static method repaint() cannot be referenced from a static context
Fenetre.repaint();
^
0
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 274
14 mai 2014 à 18:26
Après quelques recherches, j'ai mis :

getContentPane().removeAll();
getContentPane().validate();


au début de la procédure d'actionEvent clic pour effacer ce que j'ai sur mon panneau puis, à la fin :

getContentPane().revalidate();
getContentPane().repaint();

Pour ré afficher le panneau une fois les modifications faites, mais quand j'appuie sur un bouton, tout s'efface.
0
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 274
14 mai 2014 à 23:46
Voici le code sans les essais non concluants de rafraichissement du contenu de la fenêtre. Je ne suis pas tout seul sur le code, c'est un travail de groupe et je m'occupe de la partie affichage en particulier donc je ne suis pas à l'origine du reste mais j'ai compris ce qu'il se passe. Pour ce qui est de la commande du jeu, je préfère garder le code comme il est...

import java.awt.GridLayout;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Fenetre extends JFrame implements ActionListener{

//Initialisation du tableau des déplacements interdits
int[][] Labyrinthe = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1},
{1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
int Y=1;
int X=1;

//Instanciation et construction d'un JPanel qui sera le "volet contenu" de notre fenêtre
JPanel pan = new JPanel();
//Instanciation et construction d'un tableau de 13*15 boutons
JButton[][] boutons= new JButton[15][13];

//Constructeur de la fenêtre
Fenetre(){
pan.setBackground(Color.BLACK);
//Taille de la fenêtre
this.setSize(600, 650);
//Positionnement de la fenêtre
this.setLocation(0, 0);
//Agencement du volet contenu en grille de dimension 13*15
pan.setLayout(new GridLayout(15,13,5,5));
for (int n=0;n<15;n++){
for (int m=0;m<13;m++){
//Instanciation et construction d'un bouton
JButton bout=new JButton();
//que l'on place dans la tableau aux coordonées (n;m)
boutons[n][m]=bout;
boutons[n][m].setBackground(Color.WHITE);
//Ajout du bouton au volet contenu de la fen?tre
pan.add(boutons[n][m]);
//On demande à la fenêtre d'écouter chacun des boutons
boutons[n][m].addActionListener(this);
}
}

// Mise en place du Texte sur les Boutons de commande
boutons[13][11].setText("Haut");
boutons[14][10].setText("Gauche");
boutons[14][11].setText("Bas");
boutons[14][12].setText("Droite");
//Mise n place de la coueur et du Texte du bouton "reset"
boutons[13][12].setBackground(Color.GREEN);
boutons[13][12].setText("Reset");

//Définition des boutons représentant l'écran de jeu en fonction du tableau prédéfini au début
for (int n=0;n<13;n++){
for (int m=0;m<13;m++){
//Obstacles
if(Labyrinthe[n][m]==1){
//Définition de la couleur du bouton
boutons[n][m].setBackground(Color.BLACK);
//Désactivation du bouton
boutons[n][m].setEnabled(false);
}
//Cases vides
if(Labyrinthe[n][m]==2){
boutons[n][m].setBackground(Color.BLUE);
boutons[n][m].setEnabled(false);
}
//Cases contenant une pac-gomme
if(Labyrinthe[n][m]==0){
boutons[n][m].setBackground(Color.WHITE);
boutons[n][m].setEnabled(false);
}
//Case où se situe pacman
if(Labyrinthe[n][m]==3){
boutons[n][m].setBackground(Color.YELLOW);
boutons[n][m].setEnabled(false);
}
}
}

//Définition des boutons ne servant pas
for (int n=13;n<15;n++){
for (int m=0;m<10;m++){
//Définition de la couleur
boutons[n][m].setBackground(Color.RED);
//Désactivation du bouton
boutons[n][m].setEnabled(false);
}
}
//Désactivation d'un bouton
boutons[13][10].setBackground(Color.RED);
boutons[13][10].setEnabled(false);

//Déclaration de "pan" comme volet contenu de la fenêtre
this.setContentPane(pan);
//Demande de rendre la fenêtre visible
this.setVisible(true);
}


//Méthode permettant de "faire quelque chose" lorsque l'on a cliqué sur un des boutons
public void actionPerformed(ActionEvent clic) {

//Test pour savoir si le bouton (n;m) a été cliqué

//Si l'on appuie sur le bouton Reset
if (clic.getSource()==boutons[13][12]){
//Effecer ce qui à été affiché en console
clear();
//Vérification des valeurs cases par cases
for(int a=0; a<13; a++){
for(int b=0; b<13; b++){
//Pour toutes les cases différentes de 1 et 0, affecter 0 à la case
if ((Labyrinthe[b][a]!=1) &&( Labyrinthe[b][a]!=0)){
Labyrinthe[b][a]=0;
X=1;
Y=1;
}
}
}

//Remise de pacman à son point d'origine
Labyrinthe[1][1]=3;

}
//si on appuie sur le bouton Haut
if (clic.getSource()==boutons[13][11] && ((0<=Y) && (Y<=12))){
// si la valeur de la case du haut est de 1, pacman ne bouge pas
if (Labyrinthe[X-1][Y]==1){
Labyrinthe[X][Y]=3;
}else{
//Sinon il va sur la case demandée
Labyrinthe[X][Y]=2;
Labyrinthe[X-1][Y]=3;
X=X-1;
}
clear();
}
//si on appuie sur le bouton Gauche
if (clic.getSource()==boutons[14][10]&& ((0<=X) && (X<=12))){
//Si la valeur de la case de gauche est à 1, pacman ne bouge pas
if (Labyrinthe[X][Y-1]==1){
Labyrinthe[X][Y]=3;
}else{
// sinon il va sur la case demandée
Labyrinthe[X][Y]=2;
Labyrinthe[X][Y-1]=3;
Y=Y-1;
}
clear();
}
//Si on appuie sur le bouton Bas
if (clic.getSource()==boutons[14][11]&& ((0<=Y) && (Y<=12))){
//Si la valeur de la case de dessous est à 1, pacman ne bouge pas
if (Labyrinthe[X+1][Y]==1){
Labyrinthe[X][Y]=3;
}else{
//Sinon il va sur la case demandée
Labyrinthe[X][Y]=2;
Labyrinthe[X+1][Y]=3;
X=X+1;
}
clear();
}
//Si on appuie sur le bouton Droite
if (clic.getSource()==boutons[14][12]&& ((0<=X) && (X<=12))){
//Si la valeur de la case de droite est à 1, pacman ne bouge pas
if (Labyrinthe[X][Y+1]==1){
Labyrinthe[X][Y]=3;
}else{
// sinon il va sur la case demandée
Labyrinthe[X][Y]=2;
Labyrinthe[X][Y+1]=3;
Y=Y+1;
}
clear();
}

//Affichage numérique dans la console
for(int a=0; a<13; a++){
for(int b=0; b<13; b++){
System.out.print(" "+Labyrinthe[a][b]+" ");
}
println(" ");
}

}
}

void main() {
//instanciation et construction d'une fenêtre
Fenetre fen = new Fenetre();
}

Merci encore pour le temps que tu m'accorde.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 15/05/2014 à 19:46
Alors...

Lorsque tu fais une action pour l'instant la seule chose que ça fait c'est changer la valeur du tableau.

// si on appuie sur le bouton Haut
if (clic.getSource() == boutons[13][11] && ( (0 <= Y) && (Y <= 12)))
{
    // si la valeur de la case du haut est de 1, pacman ne bouge pas
    if (Labyrinthe[X - 1][Y] == 1)
    {
        Labyrinthe[X][Y] = 3;
    }
    else
    {
        // Sinon il va sur la case demandée
        Labyrinthe[X][Y] = 2;
        Labyrinthe[X - 1][Y] = 3;
        X = X - 1;
    }
    clear();
}

Mais cela ne suffit pas, car il faut aussi changer tes boutons (ça ne va pas se faire tout seul).

    else
    {
        // Sinon il va sur la case demandée
        Labyrinthe[X][Y] = 2;
        boutons[X][Y].setBackground(Color.WHITE);
        Labyrinthe[X - 1][Y] = 3;
        boutons[X - 1][Y].setBackground(Color.YELLOW);
        X = X - 1;
    }

Du coup, pas besoin de repaint, ça va se faire tout seul.

Pour en revenir aux quelques conseils que je te donnais hier, je trouve vraiment dommage de faire
boutons[n][m].addActionListener(this);
c'est à dire de mettre le même listener pour tous les boutons, alors qu'il n'y a que 5 boutons sur lesquels on va appuyer et qu'ils vont tous faire une action différente.

Tu pourrais faire ainsi qui est plus propre :

// Mise en place du Texte sur les Boutons de commande
boutons[13][11].setText("↑");
boutons[13][11].addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e)
    {
        if (X==0) // on ne peut pas faire Labyrinthe[X-1][Y]
            return; 

        // si la valeur de la case du haut est de 1, pacman ne bouge pas
        if (Labyrinthe[X - 1][Y] == 1)
        {
            Labyrinthe[X][Y] = 3; // inutile non ? pac-man est déjà là...
        }
        else
        {
            // Sinon il va sur la case demandée
            Labyrinthe[X][Y] = 2;
            boutons[X][Y].setBackground(Color.WHITE);
            Labyrinthe[X - 1][Y] = 3;
            boutons[X - 1][Y].setBackground(Color.YELLOW);
            X = X - 1;
        }
    }
});

Et pareil pour les 4 autres boutons...
0
Giac Messages postés 1262 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 17 septembre 2016 274
18 mai 2014 à 11:46
Désolé de répondre aussi tard, mais j'avais des dossiers à faire donc je ne me suis pas trop penché dessus, mais c'est bon, ça marche enfin, merci beaucoup, grâce à ton aide, je pourrais présenter un programme qui marche.

Merci pour le temps que ça a du te prendre =D
0