Remplir jtable

laurent2403 Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   -  
laurent2403 Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'aurais besoin s'il vous plait que quelqu'un regarde et aussi pouvait corriger mon code car je ne comprend pas pourquoi je n'arrive pas a remplir ma jtable du contenu de mon fichier constitue de (désignation,PU) voici mon code ,et merci beaucoup pour toute l'aide que vous m'apportez...


package methodologie_projet;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JTable;
import javax.swing.JScrollPane;

public class RemplirJTable extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JButton btnremplir;

// attributs non_graphique
private String[] entetes = { "designations", "PU" };
private Object[][] donnees = new Object[100][2];
private JTable table;
private JScrollPane scrollPane_1;

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

public RemplirJTable() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 799, 449);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
contentPane.add(getBtnremplir());
contentPane.add(getScrollPane_1());
}

private JButton getBtnremplir() {
if (btnremplir == null) {
btnremplir = new JButton("remplir");
btnremplir.setBounds(335, 343, 97, 25);
btnremplir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
remplir();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}
});

}
return btnremplir;
}

private void remplir() throws IOException {//methode
// ouverture d'un stream
FileReader fr = new FileReader("sauve_login.txt");
BufferedReader br = new BufferedReader(fr);
String designation;
String PU;
int row = 0;

String ligne = br.readLine();
while (ligne != null) {
String[] tabChaine = ligne.split(";");// decoup de chaque ligne
designation = tabChaine[0];
PU = tabChaine[1];
// code propre au jtable
table.setValueAt(designation, row, 0);
table.setValueAt(PU, row, 1);
// ne pas oublier pour suivre la lecture du fichier
ligne = br.readLine();
row++;
}

}

private JTable getTable() {
if (table == null) {
table = new JTable(donnees, entetes);

}
return table;
}

private JScrollPane getScrollPane_1() {
if (scrollPane_1 == null) {
scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(140, 23, 441, 209);
scrollPane_1.setViewportView(getTable());
}
return scrollPane_1;
}
}



4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je viens d'essayer ton code et ça fonctionne (cf. screenshot.png)... Où est le problème ?

Remarque : il y a plus élégant que de créer un tableau très grand initialement vide et de changer les cases. On peut utiliser un Model pour ajouter des lignes au fur et à mesure.

private DefaultTableModel model;

private JTable getTable()
{ 
    if (table==null)
    {
        model = new DefaultTableModel();
        model.setColumnIdentifiers(entetes);
        table = new JTable(model);
    }
    
    return table;
}

private void remplir() throws IOException
{
    Scanner sc = new Scanner(new File("sauve_login.txt"));
	
    while (sc.hasNextLine())
        model.addRow(sc.nextLine().split(";"));
	
    sc.close();
}
2
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Est-ce que l'on parle bien du même code ? Parce que là il t'indique une erreur dans la méthode remplir() à la ligne 114, alors que moi cette méthode va des lignes 74 à 95.

Cependant vu le message d'erreur dont il s'agit, je pencherais pour un problème ici :
PU = tabChaine[1];
En effet, si tu n'as pas de point-virgule sur une ligne, le split(";") renverra un tableau tabChaine avec une seule case, et il y aura une erreur d'accès quand on essaye de lire la seconde case.

Dans ce cas il s'agit surtout d'une erreur dans le fichier, puisque l'on suppose a priori qu'il contient sur chaque ligne quelque chose de la forme "designation;PU"

Tu peux alors changer ton code comme ceci :

String[] tabChaine = ligne.split(";");// decoup de chaque ligne
if (tabChaine!=null && tabChaine.length==2)
{
    designation = tabChaine[0];
    PU = tabChaine[1];
    // code propre au jtable
    table.setValueAt(designation, row, 0);
    table.setValueAt(PU, row, 1);
}
else
    System.err.printf("Ligne %d invalide :\n\t%s\n",row,ligne);

Remarque : si tu utilises mon code, tu n'auras pas ce problème là, mais par contre tu auras une case vide pour chaque champ manquant.
2
laurent2403 Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   2
 
bonjour KX je comprend pas ,ma jframe s'affiche mais quand je clique sur remplir ce qu'il me met:


Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
at methodologie_projet.RemplirJTable.remplir(RemplirJTable.java:114)
at methodologie_projet.RemplirJTable.access$0(RemplirJTable.java:99)
at methodologie_projet.RemplirJTable$2.actionPerformed(RemplirJTable.java:88)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

merci pour ton aide...
1
laurent2403 Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   2
 
salut KX
je viens de m'apercevoir de ma boulette,j'ai pas de ";" entre mes objets dans mon fichier txt ...
ça risque pas de tourner...
merci pour ton aide
1