JTable:如何对特定行始终是第一行的表进行排序?

时间:2017-02-24 19:01:12

标签: java swing sorting jtable

如何创建排序器,使得特定行始终排序为第一行,无论列是按升序还是降序排序?我的代码如下。点击“名称”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);
      }
}

3 个答案:

答案 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)

enter image description here

如果你想在选择之后在顶部保留一行,你可能不会只使用其中一个属性,因为它可能对另一个属性相同,最好的方法是对象本身。

要做到这一点:

  1. 获取所选行
  2. 使用其中一个对象属性//按您喜欢的方式对列表进行排序
  3. 从列表中删除所选行
  4. 在列表顶部添加所选行。
  5. 以下是此行为的测试示例:

    {{1}}

答案 2 :(得分:0)

使CustomRowSorter基本上是默认DefaultRowSorter的副本。 我无法扩展课程,因为我必须对私有函数进行一些关于排序的更改。

此外,我必须制作自己的TableRowSorter副本,该副本使用新的CustomRowSorter。然后我的表将使用CustomTableRowSorter来完成工作。它不是一个漂亮的实现,因为复制这两个文件是1.5k行的变化。