Matrice interface graphique java [Résolu/Fermé]

Signaler
Messages postés
41
Date d'inscription
lundi 1 décembre 2014
Statut
Membre
Dernière intervention
16 mars 2016
-
Messages postés
41
Date d'inscription
lundi 1 décembre 2014
Statut
Membre
Dernière intervention
16 mars 2016
-
Saluuut  je suis debutante en javax (j'apprends tout seule)  ,je veux creer une matrice en java contenant des bouton , en on cliquant le bouton changera d'icone     (soit 1 , soit 0 , ou null) 


J'ai un probleme au niveau de l'affichage de la matrice , Elle n'est pas assez ordonnée
et les boutons ne change pas d'icone
Bon voici mon programme

Merci de m'aider :)

package graphe;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class Matrice extends JFrame  implements ActionListener {
  
    private JLabel [] horizon ;
    private JLabel [] vertical ;
    private JButton [][]centre ;
    private JPanel container ;
    private Dimension dim = new Dimension(40, 40);
     ImageIcon one ,zero  ;
        Byte value=0;
int i=0;
    
    public Matrice(){
        this.setSize(700, 700);
        this.setTitle("Matrice du graphe");
        this.setLocationRelativeTo(null);
        this.setLocale(java.util.Locale.getDefault());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initialisation();
        this.setContentPane(container);
        this.setVisible(true);
        

    }
    
    public void initialisation(){
        container=new JPanel();
        one = new ImageIcon("C:\\Users\\HP\\Documents\\NetBeansProjects\\Graphe\\src\\graphe\\1.jpg");
        zero=new ImageIcon("C:\\Users\\HP\\Documents\\NetBeansProjects\\Graphe\\src\\graphe\\0.jpg");
JLabel  horizon[] =new JLabel[10];
JLabel  vertical[]=new JLabel[10];
JButton centre[][]=new JButton[10][10];
        
     JPanel Sommet1 = new JPanel();      
     Sommet1.setPreferredSize(new Dimension(520,60));
    JPanel bouton = new JPanel();
    bouton.setPreferredSize(new Dimension(520, 520));
    JPanel sommetv = new JPanel();
    sommetv.setPreferredSize(new Dimension(60,520));
    
    JLabel vide = new JLabel();
    vide.setPreferredSize(dim);
    Sommet1.add(vide);    
    
    for(i=0; i<10 ; i++){
        horizon[i]=new JLabel("V"+(i+1));
        horizon[i].setPreferredSize(dim);
        Sommet1.add(horizon[i]);
        vertical[i]=new JLabel("V"+(i+1));
        vertical[i].setPreferredSize(dim);
        sommetv.add(vertical[i]);
  } 
    
    for(int x=0;x<10;x++)
    {for (int n=0;n<10;n++)
    { centre[x][n]=new JButton();      
    centre[x][n].setPreferredSize(dim);
    
         centre[x][n].addActionListener(this);
          bouton.add(centre[x][n]);
    }}
 container.add(Sommet1 , BorderLayout.NORTH);
     container.add(sommetv, BorderLayout.WEST);

 container.add(bouton, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    value++;
    
    
   witch (value)
    {
        case 0 :
        centre[x][n].setIcon(null);
        break;
        
    case 1:
        centre[x][n].setIcon(zero);
        break;
        
    case 2:
  centre[x][n].setIcon(one);
        break;    } 
}
}

1 réponse

Messages postés
16122
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 740
Bonjour,

"je suis debutante en javax"
Déjà un peu de vocabulaire, "javax" ne désigne rien de particulier, ça regroupe juste un ensemble de bibliothèques qui ont été développées à l'origine par des tiers avant d'être incorporés à l'API standard Java.
Dans ton cas on dirait plutôt que tu es débutante en Swing.

Ensuite, ton code ne compile pas, il y a des bugs sur ton actionPerformed (le "witch" au lieu de "switch" et les variables x et n qui n'existent pas...) mais j'essaye même pas de déboguer ça, on va reprendre tout depuis le début.

Tu as ce que l'on appelle des Layout qui permettent de gérer la disposition des composants Swing, en l'occurence puisque tu fais une grille, un GridLayout serait l'idéal. (How to Use GridLayout).
Voici une refonte de ton code avec un GridLayout :

package graphe;

public class Test {
    public static void main(String[] args) {
        new Matrice(10,10);
    }
}
package graphe;

import java.awt.GridLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Matrice extends JFrame  {

    private static final long serialVersionUID = 1L;
    
    private final int width;
    private final int height;
    
    private final JLabel[] horizon;
    private final JLabel[] vertical;
    private final JButton[][] centre;

    private final ImageIcon ZERO = new ImageIcon("0.jpg");
    private final ImageIcon ONE = new ImageIcon("1.jpg");
    
    public Matrice(int width, int height) {
        this.width = width;
        this.height = height;
        
        horizon = new JLabel[width];
        vertical = new JLabel[height];
        centre = new JButton[width][height];
        
        initFrame();
        fillContent();
        
        this.setVisible(true);
    }
    
    private void initFrame() {
        this.setSize(700, 700);
        this.setTitle("Matrice du graphe");
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private JLabel createColumnHeader(int x) {
        horizon[x] = new JLabel("H" + (x + 1));
        return horizon[x];
    }

    private JLabel createRowHeader(int y) {
        vertical[y] = new JLabel("V" + (y + 1));
        return vertical[y];
    }
    
    private JButton createCell(int x, int y) {
        centre[x][y] = new JButton();
        centre[x][y].addActionListener(new MatriceListener(this,x,y));
        return centre[x][y];
    }
    
    public void fillContent() {

        this.setLayout(new GridLayout(width+1, height+1));
        
        this.add(new JLabel());
        
        for (int x = 0; x < width; x++)
            this.add(createColumnHeader(x));
        
        for (int y = 0; y < height; y++) {
            this.add(createRowHeader(y));
            for (int x=0; x<width; x++)
                this.add(createCell(x,y));
        }
    }
    
    public void setIcon(int x, int y) {
        centre[x][y].setIcon(ONE);
    }
}
package graphe;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MatriceListener implements ActionListener {
    
    private final Matrice mat;
    private final int x;
    private final int y;
    
    public MatriceActionListener(Matrice mat, int x, int y) {
        this.mat = mat;
        this.x = x;
        this.y = y;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        mat.setIcon(x,y);
    }
}
La confiance n'exclut pas le contrôle
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76687 internautes nous ont dit merci ce mois-ci

Messages postés
41
Date d'inscription
lundi 1 décembre 2014
Statut
Membre
Dernière intervention
16 mars 2016

"afficher la relation entre chaque label H avec un label V" :
en fait cette matrice represente un graphe . si une case de la matrice contient la valeur 1 donc il y a une arête entre les deux sommet sinon il n y a pas , c'est ça le principe .
donc je vais afficher ce resultat avec le bouton "valider" et j'ai pensé d'instancier une matrice d'entier dans actionPerformed et l'affecter au constructeur de la nouvelle fenetre en cliquant sur valider , je pense que c'est la meilleur solution .

mais j'ai pas réussi à apparaitre le bouton valider en dessous de la matrice ,
j'ai besoin de votre aide s'il vous plait !
Messages postés
16122
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 740
"j'ai pas réussi à apparaitre le bouton valider en dessous"
En supposant que tu ais créé un
JButton goButton
avant, tu peux modifier comme ceci :

public void fillContent() {

    JPanel gridPanel = new JPanel();
    gridPanel.setLayout(new GridLayout(height+1, width+1));
    
    gridPanel.add(new JLabel());
    
    for (int x = 0; x < width; x++)
    gridPanel.add(createColumnHeader(x));
    
    for (int y = 0; y < height; y++) {
        gridPanel.add(createRowHeader(y));
        for (int x=0; x<width; x++)
            gridPanel.add(createCell(x,y));
    }
    
    this.setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
    this.add(gridPanel);
    this.add(goButton);
}

"j'ai pensé d'instancier une matrice d'entier"
Pourquoi d'entiers ? Ta case est soit cliquée, soit non, des booléens suffiraient.
D'ailleurs pourquoi avoir mis des JButton dans la grille ? Tu aurais pu mettre des JCheckBox (How to Use Buttons, Check Boxes, and Radio Buttons)
Messages postés
41
Date d'inscription
lundi 1 décembre 2014
Statut
Membre
Dernière intervention
16 mars 2016

D'accord Mr je retourne dans cette discussion :) ,
"Et ça a marché ?"
j'ai voulu vous dire que j'ai réussit changer les couleurs de mes boutons ( j'ai pas mis un point d'interrogation c'est juste faute de frappe. et j'ai pas fait attention . )

Et pour le goButton j'ai écrit ce code
NB : value est une matrice d'entier que je l'ai instancier dans la classe Matrice
et je veux affecter value à la nouvelle fenêtre "Resultat"


goButton.addActionListener(this);
..
@Override
public void actionPerformed(ActionEvent e) {
Resultat R = new Resultat(value);
this.dispose();
}


public class Resultat extends JFrame {

private final int Mat[][];

public Resultat(int Mat[][]){
this.setSize(400, 400);
this.setVisible(true);
this.Mat=Mat;
}
}
Messages postés
41
Date d'inscription
lundi 1 décembre 2014
Statut
Membre
Dernière intervention
16 mars 2016

Voici le code que j'ai écrit pour la matrice value

public void compteur (){
for(int i=0;i<width;i++)
{ for(int j=0;j<width;j++)
value[i][j]=0;
}
}

et dans actionPerformed j'ai changé setIcon par setColor

public void actionPerformed(ActionEvent e) {
value[x][y]++;
if (value[x][y]%2==1)
mat.setColor(x,y);
else
mat.setColorNull(x,y);}
Messages postés
41
Date d'inscription
lundi 1 décembre 2014
Statut
Membre
Dernière intervention
16 mars 2016

C'est bon j'ai testé le code et ça marche très bien , Merci pour votre aide :)