小さなタスクマネージャを開発する際に、列が正しくソートされていないことに気付きました。私のプログラムの問題を捨てるために、私は最小限のバージョンを作成しましたが、依然として一意の列を正しく注文することはできません。setAutoCreateRowSorterは更新後にテーブル列を正しくソートしません
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();
}
});
}
}
それはスレッドの問題だったが、動作は同じである場合、私はScheduledExecutorService
+ Runnable
とちょうどテストするTimer
+ TimerTask
で試してみました。また、そのテーマについてのJavaチュートリアルのページも読んでいます。私のテーブルは標準タイプしか使用していないので、単純なtable.setAutoCreateRowSorter (true);
は仕事をしなければならないと思います。
修正/追加/削除のたびにテーブルをソートしないでください。 setSortsOnUpdates()
を使用して
この場合、おそらく 'setSortsOnUpdates(true)'が最適です。私は 'KeyListener'を避けるだろう。 – trashgod