[Java] Rafraichir Tableau [JTable]

sarahjtm Messages postés 29 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 15 janvier 2012 - 17 avril 2010 à 15:29
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 - 18 avril 2010 à 10:46
Bonjour,
Je dispose d'un tableau dans mon onglet "Historique"
dont en voici le code :

Code :

                DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(
dataTable2, // merci à scriptiz ;)
new Object[] { "Connexion à", "Password :", "le " });

final JTable table = new JTable(dm);
panel3.add(table);
JScrollPane scroll = new JScrollPane(table);
panel3.add(scroll);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);




Au dessous de ce tableau, il y a un bouton "Rafraichir" qui actuellement ne marche pas,
vous l'aurez deviné, j'aimerai que lorsque l'on clique sur "Rafraichir" que cela rafraichisse le tableau en question (car c'est un historique, et lorsque l'utilisateur clique sur un bouton, cela rajoute une ligne dans le tableau, mais qui est visible seulement si on redémarre le logiciel), c'est pour cela que j'aimerai assigner un rafraichissement du tableau à mon Bouton, pour éviter de devoir redémarrer mon logiciel pour pouvoir voir la ligne dans le tableau.

Problème :

- Je dois redémarrer le logiciel pour pouvoir voir apparaitre ma ligne dans le tableau.

Question :

- Comment rafraichir mon tableau (JTable table) lorsqu'on clique sur le bouton "Rafraichir"

Merci d'avance,
SoGeek.
Bonne journée :)

7 réponses

sarahjtm Messages postés 29 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 15 janvier 2012 4
18 avril 2010 à 09:30
Salut,
en fait voici mon code vraiment complet, en effet, peut-être que data est le meme car dataTable2 est un splipt et (data == dataTable2)

donc voici mon code (du split à la création du tableau)

panel3 = new JPanel();
Border border = BorderFactory.createTitledBorder("Historique");
panel3.setBorder(border);

String appData = System.getenv("APPDATA") + "\";

String fichier = appData + "historique.log";

try
{
InputStream ips = new FileInputStream(fichier);

InputStreamReader ipsr = new InputStreamReader(ips);

BufferedReader br = new BufferedReader(ipsr);

String ligne;

String[][] dataTable = new String[100][3];
int compteur = 0;

while ((ligne=br.readLine())!= null)
{
String str = ligne;

String[] temp;

String delimiter = "#";

temp = str.split(delimiter);

for(int i = 0; i < temp.length ; i++)
dataTable[compteur][i] = temp[i];

compteur++;	
}

final String[][] dataTable2 = new String[compteur][3];
for(int i = 0; i < compteur; i++)
{
for(int j = 0; j < dataTable[i].length; j++)
{
dataTable2[i][j] = dataTable[i][j];
}
}

final Object[][] data = dataTable2;
String  title[] = {"Connexion à", "Password", "Le"};

final ZModel model = new ZModel(data, title);
final JTable table = new JTable(model);
JScrollPane scroll = new JScrollPane(table);
panel3.add(scroll);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    ListSelectionModel selModel = table.getSelectionModel();
    panel3.revalidate();
    table.revalidate();
    model.setData(dataTable2);


Si cela ne marche pas pour moi, c'est peut-être à cause du split :x ?

SoGeek,
bonnée jour :)
et merci d'avance !
1
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
18 avril 2010 à 10:15
Je crois q' il manque la partie importante qui est l'action de ton bouton ?

Moi, je mettrais la partie lecture du fichier dans une méthode, exemple:
public static String[][] lectureHistorique()
{
[...]
}


puis simplement, dans l'initialisation et dans le rafraichissement:
model.setData( lectureHistorique() );



Pour info, voici ma copie de mon code:
	public static void main(String[] args)
{
JFrame frame = new JFrame();
final Object[][] data = { { "a0", "b0", "c0" }, { "a1", "b1", "c1" },
{ "a2", "a2", "a3" } };
String title[] = { "Connexion à", "Password", "Le" };

frame.getContentPane().setLayout(new GridBagLayout());

final ZModel model = new ZModel(data, title);
final JTable table = new JTable(model);
JScrollPane scroll = new JScrollPane(table);
frame.getContentPane().add(scroll);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


frame.getContentPane().add(new JButton(new AbstractAction("refresh")
{

@Override
public void actionPerformed(ActionEvent e)
{
final Object[][] dataBis = { { "a0", "b0", "c0" },
{ "a1", "b1", "c1" }, { "a2", "b2", "c2" },
{ "a0", "b0", "c0" }, { "a1", "b1", "c1" },
{ "a2", "a2", "a2" } };
model.setData(dataBis);
}
}));

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}




NB:
Petite optimisation, utilise une ArrayList, c'est beaucoup plus pratique, et tu limitera pas ton fichier à 100 lignes:
List<String[]> list = new ArrayList<String[]>();
list.add(new String[]{"a0", "b0", "c0"});
list.add(new String[]{"a1", "b1", "c1"});
list.add(new String[]{"a2", "b2", "c2"});
Object[][] data = list.toArray(new String[0][0]);
1
sarahjtm Messages postés 29 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 15 janvier 2012 4
18 avril 2010 à 10:35
Salut Benmor !
J'ai rajouté ton code source dans le mien à savoir :
frame.getContentPane().add(new JButton(new AbstractAction("refresh")
{

@Override
public void actionPerformed(ActionEvent e)
{
final Object[][] dataBis = { { "a0", "b0", "c0" },
{ "a1", "b1", "c1" }, { "a2", "b2", "c2" },
{ "a0", "b0", "c0" }, { "a1", "b1", "c1" },
{ "a2", "a2", "a2" } };
model.setData(dataBis);
}
}));



Lorsque je clique sur le bouton, mon tableau change bien avec les valeurs de DataBis,
mais lorsque que je met le code ainsi :

final Object[][] dataBis = dataTable2;
model.setData(dataBis);


Mon code ne change pas, car dataTable2 est déjà défini au démarrage, (et il se redefini à chaque démarrage en fonction du contenu du fichier.txt).

:(
1
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
17 avril 2010 à 21:54
Bonjour,

Tu as toutes les méthodes que tu cherche dans DefaultTableModel pour ajouter des colonnes ou des lignes:
addRow par exemple.

Ou même en rappelant "setDataVector".


NB:
La ligne "panel3.add(table);" ne sert à rien dans ton code, le tableau étant dans le jscrollpane.
0

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

Posez votre question
sarahjtm Messages postés 29 Date d'inscription mercredi 1 octobre 2008 Statut Membre Dernière intervention 15 janvier 2012 4
17 avril 2010 à 22:15
- Salut Benmor,

- j'ai créer une class AbstractTableModel :


class ZModel extends AbstractTableModel{

private Object[][] data;
private String[] title;

public ZModel(Object[][] data, String[] title){
this.data = data;
this.title = title;
}

public int getColumnCount() {
return this.title.length;
}

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

public Object getValueAt(int row, int col) {
return this.data[row][col];
}

public String getColumnName(int col) {
  return this.title[col];
}

public void setData(Object[][] newData){
    	data = newData;
    	super.fireTableDataChanged();
    }


}


- J'ai modifier mon JTable comme ceci (pour l'ajouter à cette class) :

final Object[][] data = dataTable2;
String  title[] = {"Connexion à", "Password", "Le"};

final ZModel model = new ZModel(data, title);
final JTable table = new JTable(model);
JScrollPane scroll = new JScrollPane(table);
panel3.add(scroll);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


- Et pour rafraichir, j'assimilie au bouton "Rafraichir" cette commande :

table.setData(data);


- Mais rien ne se passe, as-tu une idée :) ?

Cordialement,
SoGeek,
bonne soirée à vous :)
0
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
17 avril 2010 à 23:55
Je pense que tu voulais écrire: "model.setData(data);"

Non, pas d'idée, j'ai copié ton code, il fonctionne. Sinon c'est que "data" est le même (celui déclaré final) ?
0
benmor Messages postés 49 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 27 novembre 2011 9
18 avril 2010 à 10:46
Forcement, si tu lie qu'une foi le fichier, t'as aucune chance le rafraichir quoi que ce soit :P .

Implémente la méthode "lectureHistorique()" comme je te l'ai dis ;)
0
Rejoignez-nous