Jtable générique : tri,ajout,suppression,ctrl classe,taille col,sélection des col,recup lignes supp

Soyez le premier à donner votre avis sur cette source.

Snippet vu 36 295 fois - Téléchargée 28 fois

Contenu du snippet

Permet d'utliser une jtable de manière générique et dynamique !

Source / Exemple :


Utilisation de la jtable :
Déclarer:
    public TableModelPerso T;
    public Tableur TAB;
Appel:
T=new TableModelPerso (
vect,   // de type Object[][] contient les données
Colemploye, //de type String[] contient les entetes de col
false,      // false si maj,true si sélection uniquement
vcoleditable, //de type Boolean[] les colonnes modifiables = true
ctrlcolemploye, //de type String[] classes des col int,long,double,float,string,date,boolean
vsize); // de type int[] taille des colonnes
TAB=new Tableur(T,1); // 0 si interdiction d'ajouter ou supprimer les lignes,1 sinon 
TAB.affiche(this);

// le retour se fait via l'évents windowActivated de votre frame
// récupère les données via T.getDonnees() de type Object[][]
//récupère les lignes supp via T.getLignesup() de type Object[][]

copier ces deux classes

1

import javax.swing.*;
import javax.swing.table.TableModel;
import javax.swing.event.*;
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.AbstractTableModel;
import java.awt.Color;
import java.awt.*;
import javax.swing.JButton;
import javax.swing.table.DefaultTableModel;

class Tableur extends JPanel implements TableModelListener
{
  private Object[][] donnees; 
  private String[] nomsColonnes;
  private JTable table; 
  private TableModel tableur;
  private int[] vsize;
  private javax.swing.JLabel jLabel1;
  private javax.swing.JButton aj1,aj2;
  private TableModelPerso tt;
  private int ajoutsupp;
  private int posilig;

   

  Tableur(TableModelPerso vtablemodelperso,int vajoutsupp)
    {  
      tt=vtablemodelperso;
      ajoutsupp=vajoutsupp;
      this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
      table = new JTable(vtablemodelperso);
      table.setColumnSelectionAllowed(true);
      table.setRowSelectionAllowed(true);
      table.setSelectionBackground(Color.BLUE);
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      int[] vsize=vtablemodelperso.getSizecol();
      int tailletot=0;
      for (int i=0;i<vsize.length;i++)
      {
          table.getColumnModel().getColumn(i).setPreferredWidth(vsize[i]);
          if (vsize[i]==0) {table.getColumnModel().getColumn(i).setMinWidth(vsize[i]);table.getColumnModel().getColumn(i).setMaxWidth(vsize[i]);}
          tailletot=tailletot+vsize[i];
      }
      vtablemodelperso.addEcouteur(table);
      table.setPreferredScrollableViewportSize(new Dimension(tailletot+100, 300));
      JScrollPane avecAsc = new JScrollPane(table); 
      jLabel1 = new javax.swing.JLabel();
      jLabel1.setBackground(new java.awt.Color(255, 255, 51));
      jLabel1.setText("Double clic sur une colonne pour trier la table");
      jLabel1.setOpaque(true);
      jLabel1.setName("TITRE");
      jLabel1.setPreferredSize(new java.awt.Dimension(55, 20));
      aj1 = new javax.swing.JButton();
      aj1.setBackground(new java.awt.Color(255, 255, 51));
      aj1.setText("Ajouter une ligne");
      aj1.setPreferredSize(new java.awt.Dimension(150, 25));
      aj2 = new javax.swing.JButton();
      aj2.setBackground(new java.awt.Color(255, 255, 51));
      aj2.setText("Supprimer une ligne");
      aj2.setPreferredSize(new java.awt.Dimension(150, 25));      
      add(jLabel1);
      add(avecAsc);
      table.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
            posilig=(table.rowAtPoint(evt.getPoint()));
            }
        });
      if (!vtablemodelperso.isTypeselection() & ajoutsupp!=0){
          add(aj1);
          aj1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tt.addligne();
            }});
          add(aj2);
          aj2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                if (tt.getDonnees().length==0)
                {
                    JOptionPane d = new JOptionPane();                
                    d.showMessageDialog( d.getParent(),"Plus de ligne!","Erreur!",JOptionPane.ERROR_MESSAGE);
                    return;        
                }
                table.changeSelection(posilig,0,false,false);
                for (int k=0;k<tt.getColumnCount();k++)
                {
                    table.changeSelection(posilig,k,false,true);
                }
                tt.suppligne(posilig);
            }});
      }
    }
  public void tableChanged(TableModelEvent e) 
    {                                
   }
  public void affiche( JFrame j,String vtitre)
    {
      final JFrame v=j;
      JFrame monCadre = new JFrame();
      monCadre.setTitle(vtitre);
      monCadre.setContentPane(this);
      monCadre.addWindowListener(new WindowAdapter()
	      {
		public void windowClosing(WindowEvent evt)
		  {
                    v.show();
		  }
	      });
      Insets insets = monCadre.getInsets();
      monCadre.setSize(300 + insets.left + insets.right,125 + insets.top + insets.bottom);
       java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
      monCadre.setBounds((screenSize.width-800)/2, (screenSize.height-600)/2, 800, 600);
      monCadre.pack(); 
      monCadre.setVisible(true);
    }

    public Point getLocation() {
        Point retValue;
        retValue = super.getLocation();
                 System.out.println(retValue);       
        return retValue;
    }
     public String[] getNomsColonnes() {
        return nomsColonnes;
    }
}

2

import javax.swing.table.AbstractTableModel;
import javax.swing.AbstractCellEditor;
import javax.swing.table.TableCellEditor;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import java.util.Date;
import java.text.SimpleDateFormat;

 public class TableModelPerso extends AbstractTableModel 
 {
    private Object[][] donnees,donnees1,lignesup,lignesup1,copydonnees; 
    private String[] nomsColonnes;
    private boolean[] colmodifiable;
    private boolean typeselection;
    private String[] ctrlcol;
    private int[] sizecol;
    private Ligne[] lignes,lignes1;
    private int colonneTri;
    private Boolean vyes=new Boolean (true);

    private Boolean vno=new Boolean (false);
    private TableModelPerso model;

   public TableModelPerso (Object[][] vdonnees, String[] vnomsColonnes,boolean vtypeselection,boolean[] vcolmodifiable,String vctrlcol[],int[] vsizecol) {
       
       typeselection=vtypeselection;
       ctrlcol=new String[vctrlcol.length];
       sizecol=new int[vsizecol.length];
       if (typeselection==true){
            donnees=new Object[vdonnees.length][vnomsColonnes.length+1];
            nomsColonnes=new String[vnomsColonnes.length+1];
            nomsColonnes[vnomsColonnes.length]="Sélection";
            colmodifiable=new boolean[vcolmodifiable.length+1];
            colmodifiable[vcolmodifiable.length]=true;
            int i;
            for (i=0;i<donnees.length;i++)
            {    donnees[i][vnomsColonnes.length]=vno; }
            donnees[0][vnomsColonnes.length]=vyes;
        }
        else
        {
            lignesup=new Object[vdonnees.length][vnomsColonnes.length];
            donnees=new Object[vdonnees.length][vnomsColonnes.length];
            nomsColonnes=new String[vnomsColonnes.length];
            colmodifiable=new boolean[vcolmodifiable.length];
        }

        int i,j;
        for (i=0;i<vdonnees.length;i++)
        { 
            for (j=0;j<vnomsColonnes.length;j++)
                {donnees[i][j]=vdonnees[i][j];}
        }
        for (j=0;j<vnomsColonnes.length;j++)
            {
            nomsColonnes[j]=vnomsColonnes[j];
            if (typeselection==true)
                colmodifiable[j]=false;
            else
                colmodifiable[j]=vcolmodifiable[j];
             }
        for (j=0;j<vctrlcol.length;j++)
            {ctrlcol[j]=vctrlcol[j];}
        for (j=0;j<vsizecol.length;j++)
            {sizecol[j]=vsizecol[j];}
        model=this;
        lignes = new Ligne[model.getRowCount()];
        for (i = 0; i < lignes.length; i++) {
            lignes[i] = new Ligne();
            lignes[i].index = i;
            }
        }

public boolean isCellEditable(int row, int col) { 
       
    if (colmodifiable[col]==false) 
        return false;
    else
        return true;
    }
   public int getColumnCount() { 
       return nomsColonnes.length; 
   } 
   public Object getValueAt(int parm1, int parm2) { 
       return donnees[parm1][parm2]; 
       
   } 
   public int getRowCount() { 
       return donnees.length; 
   } 
   public String getColumnName(int col){
     return nomsColonnes[col]; 
   } 
    public Object[][] getDonnees() {
        return donnees;
    }
    public Object[][] getLignesup() {
        return lignesup;
    }
  public void setValueAt(Object value, int row, int col) {
      if (typeselection)
      {  
         int i;
         for(i=0;i<donnees.length;i++)
         {
             if ((donnees[i][nomsColonnes.length-1])==vyes)
                 donnees[i][nomsColonnes.length-1]=vno;
         }
         donnees[row][nomsColonnes.length-1]=vyes;
         fireTableDataChanged();
      }
      else
      {
          // on peut ajouter d'autres ctrl depend de la façon dont vous gérer les nombres'
          if (ctrlcol[col].equalsIgnoreCase("Date"))
            {
              try {java.sql.Date dd=java.sql.Date.valueOf((String) value);donnees[row][col]=value;fireTableDataChanged();}
              catch (Exception e){
                    JOptionPane d = new JOptionPane();
                    d.showMessageDialog( d.getParent(),"Erreur de date","Attention !",JOptionPane.ERROR_MESSAGE);
                                  }
            }
            else
            {
                if (value!=null)
                {
                    if (value.getClass()  != getColumnClass(col))
                    {
                        donnees[row][col]=null;
                    }
                    else
                    {
                        donnees[row][col]=value;}
                    }

                fireTableDataChanged();
              }
          } 
  }
   public void clear () {
     for (int i = 0;i < nomsColonnes.length;i++)
       donnees[i]=null;
     fireTableDataChanged();
   }
    public Class getColumnClass(int columnIndex) {
    return getValueAt(0, columnIndex).getClass();
    }
    public boolean isTypeselection() {
        return typeselection;
    }
    public int[] getSizecol() {
        return sizecol;
    }

private class Ligne implements Comparable {
public int index;
public int compareTo(Object autre) {
Ligne autreLigne = (Ligne)autre;
Object cellule = model.getValueAt(index, colonneTri);
Object autreCellule = model.getValueAt(autreLigne.index, colonneTri);
return ((Comparable)cellule).compareTo(autreCellule );
}
}
public void addEcouteur(final JTable table) {
table.getTableHeader().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent event) {
if (event.getClickCount() < 2) return;
int tableColumn = table.columnAtPoint(event.getPoint());
int modelColumn = table.convertColumnIndexToModel(tableColumn);
sort(modelColumn);
}
});
}
public void sort(int c) {
colonneTri = c;
Arrays.sort(lignes);
copydonnees=new Object [donnees.length][nomsColonnes.length];
for (int j=0;j<lignes.length;j++){copydonnees[j]=donnees[lignes[j].index];}
for (int j=0;j<lignes.length;j++){donnees[j]=copydonnees[j];}
fireTableDataChanged();
}
public void addligne() {
    int i;
    donnees1=new Object[donnees.length+1][nomsColonnes.length];
    lignesup1=new Object[lignesup.length+1][nomsColonnes.length];
    for ( i=0;i<donnees.length;i++){donnees1[i]=donnees[i];}
    for (int j=0;j<nomsColonnes.length;j++)
    {   // dépend de la façon dont vous gérez les nombres (string ou non)
        if (ctrlcol[j].equalsIgnoreCase("int")) donnees1[i][j]=new Integer(0);
        if (ctrlcol[j].equalsIgnoreCase("long")) donnees1[i][j]=new Long (0);
        if (ctrlcol[j].equalsIgnoreCase("float")) donnees1[i][j]=new Float (0);
        if (ctrlcol[j].equalsIgnoreCase("double")) donnees1[i][j]=new Double (0);
        if (ctrlcol[j].equalsIgnoreCase("string")) donnees1[i][j]="";
        if (ctrlcol[j].equalsIgnoreCase("char")) donnees1[i][j]="";
        if (ctrlcol[j].equalsIgnoreCase("date"))
        {
            Date datejour=new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            donnees1[i][j]=formatter.format(datejour);
        }
        if (ctrlcol[j].equalsIgnoreCase("boolean")) donnees1[i][j]=vyes;
        
    }
    donnees=donnees1;
    fireTableDataChanged();
    lignes1 = new Ligne[this.getRowCount()];
    for (i = 0; i < lignes1.length; i++)
    {
            lignes1[i] = new Ligne();
            lignes1[i].index = i;
    }
    for(i=0;i<lignesup.length;i++)
    {
        lignesup1[i]=lignesup[i];
    }
    lignesup=lignesup1;
    lignes=lignes1;        
    fireTableDataChanged();
    } 
public void suppligne(int lig) {
    JOptionPane d = new JOptionPane();
    int rep=d.showConfirmDialog( d.getParent(),"Supprimer une ligne","Voulez vous reelement supprimer cette ligne ?",JOptionPane.OK_CANCEL_OPTION );
    if (rep!=0) return;
    
    int i;
    donnees1=new Object[donnees.length-1][nomsColonnes.length];
    int j,h;j=0;h=0;
    while (lignesup[h][0]!=null)
    {h=h+1;}
    lignesup[h]=donnees[lig];
    for ( i=0;i<donnees.length;i++)
    {
        if (i!=lig) {donnees1[j]=donnees[i];j=j+1;}
    }
    donnees=donnees1;
    fireTableDataChanged();
    lignes1 = new Ligne[this.getRowCount()];
    for (i = 0; i < lignes1.length; i++)
    {
         lignes1[i] = new Ligne();
         lignes1[i].index = i;
    }
    lignes=lignes1;        
    fireTableDataChanged();               
    } 
    public String[] getNomsColonnes() {
        return nomsColonnes;
    }
 }

Conclusion :


Merci pour vos commentaires, remerciements aux autres codes sur les jtables

A voir également

Ajouter un commentaire

Commentaires

Messages postés
13
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
22 février 2011

merci bcp c super
Messages postés
5
Date d'inscription
jeudi 30 octobre 2008
Statut
Membre
Dernière intervention
3 avril 2009

te voila un bou de code pour ton main DrSoFtNaF
c pas parfait surement mais sa taffiche la Jtable
import java.awt.Color;

import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JTable;

public class main {
     
    public main() {
    }

    public static void main(String[] args) {
        main main = new main();
        
        
        Tableur TAB;
        Object[][] donnees = {{"Swing",    "Astral",     "standard",  Color.red,    Boolean.TRUE},

               {"Swing",    "Mistral",    "standard", Color.yellow, Boolean.FALSE},

               {"Gin",      "Oasis",      "standard",Color.blue,   Boolean.FALSE},

               {"Gin",      "boomerang",  "compétition",  Color.green,  Boolean.TRUE},

               {"Advance",  "Omega",      "performance",  Color.cyan,   Boolean.TRUE},
        
          } ;
         

          String[] titreColonnes = { "modèle", "marque", "homologation",

                                     "couleur", "vérifié ?"};
        boolean[] vcoleditable = new boolean[] { true, true, true, true, true};
         
        String[] ctrlcolemploye = { "String", "String", "String","color", "boolean"};
        int[] ctrlcolemp = { 100, 100, 100,100, 100};
       
        TableModelPerso T=new TableModelPerso ( donnees, titreColonnes, true, vcoleditable, ctrlcolemploye, ctrlcolemp ); // de type int[] taille des colonnes
        
        TAB=new Tableur(T,1); // 0 si interdiction d'ajouter ou supprimer les lignes,1 sinon 
        
        JFrame fenetre=new JFrame();
        fenetre.setBounds(new Rectangle(0, 0, 600, 700));
        fenetre.setResizable(false);
        
        fenetre.getContentPane().setLayout(null);       
       
        TAB=new Tableur(T,1); // 0 si interdiction d'ajouter ou supprimer les lignes,1 sinon 
        TAB.affiche(fenetre,"ma fenetre");
        // le retour se fait via l'évents windowActivated de votre frame
        // récupère les données via T.getDonnees() de type Object[][]
        //récupère les lignes supp via T.getLignesup() de type Object[][]
       // copier ces deux classes
    }
}
Messages postés
1
Date d'inscription
dimanche 24 juin 2007
Statut
Membre
Dernière intervention
2 février 2009

Bonsoir,

J'ai bien compri ce code, mais j'ai une erreur de déclaration, est ce que vous pouvez nous donner un exemple de Main() concret où on peut voir l'utilisation de ces deux classes?

Merci pour le support.
Messages postés
24
Date d'inscription
mardi 16 décembre 2008
Statut
Membre
Dernière intervention
25 mars 2009

bonsoir tous
j'ai vue votre programme et sa ma aider dans mon pojet.
bonne continuation.
salutation
Messages postés
4
Date d'inscription
lundi 3 octobre 2005
Statut
Membre
Dernière intervention
7 février 2008

? le main est ton source tu ajoutes ces 2 classes à ton projet
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.