java - 对除最后 2 行之外的 JTable 进行排序

标签 java swing sorting user-interface jtable

请看下面的代码。

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);
    }
}

你能看到这张表的最后两行吗?它们是夏季行,显示上述行的夏季。现在,我需要对这些行进行排序,最后两行除外(在实际应用中,这些数据将从数据库中加载)。

当排序发生时,这是结果。

enter image description here

如您所见,最后两行也得到了整理。我浏览了很多帖子,试图找到一种方法来避免对最后 2 行进行排序,但我无法做任何有效的事情。

最佳答案

评论


真正的解决方案应该是

  • 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/

相关文章:

java - Terracotta + Compass = Hibernate + HSQLDB + JMS?

java - BigDecimal 科学计数法 String 和普通 String

java - HTML 中的 Swing 组件

java - 跨应用程序重用 JEditorPane

java - 如何使用 GeoDataApi.getPlaceById?

java - 无法从 Set<Map.Entry<String,capture#2-of 转换?将 A>> 扩展为 Set<Map.Entry<String,?延伸A>>

java - JPanel removeAll 没有去掉以前的组件

python numpy argsort问题

python - 冒泡排序和插入排序如何计时?

javascript - 将已排序的集合合并到新的已排序集合中的最有效方法?