添加行后对 JTable 进行排序
Sorting JTable after adding rows
我必须在添加新行后对 JTable (Object[][] data, Object[] headers)
进行排序。
这是代码(不起作用)
public class Window extends JFrame {
Window() {
super();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JTable table = new JTable();
table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
sorter.setComparator(0, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
sorter.setSortsOnUpdates(true);
table.setRowSorter(sorter);
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.addRow(new String[] {"A"});
model.addRow(new String[] {"C"});
model.addRow(new String[] {"B"});
this.getContentPane().add(table);
pack();
setVisible(true);
}
public static void main(String[] args) {
new Window();
}
}
输出结果:table (A, C, B),预期 (A, B, C)
模型 - 默认表模型
设备表 - Jtable
model.fireTableDataChanged();
不要直接调用 fireXXX() 方法。
TableModel 有责任调用适当的方法(在本例中为 fireTableRowsInserted)。
编辑:
摆脱创建排序器和比较器的代码。
您只需让 table 创建分类器。但是一旦你这样做了,你需要告诉排序器要排序哪一列:
table.setAutoCreateRowSorter(true);
((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);
根据您的示例,您需要定义一个排序键,否则 table 实际上未排序...
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
table.setRowSorter(sorter);
以下示例(基于您的示例)对第一列进行排序。当您点击按钮时,它会添加行,然后对这些行进行排序
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JTable table = new JTable();
table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
sorter.setComparator(0, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
sorter.setSortsOnUpdates(true);
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
table.setRowSorter(sorter);
JButton btn = new JButton("...");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addRow(new String[]{"A"});
model.addRow(new String[]{"C"});
model.addRow(new String[]{"B"});
}
});
frame.add(new JScrollPane(table));
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
我必须在添加新行后对 JTable (Object[][] data, Object[] headers)
进行排序。
这是代码(不起作用)
public class Window extends JFrame {
Window() {
super();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JTable table = new JTable();
table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
sorter.setComparator(0, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
sorter.setSortsOnUpdates(true);
table.setRowSorter(sorter);
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.addRow(new String[] {"A"});
model.addRow(new String[] {"C"});
model.addRow(new String[] {"B"});
this.getContentPane().add(table);
pack();
setVisible(true);
}
public static void main(String[] args) {
new Window();
}
}
输出结果:table (A, C, B),预期 (A, B, C)
模型 - 默认表模型
设备表 - Jtable
model.fireTableDataChanged();
不要直接调用 fireXXX() 方法。
TableModel 有责任调用适当的方法(在本例中为 fireTableRowsInserted)。
编辑:
摆脱创建排序器和比较器的代码。
您只需让 table 创建分类器。但是一旦你这样做了,你需要告诉排序器要排序哪一列:
table.setAutoCreateRowSorter(true);
((DefaultRowSorter)table.getRowSorter()).toggleSortOrder(0);
根据您的示例,您需要定义一个排序键,否则 table 实际上未排序...
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
table.setRowSorter(sorter);
以下示例(基于您的示例)对第一列进行排序。当您点击按钮时,它会添加行,然后对这些行进行排序
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JTable table = new JTable();
table.setModel(new DefaultTableModel(null, new String[]{"col1"}));
TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
sorter.setComparator(0, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
sorter.setSortsOnUpdates(true);
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
table.setRowSorter(sorter);
JButton btn = new JButton("...");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.addRow(new String[]{"A"});
model.addRow(new String[]{"C"});
model.addRow(new String[]{"B"});
}
});
frame.add(new JScrollPane(table));
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}