3

我有一个 JTable,有时我想按整数(大小列)对行进行排序,有时按字符串(文件路径)对行进行排序。所以我在谷歌上搜索它,我已经到了这里。我知道我必须重写DefaultTableModel的一个方法,称为getColumnClass。所以我在这里链接我的代码。

class Personal_model extends DefaultTableModel{

 Personal_model(String[][] s,String[] i){
      super(s,i);
 }


 @Override
 public Class<?> getColumnClass(int columnIndex){

      if (columnIndex!=2) 
              return String.class;
      else
              return Integer.class;

 }
}

这里是创建表的代码,由模型'Personal_model'; 我还设置了行排序器。但这一切都行不通!!!!!!!请帮帮我

      modeltable = new Personal_model(data,col);   
      table = new JTable(modeltable);
      table.setRowSorter(new TableRowSorter<Personal_model>(modeltable));

通常,如果没有我的排序器,一切都可以完美地可视化,并且字符串会正确排序(很明显,因为通常它都是按字符串排序的......)

4

2 回答 2

7

1) 请阅读包含 TableRowSorter 示例的 JTable教程,关于 RowSorter 的问题必须在您的代码中

2) 默认情况下,您可以对 ColumnClass 使用以下定义,

public Class getColumnClass(int c) {
   return getValueAt(0, c).getClass();
}

3)或者你可以硬编码

    @Override
    public Class<?> getColumnClass(int colNum) {
        switch (colNum) {
            case 0:
                return Integer.class;
            case 1:
                return Double.class;
            case 2:
                return Long.class;
            case 3:
                return Boolean.class;
            case 4:
                return String.class;
            case 5:
                return Icon.class;
            default:
                return String.class;
        }
    } 

4)或覆盖RowSorter(注意疯狂的代码)

在此处输入图像描述 在此处输入图像描述

import com.sun.java.swing.Painter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;

public class JTableSortingIconsForNimbus extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTable table;
    private JTable table1;
    private static Icon ascendingSortIcon;
    private static Icon descendingSortIcon;

    public JTableSortingIconsForNimbus() {
        Object[] columnNames = {"Type", "Company", "Shares", "Price"};
        Object[][] data = {
            {"Buy", "IBM", new Integer(1000), new Double(80.50)},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
            {"Sell", "Apple", new Integer(3000), new Double(7.35)},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00)}
        };
        DefaultTableModel model = new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                int firstRow = 0;
                int lastRow = table.getRowCount() - 1;
                if (row == lastRow) {
                    ((JComponent) c).setBackground(Color.red);
                } else if (row == firstRow) {
                    ((JComponent) c).setBackground(Color.blue);
                } else {
                    ((JComponent) c).setBackground(table.getBackground());
                }
                return c;
            }
        };
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.NORTH);
        table1 = new JTable(model) {

            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                int firstRow = 0;
                int lastRow = table1.getRowCount() - 1;
                if (row == lastRow) {
                    ((JComponent) c).setBackground(Color.red);
                } else if (row == firstRow) {
                    ((JComponent) c).setBackground(Color.blue);
                } else {
                    ((JComponent) c).setBackground(table1.getBackground());
                }
                return c;
            }
        };
        table1.setPreferredScrollableViewportSize(table1.getPreferredSize());
        JScrollPane scrollPane1 = new JScrollPane(table1);
        //UIDefaults nimbusOverrides = new UIDefaults();
        //nimbusOverrides.put("Table.ascendingSortIcon", ascendingSortIcon);
        //nimbusOverrides.put("Table.descendingSortIcon", descendingSortIcon);
        //table1.putClientProperty("Nimbus.Overrides", nimbusOverrides);
        //UIManager.getLookAndFeelDefaults().put("Table.ascendingSortIcon", ascendingSortIcon);
        //UIManager.getLookAndFeelDefaults().put("Table.descendingSortIcon", descendingSortIcon);
        UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].ascendingSortIconPainter",
                new FillPainter1(new Color(255, 255, 191)));
        UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].descendingSortIconPainter",
                new FillPainter1(new Color(191, 255, 255)));


        SwingUtilities.updateComponentTreeUI(table1);
        add(scrollPane1, BorderLayout.SOUTH);
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()) {

            @Override
            public void toggleSortOrder(int column) {
                if (column >= 0 && column < getModelWrapper().getColumnCount() && isSortable(column)) {
                    List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
                    if (!keys.isEmpty()) {
                        SortKey sortKey = keys.get(0);
                        if (sortKey.getColumn() == column && sortKey.getSortOrder() == SortOrder.DESCENDING) {
                            setSortKeys(null);
                            return;
                        }
                    }
                }
                super.toggleSortOrder(column);
            }
        };
        table.setRowSorter(sorter);
        table1.setRowSorter(sorter);
    }

    static class FillPainter1 implements Painter<JComponent> {

        private final Color color;

        public FillPainter1(Color c) {
            color = c;
        }

        @Override
        public void paint(Graphics2D g, JComponent object, int width, int height) {
            g.setColor(color);
            g.fillRect(0, 0, width - 1, height - 1);
        }
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            ascendingSortIcon = UIManager.getLookAndFeelDefaults().getIcon("Table.ascendingSortIcon");
            descendingSortIcon = UIManager.getLookAndFeelDefaults().getIcon("Table.descendingSortIcon");
            UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].ascendingSortIconPainter",
                    new FillPainter1(new Color(127, 255, 191)));
            UIManager.getLookAndFeelDefaults().put("TableHeader[Enabled].descendingSortIconPainter",
                    new FillPainter1(new Color(191, 255, 127)));
        } catch (Exception fail) {
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JTableSortingIconsForNimbus frame = new JTableSortingIconsForNimbus();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
于 2012-09-04T20:37:42.253 回答
2

Jimmy,正如 mKorbel 所指出的,您的数据模型由Strings 组成。将数字排序为String不会按自然顺序排序(10 将落在 1 之前)。

你需要先改变你的模型

Personal_model(String[][] s,String[] i){

Personal_model(Object[][] s,String[] i){

然后,您需要确保放入模型中的数据是正确的。我们没有那段代码,但是不用String来表示里面的数字Object[][]

IE

Object[][] myData = new Object[1][2];
myData[0][0] = "This is a String value";
myData[0][1] = 1; // This is not a String value

请全部归功于 mKorbel

于 2012-09-04T22:33:32.587 回答