我寫了一個定製TableRowSorter
改變的排序順序,當你從SortOrder.UNSORTED
=>SortOrder.ASCENDING
=>SortOrder.DESCENDING
=>SortOrder.ASCENDING
=>SortOrder.DESCENDING
=> ...
在JTableHeader
點擊SortOrder.UNSORTED
=>SortOrder.ASCENDING
=>SortOrder.DESCENDING
=>SortOrder.UNSORTED
=>SortOrder.ASCENDING
=>SortOrder.DESCENDING
=> ...定製TableHeaderUI打破習俗,TableRowSorter還
ADU_SortOrder.java
package order;
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);
}
boolean firstTime = true; //Needed in case there are any initial sort keys
int columnHolder = -1;
@Override
public void toggleSortOrder(int column) {
List<? extends SortKey> sortKeys = getSortKeys();
if(sortKeys.size() == 0) { //For if there are no initial sort keys
List<SortKey> keys = new ArrayList<SortKey>();
keys.add(new SortKey(column, SortOrder.ASCENDING));
setSortKeys(keys);
return;
}
if (sortKeys.size() > 0 && columnHolder == column || firstTime) {
if(firstTime) {
firstTime = false;
columnHolder = column;
if(column != sortKeys.get(0).getColumn()) {
List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
keys.set(0, new SortKey(column, SortOrder.ASCENDING));
setSortKeys(keys);
return;
}
}
List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
keys.set(0, new SortKey(column, setNextOrder(sortKeys.get(0).getSortOrder())));
setSortKeys(keys);
return;
} else if(sortKeys.size() > 0 && columnHolder != column && !firstTime) {
List<SortKey> keys = new ArrayList<SortKey>(getSortKeys());
keys.set(0, new SortKey(column, SortOrder.ASCENDING));
setSortKeys(keys);
columnHolder = column;
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;
}
}
}
當你實現它的作品真的很好弄成這個樣子
JTableTest.java - 工作實例
import java.awt.GridLayout;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import order.ADU_SortOrder;
@SuppressWarnings("serial")
public class JTableTest extends JFrame {
private JTableTest() {
super("JTable Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
pack();
setVisible(true);
}
JPanel panel = new JPanel(new GridLayout(1, 1));
JScrollPane scroll;
private void createPanel() {
Object[] headers = {"Select", "Title", "Artist", "Length", "Title"};
Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673", "Bat Outta Hell"},
{false, "Spanish Train", "Chris De Burgh", "358", "Spanish Train"},
{true, "Bat Outta Hell", "Meat Loaf", "673", "Bat Outta Hell"}};
JTable table = new JTable(sampleData, headers);
//Sort Order Part
ADU_SortOrder<TableModel> sortOrder = new ADU_SortOrder<TableModel>(table.getModel());
List<RowSorter.SortKey> sortKeys = new ArrayList<>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sortOrder.setSortKeys(sortKeys);
table.setRowSorter(sortOrder);
scroll = new JScrollPane(table);
panel.add(scroll);
getContentPane().add(panel);
}
public static void main(String[] args) {
new JTableTest();
}
}
然而,一旦你添加自定義的例子如BasicTableHeaderUI
一個在下面。
CustomHeaderUI.java
package ui;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.TableColumnModel;
@SuppressWarnings("serial")
public class CustomHeaderUI extends BasicTableHeaderUI {
public void canReorder(String col, boolean reorder) {
TableColumnModel cM = header.getColumnModel();
for(int i = 0; i < cM.getColumnCount(); i++) {
if(header.getTable().getColumnName(i).equals(col)) {
canReorder(i, reorder);
break;
}
}
}
public void canReorder(String col, int instance, boolean reorder) {
TableColumnModel cM = header.getColumnModel();
int column = -1;
for(int i = 0; i < cM.getColumnCount(); i++) {
if(header.getTable().getColumnName(i).equals(col)) {
column++;
if(column == instance - 1) {
canReorder(i, reorder);
break;
}
}
}
}
public void canReorderAll(String col, boolean reorder) {
TableColumnModel cM = header.getColumnModel();
for(int i = 0; i < cM.getColumnCount(); i++) {
if(header.getTable().getColumnName(i).equals(col))
canReorder(i, reorder);
}
}
public void canReorder(int col, boolean reorder) {
}
}
JTableTest.java - SSSCE/MCVE
import java.awt.GridLayout;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.RowSorter.SortKey;
import javax.swing.SortOrder;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import order.ADU_SortOrder;
import ui.CustomHeaderUI;
@SuppressWarnings("serial")
public class JTableTest extends JFrame {
private JTableTest() {
super("JTable Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
pack();
setVisible(true);
}
JPanel panel = new JPanel(new GridLayout(1, 1));
JScrollPane scroll;
private void createPanel() {
Object[] headers = {"Select", "Title", "Artist", "Length", "Title"};
Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673", "Bat Outta Hell"},
{false, "Spanish Train", "Chris De Burgh", "358", "Spanish Train"},
{true, "Bat Outta Hell", "Meat Loaf", "673", "Bat Outta Hell"}};
JTable table = new JTable(sampleData, headers);
ADU_SortOrder<TableModel> sortOrder = new ADU_SortOrder<TableModel>(table.getModel());
List<SortKey> keys = new ArrayList<SortKey>();
keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sortOrder.setSortKeys(keys);
table.setRowSorter(sortOrder);
//Adds Custom UI
CustomHeaderUI headerUI = new CustomHeaderUI();
headerUI.installUI(table.getTableHeader());
headerUI.canReorder("Title", true);
headerUI.canReorder("Title", 1, true);
headerUI.canReorderAll("Title", true);
headerUI.canReorder(3, true);
scroll = new JScrollPane(table);
panel.add(scroll);
getContentPane().add(panel);
}
public static void main(String[] args) {
new JTableTest();
}
}
這包括一些樣品CustomHeaderUI
方法清楚地顯示了這兩個問題。首先排序順序不正確。如果你開始的第一列Column 0
的排序順序是
SortOrder.ASCENDING
=>SortOrder.UNSORTED
=>SortOrder.DESCENDING
=>SortOrder.ASCENDING
=>SortOrder.UNSORTED
=>SortOrder.DESCENDING
=> ...
開始,因爲keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
的上升不becasue的一個小故障與我的代碼
這不是在開始描述的所需的排序順序。第二個問題是,當您拖動MCVE中的列時,它會跳轉兩列而不是一列。我真的很感謝幫助解決這些問題。
謝謝你這樣 – Dan