首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JTable:按整数排序

JTable:按整数排序
EN

Stack Overflow用户
提问于 2012-09-04 20:15:29
回答 2查看 9.9K关注 0票数 3

我有一个JTable,我希望有时按整数(大小列)排序行,有时按字符串(文件路径)排序。所以我在谷歌上搜索了一下,我已经到了这里。我知道我必须重写DefaultTableModel,的一个叫做getColumnClass.的方法所以我在这里链接我的密码。

代码语言:javascript
运行
复制
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’创建表的代码;我还设置了行排序器。但这一切都行不通!请帮帮我

代码语言:javascript
运行
复制
      modeltable = new Personal_model(data,col);   
      table = new JTable(modeltable);
      table.setRowSorter(new TableRowSorter<Personal_model>(modeltable));

通常,没有我的分类器,一切都是完美的可视化,字符串的排序是正确的(很明显,因为通常它都是按字符串排序的。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-04 20:37:42

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

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

代码语言:javascript
运行
复制
public Class getColumnClass(int c) {
   return getValueAt(0, c).getClass();
}

3)或者你可以硬编码

代码语言:javascript
运行
复制
    @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 (注意疯狂代码)

代码语言:javascript
运行
复制
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);
            }
        });
    }
}
票数 7
EN

Stack Overflow用户

发布于 2012-09-04 22:33:32

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

您需要首先更改您的模型

代码语言:javascript
运行
复制
Personal_model(String[][] s,String[] i){

代码语言:javascript
运行
复制
Personal_model(Object[][] s,String[] i){

然后,您需要确保您在模型中输入的数据是正确的。我们没有这部分代码,但不要使用String来表示Object[][]中的数字

代码语言:javascript
运行
复制
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的所有贷方

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12270738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档