Bei der Entwicklung eines kleinen Task-Managers habe ich festgestellt, dass Spalten nicht korrekt sortiert sind. Um Probleme mit meinem Programm zu verwerfen, habe ich eine Minimalversion erstellt, die aber immer noch nicht die eindeutige Spaltenfolge anordnet.setAutoCreateRowSorter sortiert die Tabellenspalte nach dem Update nicht korrekt
import java.awt.BorderLayout;
import java.util.List;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
public class TableSortTest extends JFrame
{
private final JTable table;
private final ATableModel model;
public TableSortTest()
{
setDefaultCloseOperation (EXIT_ON_CLOSE);
setSize (1366, 768);
setLocationRelativeTo (null);
model = new ATableModel();
table = new JTable();
table.setFillsViewportHeight (true);
table.setAutoCreateRowSorter (true);
table.setModel (model);
add (new JScrollPane (table), BorderLayout.CENTER);
setVisible (true);
Worker worker = new Worker();
worker.execute();
}
private class Pair
{
int index;
int value;
}
private class Worker extends SwingWorker <Void, Pair>
{
@Override
protected Void doInBackground()
{
while (!isCancelled())
{
Random r = new Random();
for (int i = 0; i < 100; i++)
{
int indice = getIndexInRange (0, 99);
Pair p = new Pair();
p.index = indice;
p.value = Math.abs (r.nextInt());
publish (p);
}
try
{
Thread.sleep (1000);
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
}
return null;
}
@Override
public void process (List <Pair> items)
{
for (Pair p : items)
{
model.setValueAt (p.value, p.index, 0);
}
}
}
public static int getIndexInRange (int min, int max)
{
return (min + (int) (Math.random() * ((max - min) + 1)));
}
private class ATableModel extends AbstractTableModel
{
private final Integer [] data;
public ATableModel()
{
data = new Integer [100];
Random r = new Random();
for (int i = 0; i < 100; i++)
{
data [i] = Math.abs (r.nextInt());
}
}
@Override
public int getColumnCount()
{
return 1;
}
@Override
public int getRowCount()
{
return data.length;
}
@Override
public Object getValueAt (int rowIndex, int columnIndex)
{
return data [rowIndex];
}
@Override
public void setValueAt (Object value, int rowIndex, int columnIndex)
{
data [rowIndex] = (Integer) value;
fireTableRowUpdated (rowIndex, columnIndex);
}
@Override
public Class getColumnClass (int columnIndex)
{
return Integer.class;
}
@Override
public String getColumnName (int col)
{
return "Column";
}
}
public static final void main (String [] args)
{
SwingUtilities.invokeLater (() ->
{
try
{
new TableSortTest();
}
catch (Exception e)
{
e.printStackTrace();
}
});
}
}
Ich habe mit einer Runnable
+ ScheduledExecutorService
versucht und ein Timer
+ TimerTask
nur um zu testen, ob es sich um ein Einfädeln Problem war, aber das Verhalten ist das gleiche. Ich habe auch die Java Tutorial Seite über das Thema gelesen. Da meine Tabelle nur Standardtypen verwendet, denke ich, dass eine einfache table.setAutoCreateRowSorter (true);
sollte die Arbeit tun, sollte es nicht?
Sollte die Tabelle nicht nach jeder Änderung/Ergänzung/Entfernung sortiert werden?
'setSortsOnUpdates (true)' ist wahrscheinlich in diesem Fall optimal; Ich würde 'KeyListener' vermeiden. – trashgod