【问题标题】:JTable: sorting by IntegerJTable:按整数排序
【发布时间】:2012-08-29 12:59:32
【问题描述】:

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

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

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

【问题讨论】:

  • 请编辑您的问题以包含一个 sscce 来展示您所描述的问题。

标签: java swing jtable defaulttablemodel tablerowsorter


【解决方案1】:

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

你需要先改变你的模型

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

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

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

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

【讨论】:

  • 我有一个问题 data[i+j][2] = (files[i].length()/1024); where File[ ] [ ] 个文件;我已经将类型从 String 更改为 Object。但是当我尝试做那个任务时,错误。 (files[i].length()/1024) 是 LONG,所以在 getColumnCLass 中我将 return Integer.class 更改为 Long.class,帮帮我,我不知道
【解决方案2】:

1) 请阅读关于JTable that's contains TableRowSorter example 的教程,关于 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);
            }
        });
    }
}

【讨论】:

  • 你可以看到我有一个被覆盖的方法,叫做 getColumnClass
  • 必须将String[][]更改为Object[][],然后您可以将各种数据类型填充到TableModel,否则一切都是String值,用我的代码示例测试并更改Object[][]String[][] 编辑(必须删除 new Integernew Double 并将值包装为“1000”)
  • 请看我的代码?我有什么要改变的? Datacol 都是 String;你是在告诉我我必须将 Data 设置为 Object[ ][ ]?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2022-12-08
  • 1970-01-01
  • 2012-11-29
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多