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 :

Comment mettre un JButton dans une JTable


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Comment mettre un JButton dans une JTable
    Ben voila, je crois que tout est dit dans le titre. Je cherche à créer une JTable avec 4 colonnes dont la derniere pourrait contenir un JButton.

    Comment ensuite on recupere l'evenement associé?? Est ce pareil que pour un JButton mis dans un panel??

    Derniere petite question, je souhaite ajouter des lignes de données dans ma table à l'aide d'un clic sur un JButton exterieur a ma JTable, comment rajouter des donnees dans une table deja instanciée?

    J'espere avoir ete assez clair

    Je suis dispo si vous voulez plus de précision

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour les boutons penche toi sur l'implémentation des interfaces TableCellEditor et TableCellRenderer. Pour les évènements, ActionListener ou MouseListener

    Pour rajouter des lilgnes dans ta JTable après l'instanciation, direction le modèle de ta JTable (en espérant qu'il soit correctement redéfini ou que tu utilise un DefaultTableModel)

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Tu peux aussi ajouter des lignes dynamiquement avec un AbstractTableModel, mais il faut que tu l'étendes et que tu crées les méthodes addRow() et removeRow().

    Moi c'est ce que j'ai fait pour une de mes tables. Voici la structure de ma classe :

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    class MyTableModel extends AbstractTableModel {
    	    private String[] columnNames = {...};
    	    private ArrayList data;
     
     
     
    	    public MyTableModel() {
    	    	data = new ArrayList(1);
    	    }
     
    	    /**
                 * Supprime une ligne du tableau.
                 * @param int row : le numéro de la ligne à supprimer.
                 */
    	    public void removeRow(int row) {
    	   		if (data.size() > 0 && row < data.size()){
    	   			data.remove(row);
     
    	   			//+traitements particuliers : mise à jour de numéros de ligne, etc...
        		}
    			fireTableDataChanged();
    		}
     
    	    /**
                 * Ajoute une ligne à la fin du tableau.
                 * @param Object[] row : les données de la ligne à ajouter.
                 */
    		public void addRow(Object[] row) {
    			if (row != null && row.length > 0) {
    				data.add(row);
    				fireTableDataChanged();
    			}
    		}
     
    		/**
                     * Remplace les données du tableau.
                     * @param ArrayList newData : les nouvelles données à afficher.
                     */
    		public void setData(ArrayList newData) {
    			data = newData;
    			fireTableDataChanged();
    		}
     
    	    public int getColumnCount() {
    	        return columnNames.length;
    	    }
     
    	    public int getRowCount() {
    	    	return data.size();
    	    }
     
    	    public String getColumnName(int col) {
    	        return columnNames[col];
    	    }
     
    	    public Object getValueAt(int row, int col) {
    	    	return ((Object[])data.get(row))[col];
    	    }
     
    	    /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than 
             */
    	    public Class getColumnClass(int c) {
    	        return getValueAt(0, c).getClass();
    	    }
     
            /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
    				System.out.println("Setting value at " + row + "," + col //$NON-NLS-1$ //$NON-NLS-2$
    						+ " to " + value + " (an instance of " //$NON-NLS-1$ //$NON-NLS-2$
    						+ value.getClass() + ")"); //$NON-NLS-1$
    			}
     
    			// data[row][col] = value;
    			((Object[])data.get(row))[col] = value;
     
    			// fireTableCellUpdated(row, col);
     
    			if (DEBUG) {
    				System.out.println("New value of data:"); //$NON-NLS-1$
    				printDebugData();
    			}
            }
     
            private void printDebugData() {
                int numRows = getRowCount();
    			int numCols = getColumnCount();
     
    			for (int i=0; i<numRows; i++) {
    				System.out.print("    row " + i + ":"); //$NON-NLS-1$ //$NON-NLS-2$
    				for (int j=0; j<numCols; j++) {
    					// System.out.print(" " + data[i][j]);
    					System.out.print("  " + ((Object[])data.get(i))[j]); //$NON-NLS-1$
    				}
    				System.out.println();
    			}
    			System.out.println("--------------------------"); //$NON-NLS-1$
            }
     
    		public int getMaxLength(){
    			int res = -1;
    			for (int i=0; i<data.size(); i++) {
    				for (int j=0; j<((Object[])data.get(i)).length; j++) {
    					res = Math.max(res,((Object[])data.get(i))[j].toString().length());
    				}
    			}
     
    			return res;
    		}
     
    // /*
    // * Don't need to implement this method unless your table's
    //	     * editable.
    //	     */
    //	    public boolean isCellEditable(int row, int col) {
    //	        //Note that the data/cell address is constant,
    //	        //no matter where the cell appears onscreen.
    //	        if (col < 2) {
    //	            return false;
    //	        } else {
    //	            return true;
    //	        }
    //	    }
    Et utilise bien un ArryList et non pas un tableau pour pouvoir justement ajouter et supprimer des lignes plus facilement.

    Ne fait pas attention aux commentaires "//$NON-NLS-1$", c'est pour l'externationalisation des chaînes de caractères...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Merci de vos réponses, je vais tester tout ca tout de suite

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 46
    Points : 46
    Points
    46
    Par défaut
    J'ai un problème similaire, j'essaye d'afficher des JPanel dans une JTable, mais je n'arrive qu'à afficher la description du panel au lieu du panel lui-même

    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
    public class OrderJTable extends JTable {
     
    	public OrderJTable() {
    		super(new DefaultTableModel());
    		getModel().addColumn("commande");
    		setDefaultEditor(OrderPanel.class, new OrderPanelEditor());
    		setDefaultRenderer(OrderPanel.class, new OrderPanelRenderer());
    	}
     
    	private class OrderPanelRenderer implements TableCellRenderer {
     
    		public Component getTableCellRendererComponent(JTable table, Object value, 
    				boolean isSelected, boolean hasFocus, int row, int column) {
    			OrderPanel op = (OrderPanel) value;
    			return op;
    		}
     
    	}
     
     
    	private class OrderPanelEditor implements TableCellEditor {
     
    		public Component getTableCellEditorComponent(JTable table, Object value, 
    				boolean isSelected, int row, int column) {
    			OrderPanel op = (OrderPanel) value;
    			return op;
    		}
     
    		...
    	}
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class OrderPanel extends JPanel {
    ...
    }
    J'ai un peu de mal avec les Renderer et les Editor ...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    J'ai réussi à afficher un bouton dans une JTable et en récuperer l'evenement associé.

    Mais par contre, quand je lance mon applet, la table s'initialise bien mais le label du bouton ne s'affiche pas, il faut cliquer dessus pour qu'il s'affiche. Quelqu'un a t il une idée?

  7. #7
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Points : 250
    Points
    250
    Par défaut
    repaint ?

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/10/2007, 12h25
  2. Comment mettre un JTextfield dans une JList ?
    Par ShakaZulu dans le forum Composants
    Réponses: 2
    Dernier message: 25/08/2006, 17h37
  3. [JBoss] Comment mettre autoCommit à false dans une Datasource ?
    Par seb55555 dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 26/06/2006, 16h12
  4. comment mettre des int dans une char??
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 21/04/2006, 18h02
  5. Icon pour pour JButton dans une Jtable + pb colonnes
    Par dim_italia dans le forum Composants
    Réponses: 3
    Dernier message: 22/02/2006, 19h05

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