请看下面的代码。
import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.*;
public class TableBasic extends JFrame
{
final Class<?>[] columnClasses = new Class<?>[] {Date.class, String.class, Long.class, Boolean.class};
public TableBasic()
{
String[] columnNames = {"Date", "String", "Long", "Boolean"};
Object[][] data =
{
{getJavaDate("13-11-2020"), "A", new Long(1), Boolean.TRUE },
{getJavaDate("13-11-2018"), "B", new Long(2), Boolean.FALSE},
{getJavaDate("12-11-2015"), "C", new Long(9), Boolean.TRUE },
{getJavaDate("12-11-2015"), "D", new Long(4), Boolean.FALSE},
{null, null, null, null},
{getJavaDate("12-11-2016"), "N/A", new Long(16), Boolean.FALSE}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
@Override
public Class<?> getColumnClass(int column)
{
return columnClasses[column];
}
};
JTable table = new JTable();
table.setModel(model);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setAutoCreateRowSorter(true);
table.getColumnModel().getColumn(0).setCellRenderer(tableCellRenderer);
// Sort the rows
DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter());
ArrayList list = new ArrayList();
list.add( new RowSorter.SortKey(0, SortOrder.DESCENDING) );
sorter.setSortKeys(list);
sorter.sort();
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
}
//Use the Cell Renderer to convert date formats
private TableCellRenderer tableCellRenderer = new DefaultTableCellRenderer()
{
SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy");
public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus,int row, int column)
{
if( value instanceof Date)
{
value = f.format(value);
}
return super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
}
};
//Convert String to java.util.Date
private Date getJavaDate(String s)
{
try {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
Date d = sdf.parse(s);
return d;
} catch (ParseException ex) {
Logger.getLogger(TableBasic.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
public static void main(String[] args)
{
TableBasic frame = new TableBasic();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
}
你能看到这张表的最后两行吗?它们是夏季行,显示上述行的夏季。现在,我需要对这些行进行排序,最后两行除外(在实际应用中,这些数据将从数据库中加载)。
当排序发生时,这是结果。
如您所见,最后两行也得到了整理。我浏览了很多帖子,试图找到一种方法来避免对最后 2 行进行排序,但我无法做任何有效的事情。
最佳答案
评论
是的,这是可能的,但 AFAIK 有两个官方错误 – mKorbel 9 分钟前
真正的解决方案应该是
JPanel 中的另一个(两个)JTable(由 GridBagLayout 放置)用于永远不会使用 JScrollBar 的 JTable,两个 JTable 将与/通过使用 TableColumnModelListener 同步,覆盖两个 JTable 中的 setValueAt XxxTableModels 之间同步值的模型
easiest as is possible to do without playing with official bugs ,页脚再次与/通过使用
TableColumnModelListener
同步,然后 JTable 是用于滚动、过滤、排序等的单独对象,
关于java - 对除最后 2 行之外的 JTable 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26929247/