JTable 的 RowSorter 未正确排序整数 (1,10,100...2,20...3)
RowSorter of JTable not sorting Integers correctly (1,10,100...2,20...3)
我是 Java 的新手,我一整天都在尝试自己解决问题,但没有用。我正在尝试编写一个 Java 应用程序,它连接 Excel sheet 并允许通过 GUI 访问适合电影数据库的 insert/save/sort 数据。这是类中的代码,其中发生了 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 无法对我得到的String 值(nummer 也是String)进行排序。但即使将字符串转换为整数(我今天将我的进度反转到代码的最后 "runable" 状态,因此是字符串数组)也无法解决问题。我遇到了整个 getClass 并将它们设置为 Integer.Class 等等,但无法完全理解如何使用它。无论哪种方式,它所做的只是允许基于字符串而不是单元格内容的数值进行排序。
任何帮助将不胜感激,我阅读的相关主题要么对我来说很难理解,要么没有涵盖我的具体问题。
所以,请耐心等待,因为英语不是我的母语,我也不是很熟练Java。
非常感谢和最诚挚的问候。
您需要为 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;
}
}
});
您需要告诉 table 每一列中存储的数据类型,以便可以使用适当的比较器进行排序。
您可以通过覆盖 TableModel 的 getColumnClass()
方法(或 JTable,如果您在创建 TableModel 时无权访问它)来执行此操作。类似于:
@Override
public Class getColumnClass(int column)
{
if (column == 3)
return Integer.class;
else
return String.class;
}
此外,请确保将 Integer
对象存储在 TableModel
中,而不仅仅是整数的字符串表示形式。
我是 Java 的新手,我一整天都在尝试自己解决问题,但没有用。我正在尝试编写一个 Java 应用程序,它连接 Excel sheet 并允许通过 GUI 访问适合电影数据库的 insert/save/sort 数据。这是类中的代码,其中发生了 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 无法对我得到的String 值(nummer 也是String)进行排序。但即使将字符串转换为整数(我今天将我的进度反转到代码的最后 "runable" 状态,因此是字符串数组)也无法解决问题。我遇到了整个 getClass 并将它们设置为 Integer.Class 等等,但无法完全理解如何使用它。无论哪种方式,它所做的只是允许基于字符串而不是单元格内容的数值进行排序。
任何帮助将不胜感激,我阅读的相关主题要么对我来说很难理解,要么没有涵盖我的具体问题。
所以,请耐心等待,因为英语不是我的母语,我也不是很熟练Java。
非常感谢和最诚挚的问候。
您需要为 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;
}
}
});
您需要告诉 table 每一列中存储的数据类型,以便可以使用适当的比较器进行排序。
您可以通过覆盖 TableModel 的 getColumnClass()
方法(或 JTable,如果您在创建 TableModel 时无权访问它)来执行此操作。类似于:
@Override
public Class getColumnClass(int column)
{
if (column == 3)
return Integer.class;
else
return String.class;
}
此外,请确保将 Integer
对象存储在 TableModel
中,而不仅仅是整数的字符串表示形式。