tableau dynamique java

tableau dynamique java - Java - Programmation

Marsh Posté le 24-01-2012 à 21:44:35    

Bonjour à tous,
je crée une application pour la société d'un membre de ma famille, celle-ci contient pas mal de tableau et cette personne m'a expressément demandé des tableaux
comme ils sont tous à peu près similaires je n'ai ai fait qu'un seul pour l'instant
voici donc 3 semaines que je galère avec ce tableau!  :pfff:  :??:  
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
 
[java]
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 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 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 modifLigne(Object[] data)
  {
   int indice=ProjetDUT.test.tableau.getSelectedRow();
   this.data[indice]=data;
   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();
  }
 }
 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,2);
  this.boutons.setLayout(grid);
  this.boutons.add(ajouter);
  this.boutons.add(modifier);
  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);
   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);
   ajout.setVisible(true);
   ajout.setMinimumSize(new Dimension(400,100));
  }
 }
}
[/java]
 
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
 
[java]
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();
 
 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)
 {
  super("ajouter ou modifier un invariant" );
  miseEnPlace();
  oldId.setText((String) identifiant);
  oldLibelle.setText((String)libelle2);
 }
 
 @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()};
    ((AbstractTableModel)ProjetDUT.test.tableau.getModel()).modifLigne(data);
   }
  }*/
 }
 
 public Object getid()
 {
  return id;
 }
 
 public Object getlibelle()
 {
  return libelle;
 }
}
[/java]
 
pour l'instant le bouton valider ne ferme pas la fenêtre mais je pense pouvoir m'en débrouiller
 
merci d'avance à tous pour votre aide  :hello:

Reply

Marsh Posté le 24-01-2012 à 21:44:35   

Reply

Marsh Posté le 26-01-2012 à 08:23:30    

Il y aurait énormément de choses à dire sur ton code :

  • en java les noms des packages commencent généralement par une minuscule
  • quand on récupère ton code il ne compile pas : ça n'encourage par les gens à t'aider. Pour le faire compiler, il faut remplacer les occurrences de Application.ProjetDUT.test.tableau par un membre de la classe (je l'ai nommé tableau
  • pas la peine d'implémenter KeyListener
  • TableauDesInvariants.Model.addRow() est bien trop compliqué : la méthode peut être avantageusement réduite en utilisant ArrayUtils.copy()
  • AjoutInvariants a bien trop de membres de classe
  • AjoutInvariants disparaît une fois que l'action a été exécuté en appelant dispose()
  • J'ai ajouté une méthode main() pour que la JFrame soit exécutable et qu'on puisse la tester
  • etc...


Voici une proposition d'implémentation :
 

Code :
  1. package apparence;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.GridLayout;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.util.Arrays;
  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;
  10. import javax.swing.JPanel;
  11. import javax.swing.JScrollPane;
  12. import javax.swing.JTable;
  13. import javax.swing.SwingUtilities;
  14. import javax.swing.table.AbstractTableModel;
  15. public class TableauDesInvariants extends JFrame implements ActionListener {
  16.     private static final long serialVersionUID = -8505921257906274603L;
  17.     private JButton ajouter = new JButton("Ajouter" );
  18.     private JButton modifier = new JButton("Modifier" );
  19.     private Object[][] dataModel = { { "pc1", "ordinateur qui envoie les données" }, { "pc2", "ordi qui les reçoit" } };
  20.     private String[] columnName = { "identifiant de l'invariant", "libellé de l'invariant" };
  21.     Model model = new Model();
  22.     public JTable tableau = new JTable(model);
  23.     private JScrollPane barres_defilement = new JScrollPane(tableau);
  24.     private JPanel boutons = new JPanel();
  25.     class Model extends AbstractTableModel {
  26.         private static final long serialVersionUID = -1740889182135611382L;
  27.         @Override
  28.         public int getColumnCount() {
  29.             return columnName.length;
  30.         }
  31.         @Override
  32.         public int getRowCount() {
  33.             return dataModel.length;
  34.         }
  35.         @Override
  36.         public Object getValueAt(int arg0, int arg1) {
  37.             return dataModel[arg0][arg1];
  38.         }
  39.         @Override
  40.         public String getColumnName(int column) {
  41.             return columnName[column];
  42.         }
  43.         public void modifLigne(Object[] data) {
  44.             int indice = tableau.getSelectedRow();
  45.             if (indice >= 0 && indice < dataModel.length) {
  46.                 dataModel[indice] = data;
  47.                 this.fireTableDataChanged();
  48.             }
  49.         }
  50.         public void addRow(Object[] data) {
  51.             dataModel = Arrays.copyOf(dataModel, dataModel.length + 1);
  52.             dataModel[dataModel.length - 1] = data;
  53.             this.fireTableDataChanged();
  54.         }
  55.     }
  56.     private void miseEnPlace() {
  57.         GridLayout grid = new GridLayout(1, 2);
  58.         this.boutons.setLayout(grid);
  59.         this.boutons.add(ajouter);
  60.         this.boutons.add(modifier);
  61.         this.add(boutons, BorderLayout.SOUTH);
  62.         this.getContentPane().add(barres_defilement, BorderLayout.CENTER);
  63.         super.setDefaultCloseOperation(EXIT_ON_CLOSE);
  64.     }
  65.     public void ecouteur() {
  66.         this.ajouter.addActionListener(this);
  67.         this.modifier.addActionListener(this);
  68.         this.ajouter.setFocusable(false);
  69.         this.modifier.setFocusable(false);
  70.         this.setFocusable(true);
  71.     }
  72.     public TableauDesInvariants(String name) {
  73.         super(name);
  74.         miseEnPlace();
  75.         ecouteur();
  76.     }
  77.     @Override
  78.     public void actionPerformed(ActionEvent event) {
  79.         if (event.getSource() == ajouter) {
  80.             AjoutInvariants ajout = new AjoutInvariants(null, null, this.model);
  81.             ajout.setVisible(true);
  82.             ajout.setMinimumSize(new Dimension(400, 100));
  83.         }
  84.         if (event.getSource() == modifier) {
  85.             int row = this.tableau.getSelectedRow();
  86.             if (row == -1) {
  87.                 return;
  88.             }
  89.             String identifiant = (String) tableau.getValueAt(row, 0);
  90.             String libelle = (String) tableau.getValueAt(row, 1);
  91.             AjoutInvariants ajout = new AjoutInvariants(identifiant, libelle, this.model);
  92.             ajout.setVisible(true);
  93.             ajout.setMinimumSize(new Dimension(400, 100));
  94.         }
  95.     }
  96.     public static void main(String[] args) {
  97.         SwingUtilities.invokeLater(new Runnable() {
  98.             @Override
  99.             public void run() {
  100.                 TableauDesInvariants tableauDesInvariants = new TableauDesInvariants("title" );
  101.                 tableauDesInvariants.setVisible(true);
  102.             }
  103.         });
  104.     }
  105. }


 

Code :
  1. package apparence;
  2. import java.awt.GridBagConstraints;
  3. import java.awt.GridBagLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JTextField;
  10. public class AjoutInvariants extends JFrame implements ActionListener {
  11.     private static final long serialVersionUID = -8037270376315419999L;
  12.     private JTextField id = new JTextField();
  13.     private JTextField libelle = new JTextField();
  14.     private JLabel oldId = new JLabel();
  15.     private JLabel oldLibelle = new JLabel();
  16.     private TableauDesInvariants.Model tableModel;
  17.     private void miseEnPlace() {
  18.         this.setLayout(new GridBagLayout());
  19.         GridBagConstraints cont = new GridBagConstraints();
  20.         cont.weightx = 1.0;
  21.         cont.weighty = 1.0;
  22.         cont.gridheight = 1;
  23.         cont.gridwidth = 1;
  24.         cont.fill = GridBagConstraints.BOTH;
  25.         cont.gridx = 0;
  26.         cont.gridy = 0;
  27.         this.add(new JLabel("anciennes valeurs" ), cont);
  28.         cont.gridy = 1;
  29.         this.add(oldId, cont);
  30.         cont.gridy = 2;
  31.         this.add(oldLibelle, cont);
  32.         cont.gridy = 3;
  33.         cont.gridwidth = 3;
  34.         JButton valider = new JButton("Valider" );
  35.         this.add(valider, cont);
  36.         valider.addActionListener(this);
  37.         cont.gridwidth = 1;
  38.         cont.gridx = 1;
  39.         cont.gridy = 1;
  40.         this.add(new JLabel("identifiant" ), cont);
  41.         cont.gridy = 2;
  42.         this.add(new JLabel("libellé" ), cont);
  43.         cont.gridx = 2;
  44.         cont.gridy = 1;
  45.         this.add(id, cont);
  46.         cont.gridy = 2;
  47.         this.add(libelle, cont);
  48.     }
  49.     public AjoutInvariants(String identifiant, String libelle2, TableauDesInvariants.Model tableModel) {
  50.         super("ajouter ou modifier un invariant" );
  51.         miseEnPlace();
  52.         oldId.setText(identifiant);
  53.         oldLibelle.setText(libelle2);
  54.         this.tableModel = tableModel;
  55.         this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  56.     }
  57.     @Override
  58.     public void actionPerformed(ActionEvent e) {
  59.         if (e.getActionCommand() == "Valider" ) {
  60.             Object[] data = { id.getText(), libelle.getText() };
  61.             if (oldId.getText() == null && oldLibelle.getText() == null) {
  62.                 ((TableauDesInvariants.Model) tableModel).addRow(data);
  63.             } else {
  64.                 ((TableauDesInvariants.Model) tableModel).modifLigne(data);
  65.             }
  66.             dispose();
  67.         }
  68.     }
  69. }

Reply

Marsh Posté le 26-01-2012 à 13:34:50    

merci beaucoup pour ton aide!!! :D
effectivement le main n'est pas dans mon tableau des invariant mais c'est volontaire
je n'ai pas voulu donner une classe de plus pour un main.......
effectivement pour le package je n'ai pas fait attention
et pour le reste je ne savait pas que ces méthodes existaient......
merci encore

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed