JComboBox dans JTable avec Arraylist<object[]> comme model

lex1111 Messages postés 220 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 26 octobre 2007 - 16 juil. 2007 à 10:45
lex1111 Messages postés 220 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 26 octobre 2007 - 16 juil. 2007 à 19:46
Bonjour a tous, j'ais regardé presque tout les topics sur la façon de mettre une Colonne de ma Jtable avec des Jcombobox y compris les tutos de sun, mais aucune n'a fonctionnée...
Donc je fais appel a vous...

Voici le code pour mettre une jcombobox que j'utilise mais qui ne fonctionne pas :
(la Jcombobox ne s'affiche pas, seul le valeur 6 qui est définit dans mon arraylist s'affiche dans cette colonne).


package myPack;

import java.util.ArrayList;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;

public class frame_search_info extends javax.swing.JFrame {
    

    public frame_search_info() {

        ...
        //On initialize les données de la Arraylist<object[]>
        initData();
        //On initialise le model de la Jtable
        initModel();
        ...
    }
           
    private void initData(int type){
        
        ImageIcon myIconNext=new ImageIcon(System.getProperty("user.dir")+"/data/next.png");
        
        for(int z=0;z<10;z++){
            data_list.add(new Object[]{
                        myIconNext,
                        myIconNext,
                        "2",
                        "3",
                        "4",
                        "5",
                        "6"});
        }
        
    }
    
    private void initModel(){
        
        table_list.setModel(new SpecialTableModelObject(data_list, new String[] {
                              "0",
                              "1",
                              "2",
                              "3",
                              "4",
                              "5",
                              "comboColumn"}));
        
        javax.swing.JComboBox myComboBox = new javax.swing.JComboBox();
        myComboBox.addItem("choice1");
        myComboBox.addItem("choice2");
        myComboBox.addItem("choice3");
        
        
        
        table_list.getColumnModel().getColumn(6).setCellEditor(new DefaultCellEditor(myComboBox));

    }

    
    private ArrayList<Object[]> data_list=new ArrayList<Object[]>(); 
    ....
    private org.jdesktop.swingx.JXTable table_list;
    // End of variables declaration                   
    
}


Et voici le code de ma SpecialTableModelObject


package myPack;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class SpecialTableModelObject extends AbstractTableModel {
    
    private static final long serialVersionUID = 1;
        private String[] columnNames;
        private ArrayList<Object[]> data = new ArrayList<Object[]>();
        
        
        public SpecialTableModelObject( ArrayList<Object[]> dat, String[] cols){
            super();
            columnNames = cols;
            data = dat;
            }
        
        public SpecialTableModelObject( ArrayList<Object[]> dat){
            super();
            data = dat;
            }
        
        public void misajour( ArrayList<Object[]> dat){
            data = dat;
            }
        
        public int getColumnCount() {
            return columnNames.length;
            }
 
        public int getRowCount() {
            return data.size();
            }
 
        public void setColumn(String[] column){
            columnNames = column;
            }
        
        public String getColumnName(int col) {
            return columnNames[col];
            }
 
        public Object getValueAt(int row, int col) {
            Object[] v = data.get(row);
                return v[col];
                
            }
 
        public Class<?> getColumnClass(int c) {
            return getValueAt(0, c).getClass();
            }
        
        public boolean isCellEditable(int row, int col) {
            return false;
            }
        
        public void setValueAt(String value, int row, int col) {
            Object[] v = data.get(row);
            v[col] = value;
            fireTableCellUpdated(row, col);
            }
 
    }



Je vous remercie d'avance pour toute l'aide que vous pourrez m'apporter :D

5 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 juil. 2007 à 11:40
Tu redéfinis bien le cellEditor, mais pas le cellRenderer, du coup c'est normal qu'il ne t'affiche que le textfield classique, par contre, tu devrais voir le combo dès que ta cellule prend le focus.

Va voir ma source de property table : j'y ai fait un EnumRenderer et EnumEditor (il me semble que je les ai nommé comme cà) pour justement avoir une cellule sous forme de combo.
0
lex1111 Messages postés 220 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 26 octobre 2007 1
16 juil. 2007 à 13:34
Bonjour, merci pour ta réponse j'ais essayé ce que tu m'as dis, mais ça ne fonctionne toujours pas : (j'ai bien un jcombobox qui s'affiche mais quand je click dessus, le jcombobox ne se déroule pas on à l'impression que c'est simplementu une image statique de jcombobox

voici ce que j'ais fais :

      
        String[] values = new String[]{"item1", "item2", "item3"};
        table_list.getColumnModel().getColumn(6).setCellEditor(new DefaultCellEditor(new javax.swing.JComboBox(values)));
        table_list.getColumnModel().getColumn(6).setCellRenderer(new MyComboBoxRenderer(values));
       

avec comme la class "MyComboBoxRenderer"  :

public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
    public MyComboBoxRenderer(String[] items) {
        super(items);
    }
    public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
        setForeground(table.getSelectionForeground());
        super.setBackground(table.getSelectionBackground());
        } else {
        setForeground(table.getForeground());
        setBackground(table.getBackground());
        }
   
 
        // Select the current value
        setSelectedItem(value);
        return this;
    }
}

Je ne vois pas du tout comment régler ce problème :)
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 juil. 2007 à 16:00
Il te faut implémenter un CellRenderer ET un CellEditor : comme leurs noms l'indique, le cellRenderer permet d'afficher la valeur de la cellule, alors que le CellEditor te permet de l'éditer.
0
lex1111 Messages postés 220 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 26 octobre 2007 1
16 juil. 2007 à 16:17
Bin oui c'est ce que j'ais fait :

       String[] values = new String[]{"item1", "item2", "item3"};
        table_list.getColumnModel().getColumn(6).setCellEditor(new DefaultCellEditor(new javax.swing.JComboBox(values)));
        table_list.getColumnModel().getColumn(6).setCellRenderer(new MyComboBoxRenderer(values));

Mais ça ne marche pas :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lex1111 Messages postés 220 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 26 octobre 2007 1
16 juil. 2007 à 19:46
J'ai essayé de changer mon data_list fait avec un arraylist par un data_list fait avec un object[][] comme dans le tuto de sun ici :

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#combobox

et cela marche donc ça viens bien du fait que j'utilise un arraylist...svp voyez vous ce qui cloche ?
0
Rejoignez-nous