Re: JTable help
nicholas.tripp@gmail.com wrote:
I'm working on a derby embedded app and I want to use JTable to
display the results. I made a custom AbstractModel, but when there is
more than one row in the results the first row result is repeated for
the number of rows in the result but the other results are not
displayed. I was able to get it to output correctly to the console
but not the gui. I am stuck and can't figure out where I went wrong.
Can someone help me?
{code}
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
public class InteractiveTableModel extends AbstractTableModel {
public static final int TIME_INDEX = 0;
public static final int CLASS_INDEX = 1;
public static final int DAY_INDEX = 2;
public static final int MEMBERS_INDEX = 3;
public static final int MINUTES_NONTEACHING_INDEX = 4;
public static final int MINUTES_OUTSIDE_INDEX = 5;
public static final int MINUTES_TEACHING_INDEX = 6;
These constants are a bit superfluous - see later
protected String[] columnNames;
protected Vector dataVector = new Vector();
I prefer to use ArrayList<RowObject>
public static String teacherName;
public static String day;
public InteractiveTableModel(String[] columnNames, Vector table)
{
I suspect that the "table" already contains duplicate rows. Show the
code where you construct the table (presumably from a JDBC resultSet).
I would insert here some code to iterate over table and display the values.
have you considered some logging solutions to replace using
System.out.println()?
this.columnNames = columnNames;
this.dataVector = (Vector)table.clone();
System.out.println("Length of dataVector is:
"+dataVector.size());
//SObject[] temp = new Object[7];
// Object[] temp = (Object[])table.elementAt(DAY_INDEX);
// System.out.println("We got this: "+temp[0].toString());
}
public String getColumnName(int column) {
return columnNames[column];
}
public boolean isCellEditable(int row, int column) {
return true;
}
public Class getColumnClass(int column) {
switch (column) {
case TIME_INDEX:
case CLASS_INDEX:
case DAY_INDEX:
case MEMBERS_INDEX:
case MINUTES_NONTEACHING_INDEX:
case MINUTES_OUTSIDE_INDEX:
case MINUTES_TEACHING_INDEX:
return String.class;
default:
return Object.class;
}
}
I never bother implementing this but in your case you could shorten it to
public Class getColumnClass(int column) {
return String.class;
}
public Object getValueAt(int row, int column) {
dataVector = CreateDBSchedule.resultFinder(teacherName, day);
Object[] rowData = new Object[7];
rowData = (Object[])dataVector.elementAt(row);
I suspect these two line could be replaced by
Object[] rowData = (Object[])dataVector.elementAt(row)
As I remarked earlier, I prefer to do something like
RowObject record = cache.get(row);
Object l = null;
System.out.println("We've made it to get value at"+row
+column);
switch (column) {
case TIME_INDEX:
l = (String)rowData[TIME_INDEX].toString();
System.out.println(l);
return l;
case CLASS_INDEX:
l = (String)rowData[CLASS_INDEX];
return l;
case DAY_INDEX:
l = (String)rowData[DAY_INDEX];
return l;
case MEMBERS_INDEX:
l = (String)rowData[MEMBERS_INDEX];
return l;
case MINUTES_NONTEACHING_INDEX:
l = (String)rowData[MINUTES_NONTEACHING_INDEX];
return l;
case MINUTES_OUTSIDE_INDEX:
l = (String)rowData[MINUTES_OUTSIDE_INDEX];
return l;
case MINUTES_TEACHING_INDEX:
l = (String)rowData[MINUTES_TEACHING_INDEX];
return l;
default:
System.out.println("Nothing here?");
return "Nothing";
}
Can't this whole switch statement be replaced by
if (column < rowData.size())
return (String) rowData[column];
else
return "Nothing";
}
public void setValueAt(Object value, int row, int column) {
//TODO
Object[] rowData = (Object[])dataVector.get(row);
switch (column) {
case TIME_INDEX:
rowData[TIME_INDEX] = value;
case CLASS_INDEX:
rowData[CLASS_INDEX] = value;
case DAY_INDEX:
rowData[DAY_INDEX] = value;
case MEMBERS_INDEX:
rowData[MEMBERS_INDEX] = value;
case MINUTES_NONTEACHING_INDEX:
rowData[MINUTES_NONTEACHING_INDEX] = value;
case MINUTES_OUTSIDE_INDEX:
rowData[MINUTES_OUTSIDE_INDEX] = value;
case MINUTES_TEACHING_INDEX:
rowData[MINUTES_TEACHING_INDEX] = value;
default:
System.out.println("something bad happened changing
the table");
The whole switch statment could be more concisely expressed as
if (column < rowData.size())
rowData[column] = value;
else
System.err.println("setValue: column " + column
+ " out of bounds");
}
fireTableCellUpdated(row, column);
}
public int getRowCount() {
System.out.println("Get row count: "+dataVector.size());
return dataVector.size();
}
public int getColumnCount() {
System.out.println("Column Count: "+columnNames.length);
return columnNames.length;
}
}
{code}
I think the problem is in here,
I don't.
but I am not sure I can post the other parts of the program if necessary.
That's a pity.