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

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

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.