嗯,我花了一些時間來盡我所能完善這一點,但這裏是我的工作的例子。
基本上,我做了一個名爲ComparableWrapper
的包裝類,它實現了Comparable,因此每列的排序都可以被操縱。對於表模型,我添加了一個setData(Object[][] data)
方法,該方法自動將所有數據值包裝在ComparableWrapper
中。 ComparableWrapper
構造函數中的sorted
參數確定值是否應按正常順序排序,或者無論如何都保留在頂部。
您必須在幾個位置手動更改列的類類型。總之,這裏是我的SSCCE:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import org.jdesktop.swingx.JXTable;
public class TableTest extends JFrame {
public TableTest() {
super("JXTable - first 3 rows aren't sorted");
setLayout(new BorderLayout());
MyTableModel model = new MyTableModel();
JXTable table = new JXTable();
table.setModel(model);
Object[][] initialData = {
{"Zoe", new Integer(26)},
{"Adam", new Integer(29)},
{"Trisha", new Integer(33)},
{"Reed", new Integer(20)},
{"John", new Integer(3)},
{"Kyle", new Integer(102)},
{"Billy Bob", new Integer(27)},
{"Sandra", new Integer(87)},
{"Steve", new Integer(50)},
{"Guy", new Integer(23)},
{"Kenzie", new Integer(25)},
{"Mary", new Integer(27)},
{"Sally", new Integer(12)},
{"Joe", new Integer(101)},
{"Billy", new Integer(44)},
{"Bob", new Integer(83)},
};
model.setData(initialData);
JScrollPane tableScroll = new JScrollPane(table);
add(tableScroll, BorderLayout.CENTER);
table.setFillsViewportHeight(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 600);
setVisible(true);
setLocationRelativeTo(null);
}
private class MyTableModel extends AbstractTableModel {
String[] columns = { "First Name", "Age" };
Object[][] data = {};
public void setData(Object[][] data) {
for (int i=0; i<data.length; i++) {
// Don't sort top 3 rows
boolean sorted = i < 3 ? false : true;
// Wrap each object so the sorting can be manipulated.
// Change these class types as needed.
data[i][0] = new ComparableWrapper<String>((String) data[i][0], sorted);
data[i][1] = new ComparableWrapper<Integer>((Integer) data[i][1], sorted);
}
this.data = data;
fireTableDataChanged();
}
@Override
public Class<?> getColumnClass(int col) {
return ComparableWrapper.class;
}
@Override
public int getColumnCount() {
return columns.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public String getColumnName(int col) {
return columns[col];
}
}
private class ComparableWrapper<T> implements Comparable<ComparableWrapper<T>> {
private Comparable<T> object;
private boolean sorted;
public ComparableWrapper(Comparable<T> object, boolean sorted) {
this.object = object;
this.sorted = sorted;
}
@Override
public int compareTo(ComparableWrapper<T> o) {
if (object instanceof Comparable<?>) {
if (sorted && o.isSorted()) {
// Sort normally by default
return object.compareTo(o.getObject());
} else {
// If an un-sorted row is being compared, don't compare at all
return 0;
}
}
// Fallback
return 0;
}
public T getObject() {
return (T) object;
}
public boolean isSorted() {
return sorted;
}
@Override
public String toString() {
return object.toString();
}
}
public static void main(String[] args) {
new TableTest();
}
}
http://stackoverflow.com/questions/11665397/jtable-multiple-header-rows –
如果該鏈接適用不知道。這是指頭的分組。任何評論爲什麼你認爲它的相似或任何特定的部分,我應該重讀? – codeNinja
我認爲有多行標題可能就像在排序時修正了頂行。 _謝謝,下次再精心準備._ –