Affichage JTable

Résolu/Fermé
Coucou1504 Messages postés 60 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 12 février 2010 - 3 juin 2009 à 18:03
mehdi_boussarhane Messages postés 50 Date d'inscription dimanche 23 novembre 2008 Statut Membre Dernière intervention 15 janvier 2012 - 26 janv. 2011 à 15:26
Bonjour,
Je voudrais savoir comment je peux afficher les données de ma JTable au fur et à mesure car je récupére les donnée d'une balance, mais mon tableau attend que toutes les pesée soit faite pour afficher mon tableau, et c'est enbetant. Savez vous comment je peux faire?
Merci d'avance
Krikri

11 réponses

sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
3 juin 2009 à 21:38
Re,

Tout d'abord Table c ma JTable (je travaille sous netbeans) elle est définis plus haut dans mon code <== nan, regarde bien, pas de définition de "Table" dans ton code (uniquement de "table", avec minuscule)

Je te file un tit exemple fait à la va-vite. Crée la classe Coucou1504 sous Netbeans et copie-colle le contenu suivant:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Coucou1504 extends JFrame {
	private JTable table;

	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Coucou1504 frame = new Coucou1504();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Coucou1504() {
		super();
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JScrollPane scrollPane = new JScrollPane();
		getContentPane().add(scrollPane);

		table = new JTable();
		scrollPane.setViewportView(table);

		// Le seul but de cette méthode est de mettre en évidence
		// le remplissage initial du modèle
		initTable(table);

		final JPanel southPane = new JPanel();
		getContentPane().add(southPane, BorderLayout.SOUTH);

		final JButton addRowsButton = new JButton();
		addRowsButton.addActionListener(new ActionListener() {
			public void actionPerformed(final ActionEvent e) {
				// Créer un thread de génération auto de lignes
				// à rajouter au modèle de notre table
				Thread rowAppenderThread = new Thread() {
					// notre table à déjà 3 lignes, démarrer donc avec la 4ème
					private int initialCounter = 3;

					@Override
					public void run() {
						// Boucle infinie
						while (true) {
							Object[] row = new Object[] { "val " + initialCounter + ".0", "val " + initialCounter++ + ".1" };
							System.out.println("Adding row: " + row[0] + " " + row[1]);
							DefaultTableModel model = (DefaultTableModel) table.getModel();
							model.addRow(row);

							// Marquer une pause d'une seconde
							try {
								Thread.yield();
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				};

				rowAppenderThread.start();
			}
		});

		addRowsButton.setText("Add rows");
		southPane.add(addRowsButton);
		//
	}

	private void initTable(JTable table) {
		Object[][] data = new Object[][] { { "val 0.0", "val 0.1" }, { "val 1.0", "val 1.1" }, { "val 2.0", "val 2.1" } };
		Object[] columns = new Object[] { "Fst column", "Second column" };

		table.setModel(new DefaultTableModel(data, columns));
	}

}
A l'exécution, appuie sur le bouton pour insérer des lignes (chaque ligne est créée dans un thread dédié). Il y a aussi de tits commentaires, lis-les.

Bonne soirée toi aussi :-)
++
2
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
3 juin 2009 à 18:39
Hello,

Une JTable affiche les données contenues dans son modèle. Donc c'est tout à fait faisable en insérant successivement des éléments dans le modèle. Ce dernier informera la JTable qu'il y a du nouveau et celle-ci va s'auto-rafraîchir.

++
0
Coucou1504 Messages postés 60 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 12 février 2010 3
3 juin 2009 à 19:33
Bonsoir
J'ai fait comme ca mais ca m'affiche tous à la fin!!
public Object [][] VerificationPeser(int i) throws IOException
    {
            int colNo = 4;
            int nombreLigne=5;
            Object[][] informations = new Object[nombreLigne][colNo]; // On créé un tableau pour chaque ligne de la taille du JTable
            for(i=0;i<nombreLigne;i++)
            {
                int numEchantillon=Balance.RecupererNumEchantillon(i);
                int numAiguille=Balance.RecupererNumAiguille(i);
                String poids=bufRead.readLine();
                poids=poids.replace(" ","");
                //String poids="5654";
                informations[i][0]=numEchantillon;
                informations[i][1]=numAiguille;
                informations[i][2]=poids;
                informations[i][3]=new Boolean(false);
                System.out.println(i);
            }
            return informations;
             
    }
Pourquoi??
Bonne soirée
Krikri
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
3 juin 2009 à 19:36
Je ne comprends pas ton code... Où est-ce que tu crées ta JTable? Et son modèle? Et à quel endroit de ton code tu alimentes le modèle?

Je pense que tu as posté un mauvais bout de code.
0

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

Posez votre question
Coucou1504 Messages postés 60 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 12 février 2010 3
3 juin 2009 à 20:23
Bonjour,
Merci!!
Oui en effet j'ai oublié du code là c'est le modele de mon tableau
alors la gestion de ma JTable :
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package balance;

import com.sun.comm.Win32Driver;
import java.awt.Component;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

/**
 *
 * @author Christine
 */
public class Tableau
{
    JTable laTable;
    private boolean DEBUG=false;
    Balance balance;
    private ArrayList listePoids=new ArrayList();
    private BufferedReader bufRead;
    private CommPortIdentifier portId;
    private SerialPort sPort;
    public Tableau(int i) throws IOException, NoSuchPortException, PortInUseException, UnsupportedCommOperationException
    {
            Win32Driver w32Driver = new Win32Driver();
            w32Driver.initialize(); //initialisation du driver
            portId = CommPortIdentifier.getPortIdentifier("COM1"); //identification du port COM1
            sPort = (SerialPort) portId.open("BalanceAutomatique", 3000); //Ouvertur du port COM1
            sPort.setSerialPortParams(9600, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD);
            bufRead = new BufferedReader(new InputStreamReader(sPort.getInputStream())); //Preparation de la lecture du port COM1
        this.laTable = new JTable(new MyTableModel(i));
        initColumnSizes(laTable);
       // balance=new Balance();
    }
 
    private void initColumnSizes(JTable table) {
        MyTableModel model = (MyTableModel)table.getModel();
        TableColumn column = null;
        Component comp = null;
        int headerWidth = 0;
        int cellWidth = 0;
        Object[] longValues = model.longValues;
        TableCellRenderer headerRenderer =
        table.getTableHeader().getDefaultRenderer();

        int indexFin=0;


        for (int i = 0; i < indexFin; i++) {
            System.out.println(i);
            System.out.println(indexFin);
            column = table.getColumnModel().getColumn(i);

            comp = headerRenderer.getTableCellRendererComponent(
                                 null, column.getHeaderValue(),
                                 false, false, 0, 0);
            headerWidth = comp.getPreferredSize().width;

            comp = table.getDefaultRenderer(model.getColumnClass(i)).
                             getTableCellRendererComponent(
                                 table, longValues[i],
                                 false, false, 0, i);
            cellWidth = comp.getPreferredSize().width;

            if (DEBUG) {
                System.out.println("Initializing width of column "
                                   + i + ". "
                                   + "headerWidth = " + headerWidth
                                   + "; cellWidth = " + cellWidth);
            }

            column.setPreferredWidth(Math.max(headerWidth, cellWidth));
        }
    }
    
    public Object [][] VerificationPeser(int i) throws IOException
    {
            int colNo = 4;
            int nombreLigne=5;
            Object[][] informations = new Object[nombreLigne][colNo]; // On créé un tableau pour chaque ligne de la taille du JTable
            for(i=0;i<nombreLigne;i++)
            {
                int numEchantillon=Balance.RecupererNumEchantillon(i);
                int numAiguille=Balance.RecupererNumAiguille(i);
                String poids=bufRead.readLine();
                poids=poids.replace(" ","");
                //String poids="5654";
                informations[i][0]=numEchantillon;
                informations[i][1]=numAiguille;
                informations[i][2]=poids;
                informations[i][3]=new Boolean(false);
                System.out.println(i);
            }
            return informations;
             
    }
   
 public Object[][] getResultat(int i) throws IOException
    {
        Object[][] tableaudesResultats=null;
        tableaudesResultats=VerificationPeser(i);
        return tableaudesResultats;
    }

    

    class MyTableModel extends AbstractTableModel {
        private String[] columnNames;

        private Object[][] data;

        public final Object[] longValues = {"Vosse","Christine",Boolean.TRUE,Boolean.TRUE};
        private boolean DEBUG;

        public MyTableModel(int i) throws IOException
        {
                String[] columnNamesResultat={"Num Aiguille","Num Echantillon","Poids","Erreur"};
                columnNames=columnNamesResultat;
                data=getResultat(i);

        }

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[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 a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * 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 < 3) {
                return false;
            } else {
                return true;
            }
        }

        /*
         * 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
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data[row][col] = value;
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }
}

et maintenant l'appel
  try {
            for(int i=0;i<5;i++)
            {
            Table.setModel(new Tableau(i).laTable.getModel());
            }
        } catch (IOException ex) {
            Logger.getLogger(framePesee1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchPortException ex) {
            Logger.getLogger(framePesee1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (PortInUseException ex) {
            Logger.getLogger(framePesee1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedCommOperationException ex) {
            Logger.getLogger(framePesee1.class.getName()).log(Level.SEVERE, null, ex);
        }
          

Merci de vouloir m'aider car là ca m'enerve je ne sais pas comment faire!!
Bonne soirée
Christine
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
3 juin 2009 à 20:34
oulà... ça fait une soirée et demie de lecture ^^

J'attends que le vent change mon humeur pour commencer la lecture de ton code... Pour le moment, c'est le calme plat, mais qui sait :-)

Je remarque ceci:
for(int i=0;i<5;i++)
{
Table.setModel(new Tableau(i).laTable.getModel());
}


Et je ne pige pas: tu demande à la classe Tableau (euh, choisis un nom plusparlant, Tableau ne veut pas dire grand-chose dans ton cas) de te retourner le modèle de la JTable qu'il possède en tant que field. Muy bien. Maintenant, tu fais un setModel avec le modèle récupéré pour un objet "Table" inconnu, non déclaré. Pourquoi "Table" avec une majuscule? Aucune idée. L'effet est, bien sûr, celui de mettre à jour le modèle. Mais tu fais ceci dans une boucle qui ne fait que ça. L'effet total sera égal à celui d'une seule ligne...

Bon, essaie de préciser un peu ce que tu veux faire avec ton code... Il est long à lire...
0
Coucou1504 Messages postés 60 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 12 février 2010 3
3 juin 2009 à 21:29
Bonsoir
Tout d'abord Table c ma JTable (je travaille sous netbeans) elle est définis plus haut dans mon code
Ensuite, c'est vrai que je ne sais pas pourquoi j'ai mis cette boucle (j'ai fait tellement d'essai!!)
je ne sais pas trouver de nom pour mes classes, mais la classe Tableau permet la definition du tableau le modèle de la JTable.
Donc moi ce que je voudrais obtenir c quand j'obtient le premier poids une premiere ligne de la JTable s'affiche
Quand je recois un deuxime poids qu'une deuxieme ligne s'affiche ainsi de suite...
Mais là il faut que j'attende la fin des 5 pesées pour obtenir ma JTable.
Je met mes resultats dans une JTable car je veux pouvoir modifier un poids en cas d'erreur de manipulation donc j'ai un tableau à 4 colonnes avec Numero d'échantillon, Numero Aiguille le poids, et un checkbox.
Voilà j'ai entendu parler des Threads mais je ne sais pas m'en servir pour les JTable!!
Encore merci de vouloir m'aider
Bonne soirée
Christine
0
Coucou1504 Messages postés 60 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 12 février 2010 3
3 juin 2009 à 21:50
Merci de ton aide!!
J'y regarderai en profondeur demain, je te tiens au courant
Bonne nuit
Christine
0
Coucou1504 Messages postés 60 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 12 février 2010 3
4 juin 2009 à 19:30
Merci mille fois!!
Ca fonctionne trés bien!! Bon il y a juste l'histoire du checkbox mais je m'en suis sortie autrement!!
Encore merci
Bonne soirée
Christine
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
4 juin 2009 à 19:31
=)

Nenuit...
0
mehdi_boussarhane Messages postés 50 Date d'inscription dimanche 23 novembre 2008 Statut Membre Dernière intervention 15 janvier 2012 13
26 janv. 2011 à 15:26
merci infiniment
mehdi
0