Partage
  • Partager sur Facebook
  • Partager sur Twitter

Entéte de colonne

Edition spécifique à des entétes de colonne

    14 décembre 2014 à 21:13:55

                                             Bonsoir

    J'ai besoin d'aide pour avancer un peu mon progrramme concernant un tableau.Mon probléme concerne l'édition des entétes de colonne .Ils sont tous éditables.Voici les entétes de colonnes |marchandise|poid en kg|prix1|prix2|prix3|utilisation|.Je veux avoir une modification spécifique des entétes de colonnes "prix".C'est à dire si je change l'une des colonne "prix" en faisant un double clique sur l'entéte de colonne toutes les autres colonnes "prix" changent en prenant le nom du colonne que j'ai modifié .Avec cette exemple vous comprendrez mieux ce que je veux faire.Si je fais un double clik sur la colonne |prix3| pour la modifier en "achat" toute les autres colonnes "prix"doivent se transformer en "achat" suivie du numéro correspondant.On doit avoir le tableau suivant  |marchandise|poid en kg|achat1|achat2|achat3|utilisation|.

    Voici le code composé de 4 classes  la classe "JTableColumn"c'est un tableau qui sert à ajouter ou insérer des colonnes"JEditHeadColumn" qui gére l'édition des entétes de colonne visuelement "JTableEditHead" qui gére les éditions de colonne  la classe"ColumnNb" qui gére les colonnes numérotées et la classe mére "Colonne"

    J'ai créé 2 boutons qui permet d'insérer et supprimer des colonnes "prix"

    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Set;
    
    import javax.swing.table.JTableHeader;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableColumnModel;
     
    /**
     * JTable avec le nom de colonne modifiable.
     * @author pctronique
     */
    public class JTableEditHead extends JTableColumn {
    	private ColumnNb columnsPrice;
        private HashMap<String, String> listEntete;
         
        public JTableEditHead(Object[][] rowData, String[] columnNames) {
            super(rowData, columnNames);
            listEntete = new LinkedHashMap<String, String>();
            for(String columnName : columnNames)
                listEntete.put(columnName, columnName);
            new JEditHeadColumn(this){
                public void modifName(String oldName, String newName) {
                    for (String value : listEntete.keySet()) {
                        if (listEntete.get(value).equals(oldName)) listEntete.put(value, newName);
                    }
                }
                 
                public boolean isColumnEditable(int colIndex) {
                    return isTableColumnEditable(colIndex);
                }
            };
      }   
        /**
         * remplace l ancien nom par le nouveau nom
         * @param oldName ancien nom 
         * @param newName nouveau nom
         */
        public void modifName(String oldName, String newName) {
        	  JTableHeader header = this.getTableHeader();
              TableColumn column;
              for (String value : listEntete.keySet()) {
                  if (listEntete.get(value).equals(oldName)) {
                      int numcolumn = this.nmColumn(oldName);
                      column = header.getColumnModel().getColumn(numcolumn);
                      column.setHeaderValue(newName);
                      listEntete.put(value, newName);
                  }
              }
        }
        /**
         * Recupere la TableColumn a partir du nom de la colonne.
         * @param identifier nom de la colonne.
         * @return
         */
        public TableColumn getColumn(String identifier) {
            return super.getColumn(listEntete.get(identifier));
        }
         
        /**
         * Verifie que le nom appartient a un nom de colonne de la table.
         * @param name nom a verifier
         * @return true si la colonne a ete trouve
         */
        public boolean columnContains(String name) {
            return listEntete.containsKey(name);
        }
         
        /**
         * Verifie que le numero de colonne porte bien ce nom.
         * @param column le nom a verifier par le numero de colonne.
         * @param name le numero de colonne.
         * @return true si c'est bon.
         */
        public boolean isIntColumnName(int column, String name) {
        	if (this.getColumnCount() <= column) return false;
            if (!listEntete.containsValue(name)) return false;
            for (String value : listEntete.keySet()) {
                if (listEntete.get(value).equals(name))
                    return ((String)this.getColumnModel().getColumn(column).getHeaderValue()).equals(listEntete.get(value));
            }
            return false;
    
        }
         
        /**
         * Avoir le numero de colonne a partir du nom.
         * @param name nom de colonne.
         * @return numero de cette colonne.
         */
        public int nmColumn(String name) {
            int column = 0;
            while(!isIntColumnName(column, name)) {
                column++;
            }
            return column;
        }
         
        /**
         * Avoir le nom de la colonne a partir du numero de colonne.
         * @param column numero de colonne.
         * @return nom de la colonne.
         */
        public String nameColumn(int column) {
            int i = 0;
            Set<String> listKey = listEntete.keySet();
            for (String value : listKey) {
                if (listEntete.get(value).equals((String)this.getColumnModel().getColumn(column).getHeaderValue())) return listEntete.get(value);
                i++;
            }
            return null;
        }
         
        /**
         * Verifie que le nom de colonne est editable.
         * @param colIndex numero de colonne.
         * @return true si editable.
         */
        public boolean isTableColumnEditable(int colIndex) {
            return true;
        }
         
        /**
         * Ajoute une colonne a la fin du tableau.
         * @param name nom de la colonne.
         */
        public void addColumn(String name) {
            listEntete.put(name, name);
            super.addColumn(name);
        }
         
        /**
         * Insert une colonne au tableau.
         * @param column numero de l'emplacement de la colonne.
         * @param name nom de la colonne.
         */
        public void insertColumn(int column, String name) {
            listEntete.put(name, name);
            super.insertColumn(column, name);
        }
         
        /**
         * Supprime une colonne du tableau.
         * @param tableColumn colonne a supprimer.
         */
        public void removeColumn(TableColumn tableColumn) {
            TableColumnModel theColumnModel = this.getColumnModel();
            String name = (String)tableColumn.getHeaderValue();
            theColumnModel.removeColumn(tableColumn);
            Set<String> listKey = listEntete.keySet();
            String efface = "";
            for (String value : listKey) {
                if (listEntete.get(value).equals(name)) efface = value;
            }
            listEntete.remove(efface);
        }
         
        /**
         * Supprime une colonne du tableau.
         * @param column numero de la colonne a supprimer.
         */
        public void removeColumn(int column) {
            TableColumnModel theColumnModel = this.getColumnModel();
            TableColumn tableColumn = theColumnModel.getColumn(column);
            this.removeColumn(tableColumn);
        }
         
        /**
         * Supprime une colonne du tableau.
         * @param columnName nom de la colonne a supprimer.
         */
        public void removeColumn(String columnName) {
            this.removeColumn(this.nmColumn(columnName));
        }
         
    }
    import java.util.HashMap;
    import java.util.Vector;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumnModel;
     
    /**
     *
     * @author Mada96
     */
    public class JTableColumn extends JTable {   
        private DefaultTableModel tableur;
        private Object[][] rowData;
        private Object[] columnNames;
     /**
      * Constructeur par reference.   
      * @param dm model de donnees.
      */
        public JTableColumn(DefaultTableModel dm) {
            super(dm);
            this.tableur = dm;
        }
        /**
         *Constructeur par reference.  
         * @param dm model de donnees.
         * @param cm model de la colonne.
         */
        public JTableColumn(DefaultTableModel dm, TableColumnModel cm) {
            super(dm, cm);
            this.tableur = dm;
        }
        /**
         *  Constructeur par reference.
         * @param dm model de donnees.
         * @param cm model de la colonne.
         * @param sm model de selection.
         */
        public JTableColumn(DefaultTableModel dm, TableColumnModel cm, ListSelectionModel sm) {
            super(dm, cm, sm);
            this.tableur = dm;
        }
        /**
         * Constructeur  pour afficher les valeurs dans le tableau à deux dimensions.
         * @param rowData donnees des lignes.
         * @param columnNames identifiant de colonne dans le model.
         */
        public JTableColumn(Object[][] rowData, Object[] columnNames) {
            super();
            this.rowData = rowData;
            this.columnNames = columnNames;
            this.tableur = new  DefaultTableModel(this.rowData, this.columnNames);
            this.setModel(this.tableur);
        } 
        /**
         * /* reconstruit une nouvelle table, en replacent les colonnes dans un ordre choisi,
         *  en affectant leurs nouveaux nom et en replacent les valeurs des cellules dans la nouvelle table. 
         *  Il supprime l'ancienne table pour la remplacer par la nouvelle. 
         */
        private void rowColumn() {
            columnNames = new Object[this.getColumnCount()];/*instancifie les donnees de tous les colonnes dans le model*/
            for(int i = 0; i < this.getColumnCount(); i++)/*On parcourt le nbre de colonne dans le model*/
            	columnNames[i] = (String)this.getColumnModel().getColumn(i).getHeaderValue();/*On donne un identifiant (nom) a chaque colonne dans le model.*/
            rowData = new Object[this.getRowCount()][this.getColumnCount()];/*instancifie les donnees de tous les lignes dans le model.*/
            for (int i = 0; i < this.getRowCount(); i++)/*On parcourt le nbre de ligne dans le model.*/
                for(int j = 0; j < this.getColumnCount(); j++)/*On parcourt le nbre de colonne dans le model.*/
                    rowData[i][j] = this.getValueAt(i, j);/*retourne (accede) au valeur attribuee par la cellule par le biais du colonne j et de la ligne i dans le model.*/
            tableur = new  DefaultTableModel(rowData, columnNames); /*instancifie le model du tableau pour  initialise les donnees des lignes et les identifiants.*/ 
            this.setModel(tableur);/* Definir le model du tableau.*/
        }
         /**
          * Ajoute une colonne dans le model.
          * @param columnName identifiant qui peut etre nul.
          */
        public void addColumn(Object columnName){
            this.addColumn(columnName, (Object[])null);
        }
         /**
          * Ajoute une nouvelle colonne.Si l identifiant est nulle, la colonne sera remplie de valeur nulle.
          * Si l identifiant et nul, les nouvelles donnees seront ajoutees et modelisee.
          * @param columnName identifiant du nouvelle  colonne a ajouter.
          * @param columnData tableau facultatif de donnees de la nouvelle colonne a ajouter.
          */
        public void addColumn(Object columnName, Object[] columnData) {
            rowColumn(); 
            HashMap<Integer, String> colonneJTable = new HashMap<Integer, String>();
            for(int i = 0; i < this.getColumnCount(); i++)/*On parcourt le nbre de colonne dans le model.*/
                colonneJTable.put(i, (String)this.getColumnModel().getColumn(i).getHeaderValue());/*Mettre l ancien nom de chaque colonne dans la carte*/
            tableur.addColumn(columnName, columnData);/*Ajoute une nouvelle colonne avec l identifiant et le tableau facultatif de la nouvelle colonne.*/
            for(int i = 0; i < colonneJTable.size(); i++) {
                int columnMod = 0;/* Initialise a zero l indice de column a deplacer.*/
                for (int j = 0; j < colonneJTable.size(); j++) {/*Parcourt la taille de la carte.*/
                    if (this.getColumnModel().getColumn(j).getHeaderValue().equals(colonneJTable.get(i)))/*Si la colonne correspond a une clé de la listEntete danss le model.*/
                    columnMod = j;/*l indice du colonne a deplacer egal a la celle de la listEntete.*/
                }
                this.moveColumn(columnMod, i);/*Deplace la colonne ajoutee au niveau du model.
                (i est la nouvelle indice de la colonne colonne ajoutee et celle ci sera en dernier position).*/
            }
        }
        /**
         * /* Avant de pouvoir utiliser la méthode getModel() on doit ré-initialiser l'emplacement des colonnes. 
         * Donc utiliser cette méthode si la table a été modifiée (déplacement de colonne par exemple) avant d'utiliser la méthode getModel(). */
        
        public void placeColumn() {
            rowColumn();
        } 
        /**
         * Ajoute une colonne dans le modèle(je ne peut bien detaille le choses). 
         * @param columnName ...
         * @param columnData  ...
         */
        public void addColumn(Object columnName, Vector columnData) {
            if (columnData != null) this.addColumn(columnName, columnData.toArray(new Object[columnData.size()]));/*...*/
            else this.addColumn(columnName, (Object[])null);/*...*/
        }
        /**
         *  Insert une nouvelle colonne dans le model
         * @param column position de la colonne a inserrer
         * @param columnName identifiant de la colonne qui peut etre nul.
         */
        public void insertColumn(int column, Object columnName){
            this.insertColumn(column, columnName, (Object[])null);
        }
         /**
          * Insert une nouvelle colonne dans le  model.
          * Si l identifiant est nulle, la colonne inseree sera remplie de valeur nulle.
          * Si l identifiant est different de nullr les nouvelles données seront inserees.
          * @param column la position de la colonne a inserer.
          * @param columnName l identifiant de la colonne a inseree.
          * @param  le tableau facultatif .
          */
        public void insertColumn(int column, Object columnName, Object[] columnData) {
            addColumn(columnName, columnData);/*Ajoute une nouvelle colonne avec l identifiant et le tableau facultatif de la nouvelle colonne.*/
            this.moveColumn(this.getColumnCount()-1, column);/*Deplace la colonne inseree au niveau du model.*/
        }
       /**
        * ( ..................)
        * @param column position de la colonne a inserer
        * @param columnName (...)
        * @param columnData (..)
        */
        public void insertColumn(int column, String columnName, Vector columnData) {
            if (columnData != null) this.insertColumn(column, columnName, columnData.toArray(new Object[columnData.size()]));/*...*/
            else this.insertColumn(column, columnName, (Object[])null);/*...*/
        }
         
    }
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JPopupMenu;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.border.MatteBorder;
    import javax.swing.table.JTableHeader;
    import javax.swing.table.TableColumn;
     
    /**
     *
     * @author pctronique
     */
    public class JEditHeadColumn {
         
        private final JTableHeader header; // initialisation
        private final JPopupMenu renamePopup;
        private final JTextField text;
        private TableColumn column;// initialisation
        private String oldName;
         
        public JEditHeadColumn(JTable table) {
            header = table.getTableHeader(); // on recupére l'entéte de colonne
            header.addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent event) {
                    if (event.getClickCount() == 2) {
                        editColumnAt(event.getPoint());
                    }
                }
            });
             
            text = new JTextField();
            text.setBorder(null);
            text.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    renameColumn();
                }
            });        
            renamePopup = new JPopupMenu();
            renamePopup.setBorder(new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY));
            renamePopup.add(text);
        }
        private void editColumnAt(Point p) {
            int columnIndex = header.columnAtPoint(p); // le numéro de l'entéte de colonne
            if (columnIndex != -1) {
                if (isColumnEditable(columnIndex)) {
                    column = header.getColumnModel().getColumn(columnIndex); // la colonne correspondant à l'entéte de colonne
                    oldName = (String)column.getHeaderValue();
                    Rectangle columnRectangle = header.getHeaderRect(columnIndex);
                    text.setText(column.getHeaderValue().toString());
                    renamePopup.setPreferredSize(
                            new Dimension(columnRectangle.width, columnRectangle.height - 1));
                    renamePopup.show(header, columnRectangle.x, 0);
                    text.requestFocusInWindow();
                    text.selectAll();
                }
            }
        }   
        private void renameColumn() {
            column.setHeaderValue(text.getText());// on recupére ce qu'on'a saisi pour l'afficher 
            renamePopup.setVisible(false);
            header.repaint();
        } 
    //    public void modifName(String oldName, String newName) {
    //    }
         
        public boolean isColumnEditable(int colIndex) {
            return true;
        }
    }
    
    import java.util.Arrays;
     
    /**
     *
     * @author pctronique
     */
    public class ColumnNb {
         
        public int[] nb;
        private String nameNb;
        private JTableEditHead table;
         
        public ColumnNb(String nameColumn) {
            this(nameColumn, new int[]{1});
        }
         
        public ColumnNb(String nameColumn, int[] nb) {
            this.nb = nb;
            this.nameNb = nameColumn;
        }
         
        public void table(JTableEditHead table) {
            this.table = table;
        }
         
        public String name() {
            return this.nameNb;
        }
         
        public void renameTabColumnNb(String newName) {
            for (int i = 0; i < nb.length; i++)
                table.modifName(nameNb + nb[i], newName + nb[i]);
            nameNb = newName;
        }
         
        public boolean isTabColumn(int colonne) {
            for (int price : nb)
                if (colonne == table.nmColumn(nameNb + price)) return true;
            return false;
        }
         
        public void removeTabColumn() {
            String name = nameNb + nb[nb.length - 1];
            removeTabColumn(table.nmColumn(name));
        }
         
        public void removeTabColumn(int column) {
            delColumn(intTabNb(column));
            table.removeColumn(column);
        }
         
        public void addTabColumn() {
            if (nb.length > 0) {
                int column = 0;
                for (int j = 0; j < table.getColumnCount(); j++) {
                    if (table.isIntColumnName(j, nameNb + nb[nb.length-1])) column = j + 1;
                }
                addColumn();
                String name= nameNb + (nb[nb.length-1]);
                table.insertColumn(column, name);
            } else  {
                nb = new int[]{1};
                String name= nameNb + nb[0];
                if(table.getSelectedColumn()!=-1)
                table.insertColumn(table.getSelectedColumn(), name);
                else  table.addColumn(name);
            }
           
            }
        
            
         
        public int length() {
            return nb.length;
        }
         
        public int intTabNb(int column) {
            String name = table.nameColumn(column);
            for (int value : nb)
                if (name.equals(nameNb + value)) return value;
            return 0;
        }
         
        private void addColumn() {
            int[] value = new int[nb.length+1];
            System.arraycopy(nb, 0, value, 0, nb.length);
            value[nb.length] = nb[nb.length-1] + 1;
            Arrays.sort(value);
            nb = value;
        }
         
        private void delColumn(int number) {
            int[] value = new int[nb.length-1];
            int j = 0;
            for (int i = 0; i < nb.length-1; i++) {
                if (number == nb[j]) j++;
                value[i] = nb[j];
                j++;
            }
            Arrays.sort(value);
            nb = value;
        }
         
        public int[] arrayNb() {
            return this.nb;
        }
         
        public String[] namesNb() {
            String[] names = new String[nb.length];
            for (int i = 0; i < nb.length; i++)
                names[i] = nameNb + nb[i];
            return names;
        }
         
    }
    
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Arrays;
    
    import javax.swing.BorderFactory;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.border.MatteBorder;
    import javax.swing.table.TableColumn;
     
    public class Colonne extends JFrame {
    	 private  JPopupMenu renamePopupPrice;
    	    private  JTextField textPrice;
    
        private JTableEditHead table;
        private JButton ajout;
        private JScrollPane entete;
            private String columnMarchandisee;
        private String columnPoid;
        private String columnPrice;
        private String columnUtilisation;
        private int[] nbPrice;
        private JButton sup;
        private JPanel pa;
        private ColumnNb columnsPrice; 
        String[] namesColumnPrice;
        /**
         * Constructeur par defaut de la classe.
         */
        public Colonne(){
            this.initClass();
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setTitle("JTable");
            this.setSize(600, 200);
        }
         
        /**
         * Initialise les variables de la classe.
         */
        private void initVariable() {
            nbPrice = new int[]{1, 2, 3};
            columnMarchandisee = "marchandisee";
            columnPoid = "poid en kg";
            columnPrice = "prix ";
            columnUtilisation = "utilisation";
            columnsPrice = new ColumnNb("prix ", new int[]{1, 2, 3});
        }
         
        /**
         * Initialise les composants de la classe.
         */
        private void initComponents() {
            ajout = new JButton("Ajouter une colonne");
            sup = new JButton("Supprime une colonne");
                   pa=new JPanel();
            pa.setPreferredSize(new Dimension (0,60));
            pa.setBorder(BorderFactory.createLineBorder(Color.CYAN));
            add(pa,BorderLayout.SOUTH);
            pa.setLayout(new GridLayout(2, 2));
            pa.add(ajout, BorderLayout.SOUTH);
            pa.add(sup, BorderLayout.SOUTH);
                   textPrice = new JTextField();
            textPrice.setBorder(null);
            renamePopupPrice = new JPopupMenu();
            renamePopupPrice.setBorder(new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY));
            renamePopupPrice.add(textPrice);
            //Les données du tableau
            Object[][] data = {
                {"rice","12","$18", "$15","$12", ""},
                {"millet","8","$20","$17", "$15", ""},
                {"corn","10", "$14","$13","$12", ""},
            };
     
            //Les titres des colonnes
           namesColumnPrice = columnsPrice.namesNb();
            String[]  theTitle = {columnMarchandisee, columnPoid, namesColumnPrice[0],
                 namesColumnPrice[1], namesColumnPrice[2], columnUtilisation};
            table = new JTableEditHead(data, theTitle){
                public boolean isTableColumnEditable(int colIndex) {
                    if (table.columnContains(columnMarchandisee))
                        return colIndex != table.nmColumn(columnMarchandisee);
                    else return true;
                }
                 
                public boolean isCellEditable(int rowIndex, int colIndex) {
                    return tableIsCellEditable(rowIndex, colIndex);
                }
            };
           columnsPrice.table(table);
        }
         
        /**
         * Verifie que la cellule est editable.
         * @param rowIndex numero de la ligne.
         * @param colIndex numero de la colonne.
         * @return true si on peut editer.
         */
        private boolean tableIsCellEditable(int rowIndex, int colIndex) {
            /*if (!((String)table.getColumnModel().getColumn(colIndex).getHeaderValue()).contains(columnPrice)) {
                ajout.setEnabled(true);
            } else {
                ajout.setEnabled(false);
                sup.setEnabled(false);
            }
            if (!table.isIntColumnName(colIndex, columnMarchandisee)) {
                sup.setEnabled(true);   
            } else {
                sup.setEnabled(false);
            }*/
             
            if(nbPrice.length==1 &&
                    ((String)table.getColumnModel().getColumn(colIndex).getHeaderValue()).contains(columnPrice))
                sup.setEnabled(false);
             
            if (table.columnContains(columnMarchandisee))
                if (colIndex == table.nmColumn(columnMarchandisee)) return false;
             
            if (table.columnContains(columnUtilisation) )
                if (colIndex == table.nmColumn(columnUtilisation)) return false;
             
            return true;
        }
        /**
         * verifie que les noms de colonnes prix sont editable
         * @param colIndex le numero de colonne prix
         * @return si oui editable
         */
        public boolean isColumnEditablePrice(int colIndex) {
            return true;
        }
              
        /**
         * Les ecouteurs de la classe.
         */
        private void listenerClass() {
            ajout.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ajoutActionPerformed(e);
                }
            });
            sup.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    supActionPerformed(e);
                }
            });
        }
        
        /**
         * Si on clique sur le bouton supprimer. (ecouteur)
         * @param e
         */
    
    
        private void supActionPerformed(ActionEvent e) {
        	    if (table.getSelectedColumn() >= 0) {
        	        if (columnsPrice.isTabColumn(table.getSelectedColumn())) {
        	            columnsPrice.removeTabColumn(table.getSelectedColumn());
        	        } else 
        	            table.removeColumn(table.getSelectedColumn());
        	        
        	       // poid();
        	    }
        	}
          /**
         * Si on clique sur le bouton ajouter. (ecouteur)
         * @param e
         */
        private void ajoutActionPerformed(ActionEvent e) {
            if (ajout.isEnabled()) { 
            	columnsPrice.addTabColumn();
            	poid();
            }
        }
         
           
        /**
         * Initialise la classe.
         */
        private void initClass() {
            this.initVariable();
            this.initComponents();
             
            poid();
            entete= new JScrollPane(table);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            table.setColumnSelectionAllowed(true);
            add(entete, BorderLayout.NORTH);
             
            this.listenerClass();
        }
         
        public void poid() {
            JComboBox  jcbocoeff = new JComboBox();
            for (int i = 10; i <= 20; i++)
                jcbocoeff.addItem(String.valueOf(i));
            TableColumn poid = table.getColumn(columnPoid);
            poid.setCellEditor(new DefaultCellEditor(jcbocoeff));
        }
         /**
          * 
          * @param args
          */
        public static void main(String[] args){
            Colonne fen = new Colonne();
            fen.setVisible(true);
        }
         
    }







    • Partager sur Facebook
    • Partager sur Twitter
      16 décembre 2014 à 17:36:26

      Bonsoir

      Je veux vraiment que vous m'aidez. Je dois resoudre ce probléme pour pouvoir avancer

      • Partager sur Facebook
      • Partager sur Twitter
        17 décembre 2014 à 20:44:13

        S il vous plait pouvez vous m apporter de l aide.Je veux vraiment avancer mon programme.
        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2014 à 21:32:39

          Bonsoir, pour vous aidez c'est mieux de nous écrire juste la partie de code qui contient l'erreur, c'est difficile de lire tout ça.
          • Partager sur Facebook
          • Partager sur Twitter
            19 décembre 2014 à 0:17:06

            Bonsoir

            Il ya pas d'erreur sur le code mais quelque chose que je n'arrive pas à faire.Voici une code un peu simplifié.Je veux avoir une modification spécifique des entétes de colonnes "prix".C'est à dire si je change l'une des colonne "prix" en faisant un double clique sur l'entéte de colonne toutes les autres colonnes "prix" changent en prenant le nom du colonne que j'ai modifié suivie du numéro correspondant .Avec cette exemple vous comprendrez mieux ce que je veux faire.Si je fais un double clik sur la colonne |prix3| pour la modifier en "achat" toute les autres colonnes "prix"doivent se transformer en "achat" suivie du numéro correspondant.On doit avoir le tableau suivant  |marchandise|poid en kg|achat1|achat2|achat3|utilisation|.

            Voici une code simpliée

            import java.awt.BorderLayout;
            import java.awt.Color;
            import java.awt.Dimension;
            import java.awt.Point;
            import java.awt.Rectangle;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import java.awt.event.MouseAdapter;
            import java.awt.event.MouseEvent;
            import java.util.HashMap;
            import java.util.Vector;
            import javax.swing.BorderFactory;
            import javax.swing.DefaultCellEditor;
            import javax.swing.JComboBox;
            import javax.swing.JFrame;
            import javax.swing.JPopupMenu;
            import javax.swing.JScrollPane;
            import javax.swing.JTable;
            import javax.swing.JTextField;
            import javax.swing.border.MatteBorder;
            import javax.swing.table.DefaultTableModel;
            import javax.swing.table.JTableHeader;
            import javax.swing.table.TableColumn;
            public class Test extends JFrame {
                private JTable table;
                private JTableHeader header;
                private JPopupMenu renamePopup;
                private JTextField text;
                private TableColumn column;
                DefaultTableModel tableur;
                JScrollPane entete;
                private String nameRemplace;
                private HashMap<String, String> listEntete;
                 public Test(){
                  listEntete = new HashMap<String, String>();
                     listEntete.put("marchandisee", "marchandisee");
                     listEntete.put(" poid en kg", " poid en kg");
                     listEntete.put("prix 1", "prix 1");
                     listEntete.put("prix 2", "prix 2");
                     listEntete.put("prix3", "prix3");
                     listEntete.put("utilisation", "utilisation");
                          
                this.setLocationRelativeTo(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setTitle("JTable");
                this.setSize(600, 200);
                //Les données du tableau
                Object[][] data = {
                  {"rice","12","$18", "$15","$12", ""},
                  {"millet","8","$20","$17", "$15", ""},
                  {"corn","10", "$14","$13","$12", ""},
                };
               
                //Les titres des colonnes
                String  title[] = {"marchandisee"," poid en kg", "prix 1", "prix 2","prix 3","utilisation"};
                tableur = new  DefaultTableModel(data, title);
                table = new JTable(tableur){
                    
               };
               //+++++++++++++++++++++++++
               
               //+++++++++++++++++++++++++++++
                poid(table);
                entete= new JScrollPane(table);
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                table.setColumnSelectionAllowed(true);
                add(entete, BorderLayout.NORTH);
              }
             
                public void poid(JTable table) {
                    JComboBox  jcbocoeff = new JComboBox();
                    jcbocoeff.addItem("10 ");
                    jcbocoeff.addItem("11 ");
                    jcbocoeff.addItem("12 ");
                    jcbocoeff.addItem("13 ");
                    jcbocoeff.addItem("14 ");
                    jcbocoeff.addItem("15 ");
                    jcbocoeff.addItem("16 ");
                    jcbocoeff.addItem("17 ");
                    jcbocoeff.addItem("18 ");
                    jcbocoeff.addItem("19 ");
                    jcbocoeff.addItem("20 ");
                    TableColumn poid = table.getColumn(" poid en kg");
                    poid.setCellEditor(new DefaultCellEditor(jcbocoeff));
                 header = table.getTableHeader();
                header.addMouseListener(new MouseAdapter(){
                  @Override
                  public void mouseClicked(MouseEvent event)
                  {
                    if (event.getClickCount() == 2)
                    {
                      editColumnAt(event.getPoint());
                    }
                  }
                });
             
                text = new JTextField();
                text.setBorder(BorderFactory.createLineBorder(Color.CYAN));
             
                text.setBorder(null);
                text.addActionListener(new ActionListener(){
                  public void actionPerformed(ActionEvent e)
                  {
                    renameColumn();
                  }
                });
             
                renamePopup = new JPopupMenu();
                renamePopup.setBorder(new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY));
                renamePopup.add(text);
              }
              private void editColumnAt(Point p)
              {
                int columnIndex = header.columnAtPoint(p);
             
                if (columnIndex != -1)
                {
                  column = header.getColumnModel().getColumn(columnIndex);
                  Rectangle columnRectangle = header.getHeaderRect(columnIndex);
                  text.setText(column.getHeaderValue().toString());
                  renamePopup.setPreferredSize(
                      new Dimension(columnRectangle.width, columnRectangle.height - 1));
                  renamePopup.show(header, columnRectangle.x, 0);
             
                  text.requestFocusInWindow();
                  text.selectAll();
                }
                //--- pour rentre les entêtes de "marchandisee" et "utilisation", non modifiable  mais  ça ne marche pas----------------------------------------------- 
                if (!column.getHeaderValue().equals("marchandisee") && !column.getHeaderValue().equals("utilisation")) {
                    Rectangle columnRectangle = header.getHeaderRect(columnIndex);
                 
                    text.setText(column.getHeaderValue().toString());
                    renamePopup.setPreferredSize(
                    new Dimension(columnRectangle.width, columnRectangle.height - 1));
                    renamePopup.show(header, columnRectangle.x, 0);
                 
                    text.requestFocusInWindow();
                    text.selectAll();
               }
                //----------------------------------------------------------------------------------------------------
              }
             
              private void renameColumn()
              {
                column.setHeaderValue(text.getText());
                renamePopup.setVisible(false);
                header.repaint();
              }
              // --------------------on remplace l'ancien nom par le nouveau.------------------------------------------------------------
              public void replaceName() {
                     for (int i = 0; i < table.getColumnCount(); i++) {
                          String nameColumn = (String)table.getColumnModel().getColumn(i).getHeaderValue();
                          table.getColumnModel().getColumn(i).setHeaderValue(listEntete.get(nameColumn));
                     }
                }
              //---------------------------------------------------------------------------------------------------------------------------
              public static void main(String[] args){
                Test fen = new Test();
                fen.setVisible(true);
              }
            }



            Voici la partie ou je crois qu'on devrait modifier.C'est au niveau de l'édition  des entétes de colonne ''prix''

            private void editColumnAt(Point p)
              {
                int columnIndex = header.columnAtPoint(p);
             
                if (columnIndex != -1)
                {
                  column = header.getColumnModel().getColumn(columnIndex);
                  Rectangle columnRectangle = header.getHeaderRect(columnIndex);
                  text.setText(column.getHeaderValue().toString());
                  renamePopup.setPreferredSize(
                      new Dimension(columnRectangle.width, columnRectangle.height - 1));
                  renamePopup.show(header, columnRectangle.x, 0);
             
                  text.requestFocusInWindow();
                  text.selectAll();
                }
                //--- pour rentre les entêtes de "marchandisee" et "utilisation", non modifiable  mais  ça ne marche pas----------------------------------------------- 
                if (!column.getHeaderValue().equals("marchandisee") && !column.getHeaderValue().equals("utilisation")) {
                    Rectangle columnRectangle = header.getHeaderRect(columnIndex);
                 
                    text.setText(column.getHeaderValue().toString());
                    renamePopup.setPreferredSize(
                    new Dimension(columnRectangle.width, columnRectangle.height - 1));
                    renamePopup.show(header, columnRectangle.x, 0);
                 
                    text.requestFocusInWindow();
                    text.selectAll();
               }
                //----------------------------------------------------------------------------------------------------
              }
             
              private void renameColumn()
              {
                column.setHeaderValue(text.getText());
                renamePopup.setVisible(false);
                header.repaint();
              }
             

            Merci de signaler si vous avez compris mon probléme.Si oui je solicite votrre aide.



            • Partager sur Facebook
            • Partager sur Twitter
              20 décembre 2014 à 14:02:24

              Bonjour

              J'attends  votre aide avec impatience.Merci

              • Partager sur Facebook
              • Partager sur Twitter

              Entéte de colonne

              × 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