【问题标题】:RowSorter of JTable not sorting Integers correctly (1,10,100...2,20...3)JTable 的 RowSorter 未正确排序整数 (1,10,100...2,20...3)
【发布时间】:2016-03-05 16:57:54
【问题描述】:

我对 Java 还是很陌生,我整天都在尝试过分地解决这个问题,但它不起作用。我正在尝试编写一个与 Excel 表连接并允许通过 GUI 插入/保存/排序适合电影数据库的数据的 Java 应用程序。这是类中的代码,GUI 魔术和排序发生在该类中:

    package gui;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import object.Film;
import excel.Excelverbindung;

public class Tabelle extends JTable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    static String[] columnNames = { "Nr.", "Titel", "Jahr", "Regie",
            "Primäres Genre", "Sekundäres Genre", "Wertung", "Originaltitel" };
    static List<Film> rowlist = new ArrayList<Film>();
    static String[] rowData = {};
    JTable table = new JTable();
    Excelverbindung excelverb = new Excelverbindung();

    public Tabelle() {
    }

    private List<Film> getRowData() {
        Excelverbindung excelverb = new Excelverbindung();
        rowlist = excelverb.leseExcel();
        return rowlist;
    }

    public JTable fuellenTabelle() {
        TableModel tableModel = new DefaultTableModel(columnNames, 0);

        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
        table.setRowSorter(sorter);

        sorter.setModel(tableModel);
        table.setModel(tableModel);

        Tabelle.rowlist = getRowData();
        String[] film = new String[7];

        for (Film temp : rowlist) {
            film[0] = temp.getNummer();
            film[1] = temp.getName();
            film[2] = temp.getJahr();
            film[3] = temp.getRegie();
            film[4] = temp.getGenre1();
            film[5] = temp.getGenre2();
            film[6] = temp.getWertung();
            ((DefaultTableModel) tableModel).addRow(film);
        }

        System.out.println("Tabelle erzeugt");
        return table;
    }

    public void getRandomFilm() {
        Film film;
        excelverb.oeffneVerbindung();
        film = excelverb.holeZufaelligerFilm();
        excelverb.schließeVerbindung();

        film.getNummer();
        film.getName();
        film.getJahr();
        film.getRegie();
        film.getGenre1();
        film.getGenre2();
        film.getWertung();
        UIManager.put("OptionPane.cancelButtonText", "Ach, egal...");
        UIManager.put("OptionPane.okButtonText", "Nächster!");

        int input = JOptionPane.showOptionDialog(
                null,
                "Nr.:" + film.getNummer() + " Titel: " + film.getName()
                        + " Jahr: " + film.getJahr() + " Genres: "
                        + film.getGenre1() + " und " + film.getGenre2()
                        + " von " + film.getRegie(),
                "Schau einfach den Film...", JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.INFORMATION_MESSAGE, null, null, null);

        if (input == JOptionPane.OK_OPTION) {
            getRandomFilm();
        } else if (input == JOptionPane.CANCEL_OPTION) {
        }
    }
}

似乎 RowSorter 无法对我得到的字符串值(nummer 也是一个字符串)进行排序。但即使将字符串转换为整数(我今天将我的进度反转到代码的最后一个“可运行”状态,因此字符串数组)也无法解决它。我遇到了整个 getClass 并将它们设置为 Integer.Class 等等,但我不知道如何准确地使用它。无论哪种方式,它所做的只是允许基于字符串而不是单元格内容的数值进行排序。

任何帮助将不胜感激,我阅读的相关主题要么对我来说很难理解,要么没有涵盖我的具体问题。

所以,请耐心等待,因为英语既不是我的母语,也不是我精通 Java。

非常感谢和最好的问候。

【问题讨论】:

    标签: java excel swing sorting jtable


    【解决方案1】:

    您需要告诉表格每一列中存储的数据类型,以便可以使用适当的比较器进行排序。

    您可以通过覆盖 TableModel 的 getColumnClass() 方法(或 JTable,如果您在创建 TableModel 时无权访问)来执行此操作。比如:

    @Override
    public Class getColumnClass(int column)
    {
        if (column == 3)
            return Integer.class;
        else
            return String.class;
    }
    

    此外,请确保将 Integer 对象存储在 TableModel 中,而不仅仅是整数的字符串表示形式。

    【讨论】:

    • 非常感谢,伙计,它就像一个魅力。我创建了一个新的整数对象 (int zahl = new Integer(Integer.parseInt(temp.getNummer())); ) 并实现了您的 sn-p 代码,瞧。只是另一个问题:为什么相同的方法不适用于浮点数? double wertung = new Double(Double.parseDouble(temp.getWertung())); 给我一个“找不到源”错误...
    • 不知道为什么双倍对你不起作用。它对我来说很好。
    • 但是我可以在 if 子句中插入另一个条件,例如 if (column == 3) return Integer.class; else if (column == 6) return Double.class 让它工作,对吧?而且我会调用该方法两次,一次使用 0 作为参数,另一次使用 6。将 temp.getWertung 从 String 转换为 Double 应该可以解决问题,不是吗?对不起,如果我错过了什么......
    • @Prometheus,是的,这就是 getColumnClass() 方法的重点。您返回列的类。每列都可能是不同的类。
    【解决方案2】:

    您需要为 sorter 对象设置 Comparator,如下所示:

        sorter.setComparator(0, new Comparator<Integer>() {
        @Override
          public int compare(Integer o1, Integer o2) {
              int len1 = o1.toString().length();
              int len2 = o2.toString().length();
              if (len1==len2) {
                  return o1.compareTo(o2);
              } else {
                  return len1-len2;
              }
          }
        });
    

    【讨论】:

    • 感谢您与我们联系,camickrs 的提议成功了。 :)
    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2012-08-29
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多