首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RowSorter of JTable未正确排序整数(1,10,100.2,20.3)

RowSorter of JTable未正确排序整数(1,10,100.2,20.3)
EN

Stack Overflow用户
提问于 2015-12-01 17:09:28
回答 2查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
    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也是一个字符串),这是我得到的。但是,即使将String转换为Integer (我今天将进度倒转到代码的最后一个“可运行”状态,因此字符串数组)也解决不了这个问题。我遇到了整个getClass,并将它们设置为Integer.Class等等,但我无法完全理解如何正确使用它。无论哪种方式,它所做的都是允许基于字符串的排序,而不是单元格内容的数字值。

任何帮助都将是非常感谢的,相关的话题,我读到,要么是我很难理解,或没有涵盖我的具体问题。

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

谢谢大家并致以最良好的问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-01 17:33:23

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

要做到这一点,可以重写TableModel的TableModel方法(如果创建TableModel时无法访问TableModel,则重写JTable )。类似于:

代码语言:javascript
复制
@Override
public Class getColumnClass(int column)
{
    if (column == 3)
        return Integer.class;
    else
        return String.class;
}

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

票数 6
EN

Stack Overflow用户

发布于 2015-12-01 17:27:30

您需要为排序器对象设置比较器,如下所示:

代码语言:javascript
复制
    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;
          }
      }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34026013

复制
相关文章

相似问题

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