Partage
  • Partager sur Facebook
  • Partager sur Twitter

tableau dynamique

    23 janvier 2012 à 15:56:14

    Bonjour à tous les zéros,
    voici 3 semaines que je galère avec ce tableau!
    il doit être dynamique, avec possibilité d'ajouter ou de modifier une ligne via une seconde fenêtre
    voici le code de la fenêtre principale
    package Apparence;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.Vector;
    
    import javax.swing.*;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    
    import application.ProjetDUT;
    
    public class TableauDesInvariants extends JFrame implements ActionListener, KeyListener
    {
    	private JButton ajouter = new JButton("Ajouter");
    	private JButton modifier = new JButton("Modifier");
    	private JButton supprimer = new JButton("Supprimer");
    	private Object[][] dataModel = {{"pc1","ordinateur qui envoie les données"},
    		{"pc2","ordi qui les reçoit"}};
    	private String[] columnName = {"identifiant de l'invariant","libellé de l'invariant"};
    	Model model = new Model(dataModel,columnName);
    	public class Model extends AbstractTableModel
    	{
    		Object[][] data;
    		String[] titres;
    		public Model(Object[][] dataModel, String[] columnName)
    		{
    			this.data=dataModel;
    			this.titres=columnName;
    		}
    		@Override
    		public int getColumnCount() 
    		{
    			return this.titres.length;
    		}
    		@Override
    		public int getRowCount() 
    		{
    			return this.data.length;
    		}
    		@Override
    		public Object getValueAt(int arg0, int arg1) 
    		{
    			return this.data[arg0][arg1];
    		}
    		
    		public void removeRow(int position){
    			
    			int indice = 0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
    			Object temp[][] = new Object[nbRow][nbCol];
    			
    			for(Object[] value : this.data){
    				if(indice != position){
    					temp[indice2++] = value;
    				}
    				System.out.println("Indice = " + indice);
    				indice++;
    			}
    			this.data = temp;
    			temp = null;
    			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
    			//Ce qui permet une mise à jours complète du tableau
    			this.fireTableStructureChanged();
    		}
    		
    		public void addRow(Object[] data)
    		{
    			int indice=0;
    			Object[][] temp = this.data;
    			int nbLignes=this.getRowCount();
    			int nbCol=this.getColumnCount();
    			this.data=new Object[nbLignes+1][nbCol];
    			for (Object[] value : temp)
    			{
    				this.data[indice++]=value;
    			}
    			this.data[indice]=data;
    			temp=null;
    			this.fireTableDataChanged();
    		}
    		
    		public String getColumnName(int col) {
    		  return this.titres[col];
    		}
    	}
    	public JTable tableau = new JTable(model);
    	private JScrollPane barres_defilement = new JScrollPane(tableau);
    	private JPanel boutons = new JPanel();
    	
    	private void miseEnPlace()
    	{
    		GridLayout grid = new GridLayout(1,3);
    		this.boutons.setLayout(grid);
    		this.boutons.add(ajouter);
    		this.boutons.add(modifier);
    		this.boutons.add(supprimer);
    		this.add(boutons,BorderLayout.SOUTH);
    		this.getContentPane().add(barres_defilement,BorderLayout.CENTER);
    	}
    	
    	public void ecouteur()
    	{
    		this.ajouter.addActionListener(this);
    		this.modifier.addActionListener(this);
    		this.addKeyListener(this);
    		this.ajouter.setFocusable(false);
    		this.modifier.setFocusable(false);
    		this.setFocusable(true);
    	}
    	
    	public TableauDesInvariants (String name)
    	{
    		super(name);
    		miseEnPlace();
    		ecouteur();
    	}
    
    	@Override
    	public void keyPressed(KeyEvent e) 
    	{
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void keyReleased(KeyEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void keyTyped(KeyEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent arg0) 
    	{
    		if (arg0.getSource()==ajouter)
    		{
    			int row=this.tableau.getSelectedRow();
    			AjoutInvariants ajout = new AjoutInvariants(null,null,row);
    			ajout.setVisible(true);
    			ajout.setMinimumSize(new Dimension(400,100));
    		}
    		if (arg0.getSource()==modifier)
    		{
    			int row=this.tableau.getSelectedRow();
    			Object identifiant=tableau.getValueAt(row, 0);
    			Object libelle=tableau.getValueAt(row, 1);
    			AjoutInvariants ajout = new AjoutInvariants(identifiant,libelle,row);
    			ajout.setVisible(true);
    			ajout.setMinimumSize(new Dimension(400,100));
    		}
    		if(arg0.getSource()==supprimer)
    		{
    			int row=this.tableau.getSelectedRow();
    			((DefaultTableModel)this.tableau.getModel()).removeRow(row);
    		}
    	}
    }
    

    je ne comprend pas non plus pourquoi mais depuis que j'ai placé les méthodes addRow() et modifLigne() dans la classe Model, je n'ai plus le nom de mes colonnes qui s'affiche....... et si je les met dans la classe TableauDesInvariants, j'ai d'énormes exceptions et impossible d'utiliser la fonction de mise à jour pour mon tableau..... o_O

    et voici le code de la seconde fenêtre
    package Apparence;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    import javax.swing.*;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
    
    import application.ProjetDUT;
    
    public class AjoutInvariants extends JFrame implements ActionListener, KeyListener
    {
    	private JButton valider = new JButton("Valider");
    	private JTextField id = new JTextField();
    	private JTextField libelle = new JTextField();
    	private JLabel iD = new JLabel("identifiant");
    	private JLabel lIbelle = new JLabel("libellé");
    	private JLabel oldValues = new JLabel("anciennes valeurs");
    	private JLabel oldId = new JLabel();
    	private JLabel oldLibelle = new JLabel();
    	int row;
    	
    	private void miseEnPlace()
    	{
    		this.setLayout(new GridBagLayout());
    		GridBagConstraints cont=new GridBagConstraints();
    		cont.weightx=1.0;
    		cont.weighty=1.0;
    		cont.gridheight=1;
    		cont.gridwidth=1;
    		cont.fill=GridBagConstraints.BOTH;
    		cont.gridx=0;
    		cont.gridy=0;
    		this.add(oldValues,cont);
    		cont.gridy=1;
    		this.add(oldId,cont);
    		cont.gridy=2;
    		this.add(oldLibelle,cont);
    		cont.gridy=3;
    		cont.gridwidth=3;
    		this.add(valider,cont);
    		cont.gridwidth=1;
    		cont.gridx=1;
    		cont.gridy=1;
    		this.add(iD,cont);
    		cont.gridy=2;
    		this.add(lIbelle,cont);
    		cont.gridx=2;
    		cont.gridy=1;
    		this.add(id,cont);
    		cont.gridy=2;
    		this.add(libelle,cont);
    	}
    	
    	public AjoutInvariants(Object identifiant,Object libelle2, int row)
    	{
    		super("ajouter ou modifier un invariant");
    		miseEnPlace();
    		oldId.setText((String) identifiant);
    		oldLibelle.setText((String)libelle2);
    		this.row=row;
    	}
    
    	@Override
    	public void keyPressed(KeyEvent arg0) 
    	{
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void keyReleased(KeyEvent arg0) 
    	{
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void keyTyped(KeyEvent arg0) 
    	{
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) 
    	{
    		if (oldId==null && oldLibelle==null)
    		{
    			if (e.getSource()==valider)
    			{
    				Object[] data={this.getid(),this.getlibelle()};
    				((DefaultTableModel)ProjetDUT.test.tableau.getModel()).addRow(data);
    			}
    		}
    		if (oldId!=null && oldLibelle!=null)
    		{
    			if (e.getSource()==valider)
    			{
    				Object[] data={this.getid(),this.getlibelle()};
    				((DefaultTableModel)ProjetDUT.test.tableau.getModel()).removeRow(row);
    				((DefaultTableModel)ProjetDUT.test.tableau.getModel()).addRow(data);
    			}
    		}
    	}
    	
    	public Object getid()
    	{
    		return id;
    	}
    	
    	public Object getlibelle()
    	{
    		return libelle;
    	}
    }
    

    pour l'instant le bouton valider ne ferme pas la fenêtre mais je pense pouvoir m'en débrouiller

    merci d'avance à tous les zéros pour leur aide
    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2012 à 16:05:16

      Je crois que l'utilisation d'un vecteur serait plus approprié.
      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2012 à 16:06:19

        Ouaip, moi j'utiliserais un vecteur, c'est paresseux, mais c'est fiable!
        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2012 à 16:07:59

          c'est à dire?
          je n'ai jamais entendu parler des vecteurs auparavant, je ne sais utiliser correctement que les listes et j'avais entendu parler des tableaux mais jamais des vecteurs.....

          et j'ai oublié de préciser que je fait cette application bénévolement pour l'entreprise d'un membre de ma famille, et il y a 2 autres tableaux comme celui-ci :waw:
          je pensais donc qu'un tableau était le plus simple à utiliser pour lui qui n'y connaît absolument rien.... :euh:
          • Partager sur Facebook
          • Partager sur Twitter
            23 janvier 2012 à 16:17:47

            Un vecteur permet de modifier de façon dynamique une structure de donnée. Voici la page de l'api: http://docs.oracle.com/javase/1.4.2/do [...] l/Vector.html

            Je vais laisser Gladhus t'expliquer comment instancier et utiliser le vecteur.
            • Partager sur Facebook
            • Partager sur Twitter
              23 janvier 2012 à 16:19:55

              Merci Bismutho,

              // On l'instancie comme ça (Entre crochets on lui donne un type (Double, Integer, String, etc.))
              Vector<Integer> monVecteur = new Vector<Integer>();
              
              // Ensuite on ajoute des éléments comme cela
              monVecteur.add(1);
              


              le reste est relativement simple a comprendre en lisant l'API...
              • Partager sur Facebook
              • Partager sur Twitter
                23 janvier 2012 à 16:34:35

                Merci d'avoir complété mon explication mon chère Gladhus.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 janvier 2012 à 16:38:14

                  je viens de lire dans l'API que Vector<> ne peut avoir qu'un seul type :o , or les deux colonnes de mon tableau sont liées.....
                  de plus, comme je l'ai expliqué, la personne pour qui je fais cette application est (archi)nulle en informatique,
                  ce ne serait que pour moi je me ficherai royalement du graphisme et de l'ultra simplicité d'utilisation de l'appli
                  mais ce n'est pas le cas et je voudrais vraiment lui faire une bonne appli simple à utiliser... :honte::'(
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 janvier 2012 à 16:42:08

                    Si je ne me trompe pas tu peut instancier ton vecteur avec un "Object" ainsi: new Vector<Object>. Sérieusement je crois qu'un vecteur simplifirais ton application, mais la personne pour qui tu programme aura t'elle a modifier le programme?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 janvier 2012 à 16:45:14

                      non non, il n'aura pas à modifier le programme! :D (le pauvre je vais pas lui infliger ça!)
                      alors le vecteur en le plaçant dans une JList pourrait vraiment faire l'affaire pour un nul?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 janvier 2012 à 16:47:31

                        Malheureusement, je ne connais pas beaucoup le swing, mais c'est fort probablement possible!
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 janvier 2012 à 17:31:54

                          Regardes du côté des collections ? Les ArrayList acceptent tout type de données donc ça devrait passer .

                          Regardes ici ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          ⚙️ Une solution simple règle le problème ; une solution compliquée en crée un nouveau.
                            25 janvier 2012 à 22:35:00

                            j'ai réussi à régler 2,3 petits problèmes..... le nom de mes colonnes s'affichent à nouveau et j'ai remplacé ma fonction de modification par une suppression de la ligne concernée et en en créant une nouvelle avec les nouvelles données
                            mais le tableau ne se modifie toujours pas......... sachant que j'ai pris les méthodes d'ajout et de suppression de ligne du tuto (très bien fait, il m'a déjà beaucoup aidé!!!) elles sont censées fonctionner......
                            je sais que je suis tenace mais le destinataire de cette appli veut ABSOLUMENT des tableaux..... :'(:'(
                            et puis..... je suis si près du but et j'en bave tellement que je n'ai pas vraiment envie de lacher ce tableau......
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 janvier 2012 à 22:43:34

                              Ne pas utiliser Vector, c'est obsolète ! >_< Utilisez les List (ArrayList)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 janvier 2012 à 22:48:15

                                C'est même déconseillé depuis 1998. Pourquoi ne faut-il plus l'utiliser ? Réponse ici : http://java.developpez.com/faq/java/?p [...] CTIONS_vector

                                Qui vous a apprit à utiliser une antiquité pareille ?
                                C'est une vraie question, je n'arrive pas à comprendre pourquoi cette chose ressort encore aussi souvent.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 janvier 2012 à 23:17:52

                                  j'ai fait un test pour voir si le problème de non-modification venait des méthodes ou du bouton de ma seconde fenêtre..... j'ai donc ajouté un nouveau bouton supprimer, normalement en cliquant sur la ligne puis sur ce bouton la ligne devrait disparaître...... eh beh nan :oo_O
                                  le problème viendrait-il donc de mes méthodes?????
                                  je vous les met au cas où.......

                                  public void removeRow(int position){
                                  			
                                  			int indice = 0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
                                  			Object temp[][] = new Object[nbRow][nbCol];
                                  			
                                  			for(Object[] value : this.data){
                                  				if(indice != position){
                                  					temp[indice2++] = value;
                                  				}
                                  				System.out.println("Indice = " + indice);
                                  				indice++;
                                  			}
                                  			this.data = temp;
                                  			temp = null;
                                  			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
                                  			//Ce qui permet une mise à jours complète du tableau
                                  			this.fireTableDataChanged();
                                  		}
                                  		
                                  		public void addRow(Object[] data)
                                  		{
                                  			int indice=0;
                                  			Object[][] temp = this.data;
                                  			int nbLignes=this.getRowCount();
                                  			int nbCol=this.getColumnCount();
                                  			this.data=new Object[nbLignes+1][nbCol];
                                  			for (Object[] value : temp)
                                  			{
                                  				this.data[indice++]=value;
                                  			}
                                  			this.data[indice]=data;
                                  			temp=null;
                                  			this.fireTableDataChanged();
                                  		}
                                  


                                  voilà, comme je l'ai écris dans mon dernier commentaire ces deux méthodes sont extrêmement similaires à celles du tutoriel.......
                                  merci encore pour votre aide
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 janvier 2012 à 10:28:40

                                    Salut, si tu supprime une ligne c'est pas this.fireTableDataChanged(); (modification de données, contenu) qu'il faut utiliser mais this.fireTableStructureChanged(); (modification de structure) ... comme leurs nom respectif l'indique.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 janvier 2012 à 13:06:56

                                      merci, ça je le savais pas......
                                      mais je n'ai aucune amélioration au niveau de l'exécution......


                                      je modifie le tout premier message pour que le texte soit à jour, cela vous aidera peut-être à trouver ce qui cloche dans mon code
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 janvier 2012 à 13:59:27

                                        Comment ce fait-il que tu fasse @Override sur des méthode d'interface, ça c'est seulement sur les classe étendu cette annotation.

                                        Je voulais tester ton code mais ProjetDUT.test.tableau.getModel() c'est quoi?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 janvier 2012 à 16:15:33

                                          Citation : ninlock

                                          Comment ce fait-il que tu fasse @Override sur des méthode d'interface, ça c'est seulement sur les classe étendu cette annotation.


                                          Faux, ça marche aussi sur les méthodes d'interface depuis Java 6.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 janvier 2012 à 16:23:55

                                            Exact, mais comme ce n'est pas obligatoire autant ne pas le mettre d'autant que si le compilateur est 1.5, et que tu utilise un IDE tu as des erreurs.

                                            Par contre, c'est bien de préciser ce genre de chose, mais cela aurait était sympa de ta part de donner aussi une réponse ou au moins une piste au créateur de ce sujet. D'autant que tu m'as l'air d'être assez doué en java.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              26 janvier 2012 à 16:35:18

                                              Citation : ninlock

                                              Exact, mais comme ce n'est pas obligatoire autant ne pas le mettre d'autant que si le compilateur est 1.5, et que tu utilise un IDE tu as des erreurs.


                                              En 2012 sur un projet amateur, tu es sur java 7 ou au pire java 6, donc tu le laisse ^^

                                              Citation : ninlock

                                              Par contre, c'est bien de préciser ce genre de chose, mais cela aurait était sympa de ta part de donner aussi une réponse ou au moins une piste au créateur de ce sujet. D'autant que tu m'as l'air d'être assez doué en java.


                                              J'aurais pu, mais pour cela il aurait fallu que je me penche sur son problème. Ce qui n'est pas (encore ?) le cas.
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              tableau dynamique

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown