我对Java非常陌生,我一整天都在尝试自己解决这个问题,但是它不起作用。我正在尝试编写一个Java应用程序,该应用程序与Excel表连接,并允许通过GUI插入/保存/排序适合电影数据库的数据。下面是类库中的代码,其中会出现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也是一个字符串),这是我得到的。但是,即使将String转换为Integer (我今天将进度倒转到代码的最后一个“可运行”状态,因此字符串数组)也解决不了这个问题。我遇到了整个getClass,并将它们设置为Integer.Class等等,但我无法完全理解如何正确使用它。无论哪种方式,它所做的都是允许基于字符串的排序,而不是单元格内容的数字值。
任何帮助都将是非常感谢的,相关的话题,我读到,要么是我很难理解,或没有涵盖我的具体问题。
所以,请耐心点,因为英语既不是我的母语,也不是我精通Java的语言。
谢谢大家并致以最良好的问候。
发布于 2015-12-01 17:33:23
您需要告诉表存储在每一列中的数据类型,这样就可以使用适当的比较器来进行排序。
要做到这一点,可以重写TableModel的TableModel方法(如果创建TableModel时无法访问TableModel,则重写JTable )。类似于:
@Override
public Class getColumnClass(int column)
{
if (column == 3)
return Integer.class;
else
return String.class;
}另外,确保将Integer对象存储在TableModel中,而不仅仅是Integer的字符串表示形式。
发布于 2015-12-01 17:27:30
您需要为排序器对象设置比较器,如下所示:
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;
}
}
});https://stackoverflow.com/questions/34026013
复制相似问题