gpt4 book ai didi

java - JTable + 排序特定字段

转载 作者:行者123 更新时间:2023-12-01 16:39:55 25 4
gpt4 key购买 nike

我有一个 JTable 并添加了排序。现在,JTable 有 5 列,日期字段中的第二列转换为 DD/MM/YYYY 并显示在单元格的 JTextField 中。

当我将其按字符串排序并且日期混淆时,如何更改该特定列的排序行为?

例如。按 ASC 顺序排序后,我得到:

01/02/2012
01/03/2011
01/04/2011
01/05/2011
01/06/2011
01/07/2011
01/08/2011
01/09/2011
01/10/2011
01/12/2011

这是错误的,我应该得到这样的结果

01/03/2011
01/04/2011
01/05/2011
01/06/2011
01/07/2011
01/08/2011
01/09/2011
01/10/2011
01/12/2011
01/02/2012

我的代码现在看起来像这样用于排序

List<SortKey> sortKeys = new ArrayList<SortKey>();
sortKeys.add(new SortKey(2, SortOrder.ASCENDING));
table.getRowSorter().setSortKeys(sortKeys);

我应该只针对该特定列更改什么?

最佳答案

因为java.util.Date实现Comparable<Date> ,这应该足以让您的 TableModel返回Date.class来自getColumnClass()对于第二列。使用Custom Renderer根据需要设置日期格式。

附录:这是一个使用 setDefaultRenderer() 的示例。

import java.awt.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

/** @see http://stackoverflow.com/questions/4553448 */
public class TableDate extends JPanel {

private static final int INT_COL = 0;
private static final int DATE_COL = 1;
private final Calendar calendar = Calendar.getInstance();
private final CustomModel model = new CustomModel();
private final JTable table = new JTable(model);

public TableDate() {
super(new GridLayout(1, 0));
table.setAutoCreateRowSorter(true);
table.setDefaultRenderer(Date.class, new DateRenderer());
table.setPreferredScrollableViewportSize(new Dimension(320, 240));
JScrollPane sp = new JScrollPane(table);
this.add(sp);
for (int i = 1; i <= 20; i++) {
model.addRow(newRow(i));
}
}

private Object[] newRow(int i) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
return new Object[]{Integer.valueOf(i), calendar.getTime()};
}

private static class CustomModel extends DefaultTableModel {

private final String[] columnNames = {"Index", "Date"};

@Override
public Class<?> getColumnClass(int col) {
if (col == INT_COL) {
return Integer.class;
} else if (col == DATE_COL) {
return Date.class;
}
return super.getColumnClass(col);
}

@Override
public int getColumnCount() {
return columnNames.length;
}

@Override
public String getColumnName(int col) {
return columnNames[col];
}
}

private static class DateRenderer extends DefaultTableCellRenderer {

DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

public DateRenderer() {
super();
}

@Override
public void setValue(Object value) {
setText((value == null) ? "" : formatter.format(value));
}
}

private void display() {
JFrame f = new JFrame("TableDate");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
new TableDate().display();
}
});
}
}

关于java - JTable + 排序特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61878314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com