对JTable的内容进行排序

时间:2015-12-10 15:30:49

标签: java swing sorting jtable

我正在使用JTable这样可以显示按最后两列排序的一些信息。问题是最后两列填充了字符串,其中一列是弱日(星期一至星期五),其他是小时(HH:mm),我想从星期一到星期五对它们进行排序,如果有的话他们应该按照最早的时刻对同一天的更多元素进行排序。直到现在谷歌并不是一个真正的大帮助,因为它只能通过按字母排序的方式按字母顺序排列上升/后代的数字,但我不需要按字母顺序排列的JTable。有没有人有想法?

public class ScheduleFrame extends JFrame {

private JPanel contentPane;
private static JTable table;


public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ScheduleFrame frame = new ScheduleFrame();
                frame.setVisible(true);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 * @throws Exception 
 */
public ScheduleFrame(){
    setTitle("Schedule");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 627, 405);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);


    JScrollPane scrollPane = new JScrollPane();
    contentPane.add(scrollPane, BorderLayout.CENTER);

    table = new JTable();
    scrollPane.setViewportView(table);
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     table.setModel(new DefaultTableModel(
        new Object[][] {
        },
        new String[] {
            "Course Name", "Course Room","Course Day", "Course Hour"
        }
     ));}



    public static void loadTable()throws Exception{
        DefaultTableModel tm = (DefaultTableModel) table.getModel();
        BufferedReader bfw = new BufferedReader(new FileReader("Schedulecourses.txt"));
        String line;
        while( (line = bfw.readLine() ) != null ) {
        tm.addRow( line.split("\t") );
       }
          bfw.close();
       }
 } 

这就是它的样子

http://i.stack.imgur.com/vcgNY.png

3 个答案:

答案 0 :(得分:1)

  

其中一个是弱者日(周一至周五)

因此TableModel中的数据可以存储为Integer来表示星期几。然后使用自定义渲染器将Integer值转换为描述性值。

阅读Using Custom Renderers上的Swing教程中的部分,以获取示例。

在您的情况下,setValue(...)方法中的代码类似于:

int dayOfWeek = (Integer)value;

switch (dayOfWeek)
{
    case 1: setText("Monday"); break;
    case 2: setText("Tuesday"); break;
    case 3: ...
    default: value.toString();
}
  

其他是小时(HH:mm),

在这种情况下,您将存储两条信息。所以这意味着您需要将数据解析为两次,然后创建一个自定义Comparator,以便根据第一次进行排序。

另一个选项可能是创建两列:"开始时间","结束时间"。然后你可以在TableModel中存储Date对象,然后只使用将按Date排序的默认Comparator。

答案 1 :(得分:0)

只需自己实施。使用一些基本的排序算法,如快速排序,冒泡排序或合并排序(在维基百科上找到),并创建自己的比较函数,以按顺序排列条目,如,伪代码:

tooltip: {
  shared: false
}

(当然还有工作日和课程时间的另一个比较功能)

答案 2 :(得分:0)

我建议您尝试将从文件中读取的数据映射到某种模型对象,以后可以对其进行排序。例如:

public class Course implements Comparable<Course> {

    private String name;
    private String room;
    private String day;
    private String hour;

    // constructor and getters are omitted. you can add setters as well, but it's best that you keep this class immutable

    @Override
    public int compareTo(Course course) {
        // here you implement the logic of your comparison
    }
}

这里的好处是,通过实现Java API提供的Comparable<T>接口,您可以指定Course类的实例具有自然顺序。然后您可以使用Collections.sort(),您的课程列表将按您希望的方式自动排序。然后,您可以使用它来支持表模型并将其呈现在表中。

编辑1: 对我的建议有点澄清:

现在,您从文件中读取文本数据,将每行转换为字符串数组,并将其传递给DefaultTableModel,为JTable提供数据。

代替这样做,您可以使代码更加复杂,但从架构的角度来看,最终会得到更好的解决方案。步骤是什么:

  • 定义一个模型类(如示例Course类),它将保存文本文件中保存的数据。实现逻辑以将文件的每一行转换为Course类的实例。此实例将代表您的数据,您将使用它们用数据填充表格。
  • 实现您自己的TableModel,其中包含Course个实例的排序列表(这些是您从文件中读取的实例)。使用已实施的模型向JTable提供数据。