illucid
asked on
JTable not refreshing
Hi
I have a JTable and whenever I update it, it doesnt refresh properly. Also Initially it does not display and I have to click somewhere on the table in order for it to show up.
Anyone have any ideas?
I have a JTable and whenever I update it, it doesnt refresh properly. Also Initially it does not display and I have to click somewhere on the table in order for it to show up.
Anyone have any ideas?
Please post code
You need to ensure your model fires the appropriate TableModelEvent when it is updated.
AbstractTableModel provides methods for firing events.
AbstractTableModel provides methods for firing events.
ASKER
Ive nested the JTable inside a JPanel then added the JPanel
public class mytable2 extends JPanel {
private boolean DEBUG = true;
final LinkedList[] ldata;
final int len; //variable for how many rows...
lsearch2 lsch2;
MyTableModel myModel;
public JTable table;
public mytable2(LinkedList[] a, int lnth, lsearch2 lschh) {
super(new BorderLayout());
ldata = a;
len = lnth;
lsch2 = lschh;
myModel = new MyTableModel();
table = new JTable(myModel);
myModel.fireTableDataChang ed();
table.setPreferredScrollab leViewport Size(new Dimension(500, 70));
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
...
public class mytable2 extends JPanel {
private boolean DEBUG = true;
final LinkedList[] ldata;
final int len; //variable for how many rows...
lsearch2 lsch2;
MyTableModel myModel;
public JTable table;
public mytable2(LinkedList[] a, int lnth, lsearch2 lschh) {
super(new BorderLayout());
ldata = a;
len = lnth;
lsch2 = lschh;
myModel = new MyTableModel();
table = new JTable(myModel);
myModel.fireTableDataChang
table.setPreferredScrollab
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
...
how do you update it?
> myModel.fireTableDataChang ed();
Thats not necessary there.
You just need to fire an event when a change is made to the mode, and it's probablt also best done from within your table model.
Thats not necessary there.
You just need to fire an event when a change is made to the mode, and it's probablt also best done from within your table model.
ASKER
heres the rest of it..
class MyTableModel extends AbstractTableModel {
final String[] columnNames = {"cust_id", "cust_contact", "business_name", "cust_email", "Select?"};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return len;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return ldata[col].get(row);
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col < 1) {
return false;
} else {
return true;
}
}
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
//System.out.println("Sett ing value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")");
}
ldata[col].remove(row);
ldata[col].add(row, value);
//fireTableCellUpdated(row , col);
if (DEBUG) {
printDebugData();
ud(row, col);
}
}
public void fire() {
if (DEBUG) {
//System.out.println("Sett ing value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")");
}
Object temp = ldata[1].get(0);
ldata[1].remove(0);
ldata[1].add(0, temp);
fireTableCellUpdated(0, 1);
if (DEBUG) {
printDebugData();
//ud(row, col);
}
}
private void ud(int row, int col) {
if (col != 4) {
lsch2.update("UPDATE customer SET " + getColumnName(col) + " = '" + ldata[col].get(row) + "' WHERE cust_id = '" + ldata[0].get(row) + "';");
lsch2.loadselected((String )ldata[0]. get(row));
ldata[4].remove(row);
ldata[4].add(0, new Boolean(true));
fireTableCellUpdated(row, 4);
}
}
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(" " + ldata[j].get(i));
}
//System.out.println();
}
// System.out.println("------ ---------- ---------- ");
}
}
}
class MyTableModel extends AbstractTableModel {
final String[] columnNames = {"cust_id", "cust_contact", "business_name", "cust_email", "Select?"};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return len;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return ldata[col].get(row);
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col < 1) {
return false;
} else {
return true;
}
}
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
//System.out.println("Sett
}
ldata[col].remove(row);
ldata[col].add(row, value);
//fireTableCellUpdated(row
if (DEBUG) {
printDebugData();
ud(row, col);
}
}
public void fire() {
if (DEBUG) {
//System.out.println("Sett
}
Object temp = ldata[1].get(0);
ldata[1].remove(0);
ldata[1].add(0, temp);
fireTableCellUpdated(0, 1);
if (DEBUG) {
printDebugData();
//ud(row, col);
}
}
private void ud(int row, int col) {
if (col != 4) {
lsch2.update("UPDATE customer SET " + getColumnName(col) + " = '" + ldata[col].get(row) + "' WHERE cust_id = '" + ldata[0].get(row) + "';");
lsch2.loadselected((String
ldata[4].remove(row);
ldata[4].add(0, new Boolean(true));
fireTableCellUpdated(row, 4);
}
}
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(" " + ldata[j].get(i));
}
//System.out.println();
}
// System.out.println("------
}
}
}
> //fireTableCellUpdated(row , col);
why is this commented out?
why is this commented out?
Looks perhaps like you update ladat outside of MyTableModel. If you are doing this then you need to ensure you fire the appropriate event.
Can you post the code that actually adds data to the table.
> ldata[col].remove(row);
> ldata[col].add(row, value);
More efficient to do:
ldata[col].set(row, value);
> ldata[col].add(row, value);
More efficient to do:
ldata[col].set(row, value);
ASKER
yup that fixed it.. =)
Its still not showing initially tho =(
Its still not showing initially tho =(
ASKER
private void getnewmytable2() {
//System.out.println("acce ssing info from lsch");
LinkedList[] d = lsch2.getobjects();
if (d != null && lsch2.getnumber() != -1) {
//System.out.println("d not null");
if (tables.get(0) != null) {
remove((mytable2)tables.ge t(0));
repaint();
tables.remove(0);
}
final mytable2 mt = new mytable2(d, lsch2.getnumber(), lsch2);
tables.add(0, mt);
add((mytable2)tables.get(0 ), BorderLayout.CENTER);
mt.show(); //??
mt.repaint(); //??
mt.myModel.fireTableDataCh anged();
//mt.table.selectAll(); //??
//mt.myModel.fire(); //??
//mt.table.setValueAt(mt.t able.getVa lueAt(0,1) , 0, 1); //??
}
else {
//System.out.println("not getting d from lsch");
JOptionPane.showMessageDia log(null, "");
}
}
//System.out.println("acce
LinkedList[] d = lsch2.getobjects();
if (d != null && lsch2.getnumber() != -1) {
//System.out.println("d not null");
if (tables.get(0) != null) {
remove((mytable2)tables.ge
repaint();
tables.remove(0);
}
final mytable2 mt = new mytable2(d, lsch2.getnumber(), lsch2);
tables.add(0, mt);
add((mytable2)tables.get(0
mt.show(); //??
mt.repaint(); //??
mt.myModel.fireTableDataCh
//mt.table.selectAll(); //??
//mt.myModel.fire(); //??
//mt.table.setValueAt(mt.t
}
else {
//System.out.println("not getting d from lsch");
JOptionPane.showMessageDia
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank you!