【发布时间】:2014-07-29 13:26:55
【问题描述】:
fireTableStructureChanged() 方法从头开始重新绘制整个 JTable。众所周知,用户指定的列宽和用户指定的行排序(当用户单击列的标题之一时)将丢失。
有没有办法存储自定义排序并在调用fireTableStructureChanged() 后将其取回?
可能是convertRowIndexToModel 和convertRowIndexToView 的方法可以帮助...
或者是否有另一种方法可以在保持排序的情况下重绘整个表格(在更改行数之后)?
这是我添加/删除一些行的实验的简短示例:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
public class Table extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
private String[][] tableData = {{"a", "5"},
{"b", "4"},
{"c", "9"},
{"d", "2"},
{"e", "1"},
{"f", "7"},
{"g", "3"},
{"h", "8"},
{"i", "6"}};
private String[] columns = {"A", "B"};
public Table() {
MyTableModel mtm = new MyTableModel(tableData, columns);
this.setLayout(new BorderLayout());
table = new JTable(mtm);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getTableHeader().setReorderingAllowed(false);
table.setCellSelectionEnabled(true);
table.setAutoCreateRowSorter(true);
JScrollPane scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(600, 150));
this.add(scrollpane);
this.setLocation(300, 100);
setVisible(true);
pack();
//Trying to add and remove some rows:
mtm.addRow(new Object[]{"new 1", "new 2"});
mtm.removeRow(2);
mtm.removeRow(3);
table.addNotify();
}
public class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private String[][] tableData;
private String[] columns;
public MyTableModel(String[][] tableData, String[] columns) {
this.tableData = tableData;
this.columns = columns;
}
public void addRow(Object newRow) {
fireTableRowsInserted(2, 2);
}
public void removeRow(int row) {
fireTableRowsDeleted(row, row);
}
public int getRowCount() {
return tableData.length;
}
public int getColumnCount() {
return columns.length;
}
public String getColumnName(int column) {
return columns[column];
}
public Object getValueAt(int row, int col) {
return tableData[row][col];
}
public void setValueAt(Object value, int row, int col) {
String oldValue = (String) tableData[row][col];
if(oldValue.equals((String)value)) {
return;
}
tableData[row][col] = value.toString();
}
public boolean isCellEditable(int row, int col) {
return true;
}
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Table();
}
});
}
}
【问题讨论】:
-
是,是/否,否,是的,为了更好的帮助,请尽快发布 SSCCE/MCVE 简短、可运行、可编译的 JTable/XxxTableModel 硬编码值在局部变量中
-
@mKorbel 我添加了一个独立的程序代码来说明我的问题。