我正在使用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();
}
}
这就是它的样子
答案 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
提供数据。