IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Jtable, combobox et listener


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Par défaut Jtable, combobox et listener
    Bonjour à toutes et a tous,
    je suis débutant en java et j'essaie de comprendre tant bien que mal comment fonctionnent des JTable avec des composants de types ComboBox notamment.

    Je suis plus ou moins parvenu à mes fin en bidouillant mais j'aimerai avoir votre avis .

    Donc j'ai un tableau avec une colonne qui contient des JCombobox, les comboBox sont gérés naturellement, en initialisant l' éditeur des cellule d'une colonne avec un objet DefaultCellEditor qui reçoit en paramètre une JComboBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.tableau.getColumn("TEST").setCellEditor(new DefaultCellEditor(new JComboBox(comboData)));
    mais je ne voyais pas trop comment gérer les lignes et colones dans la classe me servant de listener de cette manière , de plus j'avais quelques problème d'affichage ...

    J'ai donc créé un objet comboEditor hérité de defaultCellEditor, mais j'ai eu un petit problème car étant donné que je n' avais qu'un seul ComboBox pour toute la colonne, lorsque je choisissais un des éléments de la liste d'un comboBox et que je cliquais sur le comboBox d'une autre ligne (qui si j'ai bien compris et le même ) l'affichage se mettant à jour et j'obtenais la même sélection partout ou je cliquais ...

    Pour résoudre ce problème j'ai créé un tableau de JComboBox dans ma classe
    ComboEditor, avec autant de combo que j'ai de ligne et je me base donc sur la ligne pour savoir à quel combo j'ai affaire . De cette manière je n'ai plus de problème . Je me sert de l'item sélectionné pour la méthode getCellEditorValue .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public Object getCellEditorValue(){
    		return comboBox[this.ligne].getSelectedItem();
    	}
    Ça ma permis de régler un autre problème, car je souhaitais aussi afficher le comboBox des le début et non pas uniquement au click.

    J' avais créé une classe ComboRenderer hérité d'un JComboBox implémentant TableCellRenderer , et je me servais de la valeur récupéré pour changer le setSelected du rendu ( JcomboBox unique pour tout le rendu il me semble ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    import java.awt.Component;
    import javax.swing.JComboBox;
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
     
    public class ComboRenderer extends JComboBox implements TableCellRenderer{
     
     
    	public ComboRenderer()
    	{
    		this.addItem("Très bien");
    		this.addItem("Bien");
    		this.addItem("Mal");
    	}
     
     
    	public Component getTableCellRendererComponent(	JTable table, Object value,
    													boolean isSelected, boolean isFocus,
    													int row, int col) {
     
    		System.out.println("ComboRenderer "+row+" "+col);
    		this.setSelectedItem(value);
     
    		return this;
    	}
    }
    Je vous met aussi le code du comboEditor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
     
     
    public class ComboEditor extends DefaultCellEditor {
     
    	protected JComboBox[] comboBox;
    	private boolean   isPushed;
    	private comboListener bListener = new comboListener();
    	private int ligne ;
     
    	public ComboEditor(JCheckBox checkBox, int nCombo)
    	{
     
    		super(checkBox);
    	    //On crée à nouveau notre bouton
     
    		comboBox = new JComboBox[nCombo];
     
    		for( int i = 0 ; i < nCombo ; i ++ )
    		{
    			comboBox[i] = new JComboBox();
    			comboBox[i].setOpaque(true);
     
    			comboBox[i].addItem("Très bien");
    			comboBox[i].addItem("Bien");
    			comboBox[i].addItem("Mal");
     
    		    //On lui attribue un listener
    			comboBox[i].addActionListener(bListener);
    		}
     
    	}
     
    	public Component getTableCellEditorComponent(JTable table, Object value,
    	                   boolean isSelected, int row, int column) { 
    		//On définit le numéro de ligne à notre listener
    		bListener.setRow(row);
    		//Idem pour le numéro de colonne
    		bListener.setColumn(column);
    		//On passe aussi le tableau pour des actions potentielles
    		bListener.setTable(table);
     
    		this.ligne = row ;
    		//On renvoie le combo
    	    return comboBox[row];
    	}
     
     
    	public Object getCellEditorValue(){
    		return comboBox[this.ligne].getSelectedItem();
    	}
     
    	class comboListener implements ActionListener{
     
    		  private int column, row;
    		  private JTable table;
    		  private int nbre = 0;
    		  private JComboBox combo;
     
    		  public void setColumn(int col){this.column = col;}
    		  public void setRow(int row){this.row = row;}
    		  public void setTable(JTable table){this.table = table;}
     
    		  public JComboBox getCombo(){return this.combo;}
     
    		  public void actionPerformed(ActionEvent event) {
     
    			  System.out.println("editor listener : "+comboBox[row].getSelectedItem());
    		  }
    	  }
     
    }
    Voila en faisant ainsi j'obtiens un résultat qui me semble satisfaisant mais étant débutant je préfère avoir l'avis de plus expérimentés .
    On a souvent tendance a se compliquer la vie inutilement au début .

    Merci d'avance pour le temps que vous m 'aurai accordé !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Par défaut
    Personne ? je sais que c'est un peu long mais vous en avez vu d'autres non ...
    A votre bon cœur

Discussions similaires

  1. Listener sur JTable
    Par calypso dans le forum Composants
    Réponses: 3
    Dernier message: 05/02/2009, 16h27
  2. Remplir combobox par listener
    Par ptitepo dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 13/01/2009, 15h35
  3. [NETBEANS] JTable combobox
    Par fraco dans le forum NetBeans
    Réponses: 6
    Dernier message: 02/03/2008, 19h42
  4. jtable, combobox dans une cellule
    Par fraco dans le forum Composants
    Réponses: 8
    Dernier message: 27/10/2007, 11h20
  5. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo