如何创建排序器,使得特定行始终排序为第一行,无论列是按升序还是降序排序?我的代码如下。点击“名称”2次“FIRSTROW”每次排序为第一行。单击“年龄”直到FIRSTROW不再排序,然后单击“名称”,FIRSTROW不再排序。我希望每次点击“名称”时首先对FIRSTROW进行排序,我该怎么做?
示例代码如下:
import java.awt.BorderLayout;
import java.util.Comparator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class TableTest implements Comparator<String> {
@Override
public int compare(String obj1, String obj2) {
if (obj1 == obj2) {
return 0;
}
if (obj1 == null) {
return -1;
}
if (obj2 == null) {
return -1;
}
if (obj2 instanceof String && obj2.trim( ).equals("FIRSTROW")) {
return 0;
}
if (obj1 instanceof String && obj1.trim( ).equals("FIRSTROW")) {
return 0;
}
return obj1.compareTo(obj2);
}
public static void main(String args[]) {
JFrame frame = new JFrame("Fixed First Row");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String rows[][] = { { "FIRSTROW", "23" }, { "R", "24", }, { "E", "21", }, { "D", "27", }, { "A", "25", },
{ "S", "22", }, };
/* Specify column names */
String columns[] = { "Name", "Age" };
/* Create a TableModel */
DefaultTableModel model = new DefaultTableModel(rows, columns) {
@Override
public Class getColumnClass(int column) {
Class returnValue;
if ((column >= 0) && (column < getColumnCount())) {
returnValue = getValueAt(0, column).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
JTable table = new JTable(model);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
sorter.setComparator( 0, new TableTest() ); // Field column uses the random string comparator.
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
frame.setSize(300, 150);
frame.setVisible(true);
}
}
答案 0 :(得分:0)
如果您只是进行简单的文本比较,则可以在比较器中执行return stringA.compareTo(stringB);
。为了确保某个值始终排在最前面,您需要明确地这样做。
但要小心,迫使比较远离&#34;自然顺序&#34;很容易导致比较违反合同&#34;。
编辑:
public int compare(String obj1, String obj2) {
if (obj1 == obj2) {// if they are the same object
return 0;
}
if (obj1 == null) {// sort null above not null
return -1;
}
if (obj2 == null) {// sort not null below null
return 1;
}
if (obj1.trim().toUpperCase().equals("B") &&
!obj2.trim().toUpperCase().equals("B")) {// sort B above not-B
return -1;
}
if (!obj1.trim().toUpperCase().equals("B") &&
obj2.trim().toUpperCase().equals("B")) {// sort not-B below B
return 1;
}
return obj1.compareTo(obj2);
}
答案 1 :(得分:0)
如果你想在选择之后在顶部保留一行,你可能不会只使用其中一个属性,因为它可能对另一个属性相同,最好的方法是对象本身。
要做到这一点:
以下是此行为的测试示例:
{{1}}
答案 2 :(得分:0)
使CustomRowSorter基本上是默认DefaultRowSorter的副本。 我无法扩展课程,因为我必须对私有函数进行一些关于排序的更改。
此外,我必须制作自己的TableRowSorter副本,该副本使用新的CustomRowSorter。然后我的表将使用CustomTableRowSorter来完成工作。它不是一个漂亮的实现,因为复制这两个文件是1.5k行的变化。