我已經做了TableRowSorter
應該更新,其中每列從ASCENDING => DESCENDING => ASCENDING => DESCENDING => ...
排序,以ASCENDING => DESCENDING => UNSORTED => ASCENDING => DESCENDING => UNSORTED => ...
TableRowSorter還返回不正確SortOrder的
import java.util.ArrayList;
import java.util.List;
import javax.swing.SortOrder;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> {
public ADU_SortOrder(M model) {
setModel(model);
}
@Override
public void toggleSortOrder(int column) {
List<? extends SortKey> sortKeys = getSortKeys();
if (sortKeys.size() > 0) {
List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder())));
setSortKeys(keys);
return;
}
super.toggleSortOrder(column);
}
private SortOrder setNextOrder(SortOrder order) {
switch (order) {
case ASCENDING:
return SortOrder.DESCENDING;
case DESCENDING:
return SortOrder.UNSORTED;
case UNSORTED:
return SortOrder.ASCENDING;
default:
return SortOrder.UNSORTED;
}
}
}
在給出的示例中,我會盡力來形容我所期望的週期發生和實際發生的事情。你有一個JTable
兩欄。在開始時使用的SortKeys
使得每列中的最後一行都是這樣,以便列是SortOrder.ASCENDING
我期望在這裏發生的將是以下內容。
Sort Order in: Column 1 Column 2
Start: ASCENDING ASCENDING
Click C1: DESCENDING ASCENDING
Click C1: UNSORTED ASCENDING
Click C2: UNSORTED DESCENDING
Click C1: ASCENDING DESCENDING
Click C2: ASCENDING UNSORTED
實際發生的:
Sort Order in: Column 1 Column 2
Start: ASCENDING ASCENDING
Click C1: DESCENDING ASCENDING
Click C1: UNSORTED ASCENDING
Click C2: UNSORTED ASCENDING
Click C1: DESCENDING ASCENDING
Click C2: DESCENDING UNSORTED
正如你可以看到越來越列的排序順序點擊的相反,TableRowSorter
得到應用的最後一個排序順序,然後只用於下一個排序順序點擊下一列。我如何能夠單獨處理每個列並更新列以使其按預期工作?
這是一個MCV。對於之前沒有包括一個,我表示歉意。
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SortOrder;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter.SortKey;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class MVC extends JFrame {
private static final long serialVersionUID = -8809862571237032846L;
private MVC() {
setTitle("MVC");
createAndRunGUI();
pack();
setVisible(true);
setLocationRelativeTo(null);
}
private void createAndRunGUI() {
setLayout(new GridLayout(1, 1));
String[] tableHeaders = {"Col 1", "Col 2"};
String[][] tableData = {
{"Hi", "Animals"},
{"Bob", "Of"},
{"Phil", "The"},
{"Dog", "World"},
{"Cat", "Include"},
{"Pill", "Fish"},
{"Dab", "Ants"},
{"Bob", "Hippos"},
{"Fill", "Humans"},
{"Space", "TVs"},
{"Up", "Is"},
{"Now", "That"},
{"Even", "Right"},
{"More", "Person"},
{"Data", "?"}
};
JTable table = new JTable(tableData, tableHeaders);
table.setAutoCreateRowSorter(true);
ADU_SortOrder<TableModel> tableSorter = new ADU_SortOrder<TableModel>(table.getModel());
List<SortKey> keys = new ArrayList<SortKey>();
//keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
//keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
tableSorter.setSortKeys(keys);
table.setRowSorter(tableSorter);
JScrollPane myScrollTable = new JScrollPane(table);
myScrollTable.setPreferredSize(new Dimension(600, 600));
JPanel cont = new JPanel();
cont.add(myScrollTable);
getContentPane().add(cont);
}
public static void main(String[] args) {
new MVC();
}
private class ADU_SortOrder<M extends TableModel> extends TableRowSorter<M> {
public ADU_SortOrder(M model) {
setModel(model);
}
@Override
public void toggleSortOrder(int column) {
List<? extends SortKey> sortKeys = getSortKeys();
if (sortKeys.size() > 0) {
List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder())));
setSortKeys(keys);
return;
}
super.toggleSortOrder(column);
}
private SortOrder setNextOrder(SortOrder order) {
switch (order) {
case ASCENDING:
return SortOrder.DESCENDING;
case DESCENDING:
return SortOrder.UNSORTED;
case UNSORTED:
return SortOrder.ASCENDING;
default:
return SortOrder.UNSORTED;
}
}
}
}
編輯2
綜觀具體方法toggleSortOrder
而在程序運行很明顯的,問題是與代碼的一部分,其表示setNextOrder(keys.get(0).getSortOrder())
。這是因爲當代碼返回getSortKeys()
作爲ArrayList
時,列表的大小隻有0
或1
。這意味着當列表的長度爲1
代碼get(0)
返回排序的最後一列,但代碼get(column)
將導致IndexOutOfBoundsException
。那麼我怎麼能讓程序得到每一列的SortKeys
?
@Override
public void toggleSortOrder(int column) {
System.out.println("Column: " + column);
List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
System.out.println("List Size: " + keys.size());
if (keys.size() > 0) {
keys.set(0, new SortKey(column, setNextOrder(keys.get(0).getSortOrder())));
setSortKeys(keys);
return;
}
super.toggleSortOrder(column);
}
編輯3
使用Andreas'建議我創建了一個辦法能夠使用keys.set(column, new SortKey(column, setNextOrder(keys.get(column).getSortOrder())));
List<SortKey> keys = new ArrayList<SortKey>();
@Override
public void toggleSortOrder(int column) {
System.out.println("Column: " + column);
System.out.println("List Size: " + keys.size());
if (keys.size() > 0) {
keys.set(column, new SortKey(column, setNextOrder(keys.get(column).getSortOrder())));
setSortKeys(keys);
return;
}
super.toggleSortOrder(column);
}
private SortOrder setNextOrder(SortOrder order) {
switch (order) {
case ASCENDING:
return SortOrder.DESCENDING;
case DESCENDING:
return SortOrder.UNSORTED;
case UNSORTED:
return SortOrder.ASCENDING;
default:
return SortOrder.UNSORTED;
}
}
private void initialSortOrder(M model) {
for(int i = 0; i < model.getColumnCount(); i++) {
keys.add(new RowSorter.SortKey(i, SortOrder.ASCENDING));
}
}
然而,使用這種方法第1列可以進行排序,但只有字Of
和Hippo
可以在第二列中排序。我知道這已經變成了一個非常長的問題和抱歉,但我很欣賞任何幫助
請參閱[什麼是調試器,它如何幫助我診斷問題?](http://stackoverflow.com/q/25385173/5221149)。另請閱讀[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Andreas
@Andreas我包括一個MCV,真的很感激任何幫助 – Dan
那麼當你用調試器運行代碼時,你看到了什麼? – Andreas