У меня есть JTable, который отслеживает количество времени, которое человек ждал, чтобы сидеть в ресторане. Моя проблема в том, что каждую секунду, когда таймер "тикает", выбор, который находится на строке, удаляется. Другими словами, если вы щелкнете строку, она будет выделена синим фоном и контуром, но затем, когда таймер начнет мигать, синий исчезнет.
ActionListener actListner = new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
aTable.updateTime();
}
};
Timer timer = new Timer(1000, actListner);
timer.start();
Это в основном классе
public void updateTime()
{
data.updateTime();
fireTableDataChanged();
}
Это в табличной модели
public void updateTime()
{
Date newTime = new Date();
for (int i = 0; i < startTime.size(); i++)
{
this.setTimeWaiting(i, hoursMin.format(new Date(newTime.getTime() - startTime.get(i).getTime())));
}
}
Это в модели данных.
fireTableDataChanged()
сообщает этой таблице, что данные могут быть изменены каким-либо образом и, по сути, вы используете ее, когда весь набор данных полностью изменился (например, вы заменили все предыдущее содержимое новой информацией). Таблица будет перерисовываться с нуля, а также может очистить выбор.
Вместо этого используйте более консервативный fireTableCellUpdated(int,int)
и укажите каждую ячейку, которая может быть изменена из-за изменения времени (предположительно, все в столбце "время ожидания").
Вы также можете использовать fireTableRowsUpdated(int,int)
и указать весь диапазон строк, которые были обновлены за один вызов, но обычно лучше придерживаться консервативной стороны, чтобы минимизировать ненужные перерисовки.