首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java SE 6 Swing 新特性:JTable 排序過濾、JTabbedPane 增強、打印 API 與拖放支持

     編輯:Java 相關知識

JTable 內建排序與過濾

Java 6 引入 RowSorter 抽象類及實現 TableRowSorter,零代碼實現列排序、數據過濾。

基礎用法

TableModel model = new DefaultTableModel(data, columns);
JTable table = new JTable(model);
RowSorter sorter = new TableRowSorter<>(model);
table.setRowSorter(sorter); // 啟用排序

用戶點擊列頭自動切換升序/降序(三角箭頭指示)。

數值正確排序:覆蓋 getColumnClass

默認列類型 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 組合複雜條件。

JTabbedPane 增強

  • setTabComponentAt(index, Component):自定義標籤組件(關閉按鈕、圖標、進度條)。
  • setTabLayoutPolicy(SCROLL_TAB_LAYOUT):標籤過多時滾動而非換行。
  • indexOfTabComponent(Component):從組件反查索引。

打印 API 全面升級

  • JTextComponent.print():一鍵打印文本組件內容,支持頁眉/頁腳、打印屬性集。
  • JTable.print():直接打印表格,自動分頁、縮放適應紙張。
  • Printable、Pageable 接口配合 PrinterJob 實現複雜報表打印。

拖放(Drag & Drop)框架增強

  • 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 開發建議:

  • JDK 17/21 LTS 版本,獲得持續安全更新。
  • 考慮 JavaFX(FXML、CSS 樣式、屬性綁定)替代 Swing。
  • 若維護舊系統,RowSorter、TransferHandler API 向後兼容,無縫遷移。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved