Matrice interface graphique java

Résolu/Fermé
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016 - Modifié par KX le 19/03/2015 à 18:19
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016 - 22 mars 2015 à 00:01
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;    } 
}
}
A voir également:

1 réponse

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 21/03/2015 à 18:01
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
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016
21 mars 2015 à 13:40
Mercii infiniment pour vos conseils , Et pour le code :)
J'ai encore une petite question si ça ne vous dérange pas , je veux créer un bouton "Valider" sous la matrice , Est-ce que je dois diviser la fenêtre en deux sous panel ? un panel pour la matrice et un autre pour le bouton .
De plus ce bouton permet de compter le nombre de bouton cliqué dans la matrice et afficher la relation entre chaque label H avec un label V. et cet affichage dois apparaître dans une autre fenêtre , est t-il possible de faire ça ??
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 mars 2015 à 15:24
"Est-ce que je dois diviser la fenêtre en deux sous panel ?"
Oui, en combinant plusieurs Layout (A Visual Guide to Layout Managers)

"ce bouton permet de compter le nombre de bouton cliqué"
Ce n'est pas le bouton qui compte, tout au plus il affichera le résultat, mais l'action sera sur chacun des boutons cliqués.

"afficher la relation entre chaque label H avec un label V"
Je n'ai pas compris ce que tu voulais faire là...

"cet affichage dois apparaître dans une autre fenêtre"
Dans ce cas, créé toi un deuxième JFrame pour cet affichage, tu peux ouvrir autant de fenêtre que tu veux, ça ne pose pas de problème.
0
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016
21 mars 2015 à 17:00
"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 !
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 mars 2015 à 18:15
"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)
0
Nouyou Messages postés 41 Date d'inscription lundi 1 décembre 2014 Statut Membre Dernière intervention 16 mars 2016
21 mars 2015 à 23:06
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;
}
}
0