Java 6 引入 RowSorter 抽象類及實現 TableRowSorter,零代碼實現列排序、數據過濾。
TableModel model = new DefaultTableModel(data, columns);
JTable table = new JTable(model);
RowSorter sorter = new TableRowSorter<>(model);
table.setRowSorter(sorter); // 啟用排序
用戶點擊列頭自動切換升序/降序(三角箭頭指示)。
默認列類型 Object 導致數字按字符串排序("1234" < "25")。覆蓋模型方法返回實際類型:
TableModel model = new DefaultTableModel(data, columns) {
@Override public Class> getColumnClass(int col) {
return getValueAt(0, col).getClass(); // 返回 Integer, String 等
}
};
此後「年齡」列按數值大小排序。
JTextField filterField = new JTextField();
JButton filterBtn = new JButton("過濾");
filterBtn.addActionListener(e -> {
String text = filterField.getText();
if (text.isEmpty()) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(text)); // 支持正則
}
});
RowFilter 靜態工廠方法:numberFilter、dateFilter、orFilter、andFilter、notFilter 組合複雜條件。
setTabComponentAt(index, Component):自定義標籤組件(關閉按鈕、圖標、進度條)。setTabLayoutPolicy(SCROLL_TAB_LAYOUT):標籤過多時滾動而非換行。indexOfTabComponent(Component):從組件反查索引。JTextComponent.print():一鍵打印文本組件內容,支持頁眉/頁腳、打印屬性集。JTable.print():直接打印表格,自動分頁、縮放適應紙張。Printable、Pageable 接口配合 PrinterJob 實現複雜報表打印。TransferHandler 統一管理拖放邏輯,JComponent.setTransferHandler() 即可啟用。FileTransferHandler)拖放。Transferable 實現跨應用程序數據交換。public class TableDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("JTable 排序過濾 Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object[][] data = {
{"王明", "中國", 44}, {"姚明", "中國", 25},
{"趙子龍", "西蜀", 1234}, {"曹操", "北魏", 2112},
{"Bill Gates", "美國", 45}, {"Mike", "英國", 33}
};
String[] cols = {"姓名", "國籍", "年齡"};
TableModel model = new DefaultTableModel(data, cols) {
@Override public Class> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
};
JTable table = new JTable(model);
TableRowSorter sorter = new TableRowSorter<>(model);
table.setRowSorter(sorter);
JPanel top = new JPanel(new BorderLayout());
top.add(new JLabel("過濾:"), BorderLayout.WEST);
JTextField tf = new JTextField();
top.add(tf, BorderLayout.CENTER);
JButton btn = new JButton("過濾");
btn.addActionListener(e -> {
String t = tf.getText();
sorter.setRowFilter(t.isEmpty() ? null : RowFilter.regexFilter(t));
});
top.add(btn, BorderLayout.EAST);
f.add(new JScrollPane(table), BorderLayout.CENTER);
f.add(top, BorderLayout.NORTH);
f.setSize(400, 300);
f.setVisible(true);
});
}
}
Java 6 已停止公共更新。現代 Swing 開發建議:
RowSorter、TransferHandler API 向後兼容,無縫遷移。