Продолжайте сортировать после изменения модели данных.
Ожидаемое поведение: я щелкаю один из заголовков столбцов для сортировки, и он должен продолжать сортировать этот столбец по мере изменения модели данных. То есть после того, как вы выберете столбец для сортировки, вам не придется щелкать его вручную после каждого обновления базовой модели данных, чтобы увидеть его в этом порядке.
Текущее поведение: кажется, что сортировка сбрасывается после изменения модели данных. То есть, как будто я не щелкнул ни один столбец. Обновление модели данных снова приводит к беспорядку.
Что я пробовал: я написал небольшую программу, которая имитирует изменение базовой модели данных через цикл for каждые 2000 миллисекунд. Поскольку исходные данные сильно меняются от обновления к обновлению, я решил изменить данные с помощью DefaultTableModel.setDataVector(), а не построчно, что кажется громоздким, если меняется много строк. Я использовал то, что имело для меня смысл, то есть TableRowSorter.setSortsOnUpdates(), чтобы ну... сортировать после обновлений x). Я оставил закомментированный код, чтобы показать, что я пробовал разные подходы, некоторые из них можно найти здесь, на stackexchange, но все равно не смог заставить его работать. Я попытался прочитать API и нашел это как возможного создателя проблем:
Если базовая структура модели изменяется (вызывается метод modelStructureChanged), следующие значения сбрасываются до значений по умолчанию: компараторы по столбцам, текущий порядок сортировки и возможность сортировки каждого столбца. Порядок сортировки по умолчанию — естественный (такой же, как в модели), а столбцы по умолчанию сортируются.
Это было найдено в документации по API: TableRowSorter а>
Я думаю, кто-то может сказать, что я не хочу, чтобы он сбрасывался к порядку сортировки по умолчанию, а скорее сохранял последний выбранный. Наверняка должен быть какой-то простой способ остановить это?
Кстати, я нуб, пожалуйста, имейте это в виду, отвечая, и я надеюсь, что у меня есть смысл пытаться объяснить ожидаемое поведение.
Мой код:
package TestTable;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Random;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
import ui.Runner;
public class starter {
public static void main(String[] args) {
starter start = new starter();
Vector<String> columNames = new Vector<>();
columNames.add("index");
columNames.add("years");
columNames.add("weight");
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<Object> dataInData = new Vector<>();
Random dice = new Random();
JTable table = new JTable(data, columNames);
//table.setAutoCreateRowSorter(true);
MyFrame frame = new MyFrame(table);
DefaultTableModel model = (DefaultTableModel)table.getModel();
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<>(model);
//MyRowSorter<DefaultTableModel> sorter = new MyRowSorter<>();
table.setRowSorter(sorter);
//DefaultRowSorter sorter = (DefaultRowSorter)table.getRowSorter();
//TableModelEvent ev = new TableModelEvent(model);
sorter.setSortsOnUpdates(true);//<---------------<<<<<
data.add(new Vector<Object>());
data.add(new Vector<Object>());
data.add(new Vector<Object>());
for(int x = 0; x < 3; x++) {
dataInData = data.get(x);
for(int y = 0; y < 5; y++) {
dataInData.add(dice.nextInt(10));
}
}
for(int z = 0; z < 10; z++) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int x = 0; x < 3; x++) {
dataInData = data.get(x);
for(int y = 0; y < dataInData.size(); y++) {
dataInData.set(y, dice.nextInt(10));
}
}
model.setDataVector(data, columNames);//<-------------------<<
//model.fireTableDataChanged();
//sorter.setSortsOnUpdates(true);
//sorter.rowsUpdated(0, data.size() -1);
model.fireTableRowsUpdated(0, model.getRowCount() -1 );
//model.fireTableDataChanged();
//model.fireTableChanged(ev);
//model.fireTableStructureChanged();
//sorter.rowsUpdated(0, data.size() );
//sorter.sort();
}
}
public static class MyFrame extends JFrame{
JTable table;
Dimension dim = new Dimension(300, 500);
JScrollPane pane;
Vector<String> columNames = new Vector<>();
Vector<Vector<Object>> dataVector;
Runner thread;
int[] i = {0, 1, -1};
public MyFrame(JTable table) {
pane = new JScrollPane(table);
table.setFillsViewportHeight(true);
setSize(300, 500);
setPreferredSize(dim);
setMinimumSize(dim);
setTitle("Failing autoupdate of JTable");
setBackground(Color.BLACK);
add(pane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
}
setDataVector
вызовет событиеTableStructureChanged
, которое из памяти сбросит сортировщик строк. - person MadProgrammer   schedule 10.05.2017