Probleme affichage dans un JTable

Résolu
Cornellus1985 Messages postés 22 Date d'inscription dimanche 26 avril 2009 Statut Membre Dernière intervention 7 juillet 2009 - 7 juil. 2009 à 17:19
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 7 juil. 2009 à 18:40
Bonjour,
J'ai realise un petit calendrier a l'aide de la librairie Swingx.
L'appli a ete realisee en MVC. Le probleme se produit quand je veux ajouter une ligne dans le JTable. Chaque ligne est representee par un objet Task. J'ai aussi cree un "TaskTableModel" qui herite de AbstractTableModel et dont je passe a mon objet JTable au moment de son instanciation.

En bref, j'ai 4 classes.

- une classe Task qui represente a chaque fois une ligne dans le JTable.

- une classe TableTask qui herite de JPanel et qui est le controller, c'est a dire qu'il se charge d'instancier tous les objets, les collections, les evenements, etc... pour ajouter, supprimer, editer un task.

- une classe TaskTableModel qui herite de AbstractTableModel et qui est le model pour mon objet JTable instancie dans la classe TableTask. Il definit la facon d'afficher, et procure des getter et des setters pour pouvoir effectuer des modif, des insertions et des suppressions dans le JTable.

- une classe TaskView qui herite de JPanel et qui est la vue. On y instancie notre objet TableTask et on l'ajoute a notre contentPane.

Le probleme est qu'a chaque fois que j'ajoute un Task a mon vector<task> qui constitue mon model, il ajoute correctement l'objet dans la collection avec les bonnes valeurs pour ses attributs, mais ca foire dans l'affichage du JTable. En effet, a chaque fois qu'on ajoute un objet task a notre JTable, il affiche les valeurs du header et non les valeurs des attributs de l'objet task concerne. Je ne sais vraiment pas comment remedier a ce probleme.
N'hesitez pas a me demander le code, parce que c'est effectivement un peu chaud a comprendre comme ca.

Un grand merci d'avance a ceux qui m'aideront a resoudre ce probleme d'affichage.

Cordialement,</task>

4 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
7 juil. 2009 à 17:45
Salut,

A première vue, ton problème vient de là :

public String getIndex(int index){
switch(index){
case 0:
return "name";
case 1:
return "text";
case 2:
return "subject";
case 3:
return "date";
case 4:
return "priority";
}
return null;
}

Tu renvoie toujours le nom de la propriété et non la valeur de la propriété de ta classe...
Tu devrais plutôt avoir un truc du genre :
public String getIndex(int index){
switch(index){
case 0:
return name;
case 1:
return text;
case 2:
return subject;
case 3:
return date;
case 4:
return priority;
}
return null;
}
3
Cornellus1985 Messages postés 22 Date d'inscription dimanche 26 avril 2009 Statut Membre Dernière intervention 7 juillet 2009
7 juil. 2009 à 17:25
public class Task {

private String name;
private String subject;
private String text;
private String date;
private String priority;

public Task(String name, String text, String subject, String date, String tpc){
this.name = name;
this.subject = subject;
this.text = text;
this.date = date;
this.priority = tpc;
}

public String getIndex(int index){
switch(index){
case 0:
return "name";
case 1:
return "text";
case 2:
return "subject";
case 3:
return "date";
case 4:
return "priority";
}
return null;
}

public void setIndex(int index, Object value){
switch(index){
case 0:
setName((String) value);
break;
case 1:
setText((String) value);
break;
case 2:
setSubject((String) value);
break;
case 3:
setDate((String) value);
break;
case 4:
setTpc((String) value);
}
}

public void setName(String name) {
this.name = name;
}

public void setSubject(String subject) {
this.subject = subject;
}

public void setText(String text) {
this.text = text;
}

public void setDate(String date) {
this.date = date;
}

public void setTpc(String tpc) {
this.priority = tpc;
}

public String getName() {
return name;
}

public String getSubject() {
return subject;
}

public String getText() {
return text;
}

public String getDate() {
return date;
}

public String getTpc() {
return priority;
}

@Override
public String toString(){
return getName() + ", " + getSubject() + ", " + getText() + ", " + getDate() + ", " + getTpc();
}

}


public class TableTask extends JPanel implements ActionListener{

private String columnNames[] = {"Name", "Text", "Subject", "Date", "Priority"};
private Vector<Task> taskManager;
private TaskTableModel model;
private Task aTask;

private JTable tableTask;
private JButton add_button, delete_button;
private JScrollPane scrollPane;
private JPanel panel;

private TaskPriorityColor tpc;
private TimeObject calendar;

public TableTask(TimeObject cal){
this.calendar = cal;
this.setLayout(new GridBagLayout());
this.taskManager = new Vector<Task>();

/*********TEST*******/
//tpc = TaskPriorityColor.Normal;
//Task t = new Task("ss", "ss", "ss", "ss", "ss");
//taskManager.addElement(t);

GridBagConstraints constr = new GridBagConstraints();

//model = new TaskTableModel(taskManager, columnNames);
model = new TaskTableModel(this.taskManager, this.columnNames);
tableTask = new JTable(model);

//tableTask.setRowSelectionAllowed(true);
tableTask.setFillsViewportHeight(true);
scrollPane = new JScrollPane(tableTask);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(450, 270));

constr.fill = GridBagConstraints.BOTH;
constr.insets = new Insets(2, 2, 2, 2);
constr.gridx = 0;
constr.gridy = 0;
this.add(scrollPane, constr);

panel = new JPanel();
panel.setLayout(new HorizontalLayout());

add_button = new JButton("Add");
delete_button = new JButton("Delete");
add_button.addActionListener(this);
delete_button.addActionListener(this);

panel.add(add_button);
panel.add(delete_button);

constr.fill = GridBagConstraints.BOTH;
constr.gridx = 0;
constr.gridy = 1;
this.add(panel,constr);
}

public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source == add_button){
TaskDialog dialog;
dialog = new TaskDialog(this.calendar);

if (dialog.isOkPressed()) {
//Task task = new Task(dialog.getName_field(), dialog.getSubject_field(), dialog.getText_field(), dialog.getDate_field(), dialog.getPriority());
this.aTask = new Task(dialog.getName_field(), dialog.getSubject_field(), dialog.getText_field(), dialog.getDate_field(), dialog.getPriority());
/***********Si c'est bon veut dire que la transmission se fait correctement entre le TaskDialog et le TableTask*********/
System.out.println("Task values : " + aTask.getName() + " " + aTask.getSubject() + " " + aTask.getText() + " "
+ aTask.getDate() + " " + aTask.getTpc());

//this.taskManager.add(aTask);
this.tableTask.getModel().addTableModelListener(new TableModelListener() {

public void tableChanged(TableModelEvent e) {
//dateandtimepicker.controller.TableTask.this.taskManager.add(aTask);
}
});

((TaskTableModel)tableTask.getModel()).addTask(aTask, tableTask.getRowCount());
TaskPriorityColor tpc2 = tpc.valueOf(dialog.getPriority());
//tableTask.setForeground(tpc2.getColor());
}
/***********On verifie qu'on a bien les bonnes valeurs dans le vecteur de Task de notre model***********/
int vectorSize = ((TaskTableModel)tableTask.getModel()).getRowCount();
System.out.println("All objects in vector<Task> : " );
for (int i = 0 ; i < vectorSize ; i ++) {
System.out.println(((TaskTableModel)tableTask.getModel()).getTaskAt(i).toString());
}
}

if (source == delete_button){
int i = tableTask.getSelectedRow();
if (i >= 0) {
((TaskTableModel)tableTask.getModel()).removeTask(tableTask.getSelectedRow());
}
}
}
}


public class TaskTableModel extends AbstractTableModel {
private String[] columnNames;
public Vector<Task> data;

public TaskTableModel(Vector<Task> vector, String[] header) {
this.data = vector;
this.columnNames = header;
}

public TaskTableModel(String[] header) {
this.data = new Vector<Task>();
this.columnNames = header;
}

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

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

public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex).getIndex(columnIndex);
}

@Override
public void setValueAt(Object value, int row, int col){
System.out.println("value : " + value + " row : " + row + " col : " + col);
try {
data.get(row).setIndex(col, value);
}
catch (Exception err){
System.out.println("Impossible de modifier l'evenement : " + err.getMessage());
}
//this.fireTableCellUpdated(row, col);
this.fireTableDataChanged();
}

@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}

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

@Override
public boolean isCellEditable(int row, int col) {
if (col <= 2 ){
return true;
}
else
return false;
}

public void addTask( Task t, int i){
data.add(t);
//Si c'est bon veut dire que la transmission se fait correctement entre le TableTask et le TaskTableModel
System.out.println("value of the task at position i in addTask vector : " + data.elementAt(i).getName() + " " + data.elementAt(i).getSubject() + " "
+ data.elementAt(i).getText() + " " + data.elementAt(i).getDate() + " " + data.elementAt(i).getTpc());
System.out.println("Value of parameter task in addTask : " + t.getName() + " " + t.getSubject() + " " + t.getText() + " " + t.getDate() + " " + t.getTpc());
System.out.println("nb event : " + data.size());
this.fireTableDataChanged();
}

public void removeTask(int row){
data.remove(row);
this.fireTableDataChanged();
}

public Task getTaskAt(int row) {
return data.get(row);
}

}


public class TaskView extends JPanel{

private TableTask tasks_grid;

public TaskView( TimeObject timeObj) {
tasks_grid = new TableTask(timeObj);
this.add(tasks_grid);
}
}
0
Cornellus1985 Messages postés 22 Date d'inscription dimanche 26 avril 2009 Statut Membre Dernière intervention 7 juillet 2009
7 juil. 2009 à 17:54
Hallelujah !! Mille merci Darksidious. Mon probleme venait bien de la. Maintenant je me sens un peu stupide, avec une erreur si grossiere sous les yeux. Mais bon comme on dit, faut bien tomber pour apprendre a se relever. J'ai pas mal planche sur le probleme, et j'ai jamais vu une erreur aussi evidente.
En tout cas, un grand merci.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
7 juil. 2009 à 18:40
Bah de rien, c'est toujours les choses les plus évidentes que l'on ne voit pas, et on passe des heures dessus à s'arracher les cheuveux pour des bêtises !
0
Rejoignez-nous