Saudações,
Tenho um JApplet que contém um JComponent (que serve como Canvas para gráficos) e dois objetos JTable; um contém 4 linhas e 2 colunas e o outro contém 1 linha e 2 colunas.
Cada célula dessas tabelas contém um dado numérico em formato double.
100 vezes por segundo, o programa faz cálculos, atualiza a imagem do JComponent e exibe nos dois JTable os dados numéricos calculados, utilizando o setValueAt dos TableModel das duas tabelas.
Num computador com Windows 7, processador Pentium Dual CPU E2160 1,80 GHz e 2 GB de memória, o processo (imagem no JComponent + exibição dos dados nas tabelas) fica na velocidade esperada; no entanto, num computador com processador Pentium 4 2,66 GHz e 1,25 GB de memória, o processo fica lento.
O cálculo e a geração da imagem no JComponent estão rápidos. O problema são as tabelas.
Nesse último computador, rodando o processo com o desenho da imagem no JComponent, mas sem redesenhar as tabelas, o processo fica rápido.
Então, deve haver alguma coisa errada no processo de desenho da tabela.
Eu tentei implementar os métodos descritos aqui:
http://java.sun.com/products/jfc/tsc/articles/ChristmasTree/
mas não fizeram nenhuma diferença.
Eu também tentei fazer o seguinte: em vez de chamar a função fireTableCellUpdated() dentro do setValueAt do Table Model, chamar a função fireTableDataChanged() para redesenhar as tabelas inteiras somente após ter inserido todos os valores nas tabelas. Isso provocou uma pequena melhora na velocidade, mas ainda fica lento.
Alguém tem alguma ideia?
Me avisem se faltou alguma informação importante aqui.
Obrigado.
TableModel utilizado nos dois JTable:
public class jtableModel extends AbstractTableModel {
Object[][] rowData;
String[] columnNames;
public jtableModel(Object[][] rd, String[] cn) {
rowData = rd;
columnNames = cn;
}
@Override public Class<?> getColumnClass(int coluna) {
return Object.class; //Eu não coloquei Double.class aqui porque, em alguns casos, o valor que aparece em uma célula é um string.
}
@Override public String getColumnName(int col) {
return columnNames[col].toString();
}
public int getRowCount() { return rowData.length; }
public int getColumnCount() { return columnNames.length; }
public Object getValueAt(int row, int col) {
return rowData[row][col];
}
@Override public boolean isCellEditable(int row, int col)
{
return false;
}
@Override public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col); //Se essa linha for colocada como comentário, as células da tabela não são redesenhadas e o processo fica rápido.
}
}