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 :

Bouton dans une JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut Bouton dans une JTable
    Bonjour à tous,
    je sais que le problème a été traité auparavant et qu'il y a des tutos, mais j'ai l'impression que mon cas est un chouya + complexe, du coup je n'arrive pas à combler les blancs dans la logique.
    Voila, j'interroge une base de données qui me donne pour chaque entrée disons 10 infos, j'en affiche 5 dans une JTable + 1 colonne de boutons "Valider" : c'est à dire que le bouton est "disable" à la base, on modifie le contenu de la ligne -> le bouton "Valider" devient enable, on clique "Valider" et cela effectue la mise à jour dans la base de données.

    http://www.hostingpics.net/viewer.ph...aCollecTab.jpg

    La structure :
    J'ai une classe "ValiderBtnCell" qui est un JPanel contenant le bouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class ValiderBtnCell extends JPanel {
    	private JButton validerBtn;
     
    	public ValiderBtnCell () {
    		validerBtn = new JButton ("Valider");
    		add(validerBtn);
    	}
    }
    - une classe "ValiderBtnCellRenderer".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class ValiderBtnCellRenderer implements TableCellRenderer {
     
    	public ValiderBtnCellRenderer () {
    	}
     
    	public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    		return (ValiderBtnCell)value;
    	}
    }
    - une classe "ValiderBtnCellEditor".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class ValiderBtnCellEditor extends AbstractCellEditor implements TableCellEditor{//, ActionListener {
    	ValiderBtnCell validerBtn;
     
    	public ValiderBtnCellEditor() {
    	}
     
        public Object getCellEditorValue() {
            return validerBtn;
        }	
    	public Component getTableCellEditorComponent (JTable table, Object value, boolean isSelected, int row, int column){
    		return (ValiderBtnCell) value;
    	}
    }
    Le soucis : je ne sais pas où placer l'actionPerformed du bouton "Valider", car si je l'écris dans les classes "ValiderBtnCell" ou "ValiderBtnCellEditor" je n'ai plus de visibilité sur les variables de la classe principale, c'est à dire la JFrame qui affiche notamment la JTable et tout le reste. Comment doit-on faire? déclarer en static les variables de la JFrame dont a besoin dans l'actionPerformed d'une autre classe? Ou bien déplacer l'action dans la classe principale?
    J'avoue que ce sont des questions de noobs mais je suis un peu paumé dans les JTable, c'est puissant... mais quand on sait comment faire, sinon on se perd dans des pistes invraisemblables lol
    Merci à ceux qui auront eu le courage de lire jusque là et de répondre ^^
    Je sais pas si c'est très clair?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    Résolution du problème : en fait je chercher toujours plus compliqué que ça ne l'est. J'ai tout simplement fait l'action dans la classe construisant l'objet à mettre dans la cellule, autrement dit un simple JPanel contenant un bouton "Valider"

    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
     
    public class ValiderBtnCell extends JPanel {
    	private JButton validerBtn;
     
    	public ValiderBtnCell () {
    		validerBtn = new JButton ("Valider");
     
    		validerBtn.addActionListener (
    				new java.awt.event.ActionListener () {
    					public void actionPerformed (java.awt.event.ActionEvent evt){
    						Valider (evt);
    					}
    				}
    		);
    		add(validerBtn);
    	}
     
    	private void Valider (java.awt.event.ActionEvent ae) {
    		Ppal.TableR.getValueAt (Ppal.TableR.getSelectedRow (), 2)
    }
    Le seul truc c'est pour accéder aux données de la table, je ne sais pas si c'est comme ça qu'il faut faire, mais j'ai déclaré la table en static dans la classe principale afin de pouvoir y accéder dans cette classe.
    Pour afficher ce JPanel j'utilise un renderer (qui ne fait rien d'autre que renvoyer le JPanel de la classe ce dessus) :
    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
     
    public class ValiderBtnCellRenderer implements TableCellRenderer {
     
    	public ValiderBtnCellRenderer () {
    	}
     
    	public Component getTableCellRendererComponent(	JTable table,
    													Object value,
    													boolean isSelected,
    													boolean hasFocus,
    													int row,
    													int column) {
    		return (ValiderBtnCell)value;
    	}
    }
    Juste avec le Renderer le bouton à l'intérieur du JPanel ne fonctionne pas, il ne s'agit que du rendu de la cellule, il faut donc la classe Editor associée :
    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
     
    public class ValiderBtnCellEditor extends AbstractCellEditor implements TableCellEditor{
    	ValiderBtnCell validerBtn;
     
    	public ValiderBtnCellEditor() {
    		super();
    		validerBtn = new ValiderBtnCell();
    	}
     
    	@Override
        public Object getCellEditorValue() {
            return validerBtn;
        }
     
    	public Component getTableCellEditorComponent (	JTable table,
    													Object value,
    													boolean isSelected,
    													int row,
    													int column){
    		return (ValiderBtnCell) value;
    	}
    }
    Elle non plus ne fait pas grand chose à part renvoyer également le JPanel avec son bouton, mais ça permet de le faire marcher ^^
    Je mets également le TableModel modifié afin de manipuler au mieux votre table :
    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
     
    public class PhilaTableModel extends AbstractTableModel implements TableModel{
    	private String [] titresColonnes;
    	private List<Piece> lignes = new ArrayList<Piece>();
     
    	public PhilaTableModel(String [] titresColonnes){
    		this.titresColonnes = titresColonnes;
    	}
     
    	public void AjouterLigne (Piece ligne){
    		lignes.add(ligne);
            fireTableRowsInserted(lignes.size()-1, lignes.size() -1);
    	}
     
    	public void Supprimer (int rowIndex){
    		lignes.remove (rowIndex);
    		fireTableRowsDeleted(rowIndex, rowIndex);
    	}
     
    	public void ViderTable () {
    		int Nblignes = lignes.size();
    		lignes.clear();
    		fireTableRowsDeleted(0, Nblignes);
    	}
     
    	public Class<?> getColumnClass(int columnIndex) {
    		return getValueAt(0, columnIndex).getClass();
    	}
    	public int getColumnCount() { return titresColonnes.length; }
    	public String getColumnName(int columnIndex) { return titresColonnes[columnIndex]; }
    	public int getRowCount() { return lignes.size(); }
    	public Object getValueAt (int rowIndex, int columnIndex) {
    		switch (columnIndex){
    		case 0 :
    			System.out.println ("coucou");
    			return lignes.get(rowIndex).getIdPiece();
    		case 1 :
    			return lignes.get(rowIndex).getPhoto();
    		case 2 :
    			return lignes.get(rowIndex).getSujet();
    		.........
    	}
     
    // On décide de quelles colonnes ne seront pas éditables, ici les 2 premières
    	public boolean isCellEditable(int row, int col) { return (col < 2) ? false : true; }
    }
    Et enfin l'appel dans la fenetre principale :
    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
     
    public class Ppal extends JFrame {
     
    	public Ppal() {
     
    // On construit notre modèle, grâce auquel on construit notre table juste après
                    philaTM = new PhilaTableModel (Entetes);
    		TableR = new JTable (philaTM);
     
    // On décide sur quelles colonnes appliquer quel renderer et quel editor
    		TableR.getColumnModel().getColumn(1).setCellRenderer (new PhotoCellRenderer());
    		TableR.getColumnModel().getColumn(8).setCellRenderer (new ValiderBtnCellRenderer());
    		TableR.getColumnModel().getColumn(8).setCellEditor (new ValiderBtnCellEditor());
    		TableR.setRowHeight(100);
     
    		// Colonnes à faire disparaitre
    		TableR.getColumnModel().getColumn(0).setPreferredWidth(0);
    		TableR.getColumnModel().getColumn(0).setMinWidth(0);
    		TableR.getColumnModel().getColumn(0).setMaxWidth(0);
     
    		for (int i=9; i<TableR.getColumnCount(); i++) {
    	                TableR.getColumnModel().getColumn(i).setPreferredWidth(0);
    			TableR.getColumnModel().getColumn(i).setMinWidth(0);
    			TableR.getColumnModel().getColumn(i).setMaxWidth(0);
    		}
     
    		JScrollPane ScrlPnl = new JScrollPane (TableR);
                    OngletPnl2.add (ScrlPnl, BorderLayout.CENTER);
    		Onglets.addTab("Recherche", new ImageIcon ("./images/Recherche.png"), OngletPnl2);
    		getContentPane().add(Onglets);
    }
    Petite astuce également, comme j'avais besoin de récupérer des données de la table mais sans pour autant les afficher on peut faire disparaitre des colonnes. Vous pouvez mettre ces colonnes invisibles à la fin de la JTable et utiliser la boucle pour définir leur largeur à 0 de cette manière.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut setValueAt()
    Je viens de résoudre un autre mystère (enfin pour un noob), quand je modifiais les valeurs à l'intérieur d'une cellule, dès que j'en sortais c'est l'ancienne valeur qui se remettait, donc impossible à modifier. En fait il ne faut surtout pas oublier d'implémenter la méthode setValueAt() dans le modèle de table :

    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
     
    public void setValueAt (Object aValue, int rowIndex, int columnIndex) {
    		if (aValue != null) {
    			Piece piece = lignes.get (rowIndex);
    			switch (columnIndex){
    			case 2 :
    				System.out.println ("coucou");
    				piece.setSujet((String) aValue);
    				break;
    			case 3 :
    				piece.setType((String) aValue);
    				break;
    			case 4 :
    				piece.setRace((String) aValue);
    				break;
    			case 5 :
    				piece.setPays((String) aValue);
    				break;
    			case 6 :
    				piece.setNumero((String) aValue);
    				break;
    			case 7 :
    				piece.setDescription((String) aValue);
    				break;
    			}
    		}
    	}

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Par défaut
    Voila mon souci, j'ai un JTable avec 5 colonnes. Dans la colonne 4, j'ai des boutons ouvrir. C'est un JTable qui permet l'affichage de message et le bouton ouvrir ouvre le message dans une boîte de dialogue, seulement j'ai besoin des 3 premières colonnes pour retrouver mon message dans Ma base de données. Comment je peux faire pour spécifier cela quand je clique sur ouvrir. Je sais que je dois le mettre dans l'ActionPerformed.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre à jour un bouton dans une JTable
    Par peofofo dans le forum Composants
    Réponses: 2
    Dernier message: 06/01/2012, 22h51
  2. bouton dans une Jtable
    Par boumacmilan dans le forum Composants
    Réponses: 3
    Dernier message: 19/06/2009, 13h34
  3. inserer un bouton dans une jtable qui marche
    Par christianf dans le forum Composants
    Réponses: 1
    Dernier message: 27/09/2007, 02h07
  4. bouton dans une jtable
    Par hokidoki dans le forum Composants
    Réponses: 1
    Dernier message: 15/05/2006, 19h46
  5. Insertion des boutons et des images dans une JTable
    Par anouar dans le forum Composants
    Réponses: 2
    Dernier message: 17/11/2005, 21h23

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