1. 程式人生 > >Swing之JTable篇,用JDK1.6中的TableRowSorter實現過濾與排序功能

Swing之JTable篇,用JDK1.6中的TableRowSorter實現過濾與排序功能

TableRowSorter該物件是JDK1.6中才有的,可以通過該物件實現過濾和排序等功能

例子:實現過濾

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class RegexTable {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Regexing JTable");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Object rows[][] = { { "A", "About", 44.36 }, { "B", "Boy", 44.84 }, { "C", "Cat", 463.63 },
        { "D", "Day", 27.14 }, { "E", "Eat", 44.57 }, { "F", "Fail", 23.15 },
        { "G", "Good", 4.40 }, { "H", "Hot", 24.96 }, { "I", "Ivey", 5.45 },
        { "J", "Jack", 49.54 }, { "K", "Kids", 280.00 } };
    String columns[] = { "Symbol", "Name", "Price" };
    TableModel model = new DefaultTableModel(rows, columns) {
      public Class getColumnClass(int column) {
        Class returnValue;
        if ((column >= 0) && (column < getColumnCount())) {
          returnValue = getValueAt(0, column).getClass();
        } else {
          returnValue = Object.class;
        }
        return returnValue;
      }
    };

    final JTable table = new JTable(model);
    
    //建立可排序表物件
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
    
    //將可排序表物件設定到表中
    table.setRowSorter(sorter);
    JScrollPane pane = new JScrollPane(table);
    frame.add(pane, BorderLayout.CENTER);

    JPanel panel = new JPanel(new BorderLayout());
    JLabel label = new JLabel("Filter");
    panel.add(label, BorderLayout.WEST);
    final JTextField filterText = new JTextField("A");
    panel.add(filterText, BorderLayout.CENTER);
    frame.add(panel, BorderLayout.NORTH);
    JButton button = new JButton("Filter");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String text = filterText.getText();
        if (text.length() == 0) {
          sorter.setRowFilter(null);
        } else {
            
            //呼叫方法實現過濾內容
          sorter.setRowFilter(RowFilter.regexFilter(text));
        }
      }
    });
    frame.add(button, BorderLayout.SOUTH);
    frame.setSize(300, 250);
    frame.setVisible(true);
  }

}


例子: 實現過濾2

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class NewFilterTable extends JFrame {
  public NewFilterTable() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    String[] columns = { "ID", "Des", "Date", "Fixed" };
    Object[][] rows = { { 1, "C", new Date(), new Date() }, { 2, "G", new Date(), new Date() },
        { 5, "F", new Date(), new Date() } };

    TableModel model = new DefaultTableModel(rows, columns);
    JTable table = new JTable(model);
    final TableRowSorter<TableModel> sorter;
    sorter = new TableRowSorter<TableModel>(model);
    table.setRowSorter(sorter);
    getContentPane().add(new JScrollPane(table));

    JPanel pnl = new JPanel();
    pnl.add(new JLabel("Filter expression:"));
    final JTextField txtFE = new JTextField(25);
    pnl.add(txtFE);
    JButton btnSetFE = new JButton("Set Filter Expression");
    ActionListener al;
    al = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String expr = txtFE.getText();
        sorter.setRowFilter(RowFilter.regexFilter(expr));
        sorter.setSortKeys(null);
      }
    };
    btnSetFE.addActionListener(al);
    pnl.add(btnSetFE);
    getContentPane().add(pnl, BorderLayout.SOUTH);

    setSize(750, 150);
    setVisible(true);
  }

  public static void main(String[] args) {
    new NewFilterTable();
  }
}


例子:實現過濾與排序

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.Spring;
import javax.swing.SpringLayout;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;

public class TableFilterDemo extends JPanel {
  private boolean DEBUG = false;
  private JTable table;
  private JTextField filterText;
  private JTextField statusText;
  private TableRowSorter<MyTableModel> sorter;

  public TableFilterDemo() {
    super();
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

    // Create a table with a sorter.
    MyTableModel model = new MyTableModel();
    sorter = new TableRowSorter<MyTableModel>(model);
    table = new JTable(model);
    table.setRowSorter(sorter);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    // For the purposes of this example, better to have a single
    // selection.
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    // When selection changes, provide user with row numbers for
    // both view and model.
    table.getSelectionModel().addListSelectionListener(
        new ListSelectionListener() {
          public void valueChanged(ListSelectionEvent event) {
            int viewRow = table.getSelectedRow();
            if (viewRow < 0) {
              // Selection got filtered away.
              statusText.setText("");
            } else {
              int modelRow = table.convertRowIndexToModel(viewRow);
              statusText.setText(String.format("Selected Row in view: %d. "
                  + "Selected Row in model: %d.", viewRow, modelRow));
            }
          }
        });

    // Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);

    // Add the scroll pane to this panel.
    add(scrollPane);

    // Create a separate form for filterText and statusText
    JPanel form = new JPanel(new SpringLayout());
    JLabel l1 = new JLabel("Filter Text:", SwingConstants.TRAILING);
    form.add(l1);
    filterText = new JTextField();
    // Whenever filterText changes, invoke newFilter.
    filterText.getDocument().addDocumentListener(new DocumentListener() {
      public void changedUpdate(DocumentEvent e) {
        newFilter();
      }

      public void insertUpdate(DocumentEvent e) {
        newFilter();
      }

      public void removeUpdate(DocumentEvent e) {
        newFilter();
      }
    });
    l1.setLabelFor(filterText);
    form.add(filterText);
    JLabel l2 = new JLabel("Status:", SwingConstants.TRAILING);
    form.add(l2);
    statusText = new JTextField();
    l2.setLabelFor(statusText);
    form.add(statusText);
    SpringUtilities.makeCompactGrid(form, 2, 2, 6, 6, 6, 6);
    add(form);
  }

  /**
   * Update the row filter regular expression from the expression in the text
   * box.
   */
  private void newFilter() {
    RowFilter<MyTableModel, Object> rf = null;
    // If current expression doesn't parse, don't update.
    try {
      rf = RowFilter.regexFilter(filterText.getText(), 0);
    } catch (java.util.regex.PatternSyntaxException e) {
      return;
    }
    sorter.setRowFilter(rf);
  }

  class MyTableModel extends AbstractTableModel {
    private String[] columnNames = { "First Name", "Last Name", "Sport",
        "# of Years", "Vegetarian" };
    private Object[][] data = {
        { "Mary", "Campione", "Snowboarding", new Integer(5),
            new Boolean(false) },
        { "Alison", "Huml", "Rowing", new Integer(3), new Boolean(true) },
        { "Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false) },
        { "Sharon", "Zakhour", "Speed reading", new Integer(20),
            new Boolean(true) },
        { "Philip", "Milne", "Pool", new Integer(10), new Boolean(false) }, };

    public int getColumnCount() {
      return columnNames.length;
    }

    public int getRowCount() {
      return data.length;
    }

    public String getColumnName(int col) {
      return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
      return data[row][col];
    }

    /*
     * JTable uses this method to determine the default renderer/ editor for
     * each cell. If we didn't implement this method, then the last column would
     * contain text ("true"/"false"), rather than a check box.
     */
    public Class getColumnClass(int c) {
      return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's editable.
     */
    public boolean isCellEditable(int row, int col) {
      // Note that the data/cell address is constant,
      // no matter where the cell appears onscreen.
      if (col < 2) {
        return false;
      } else {
        return true;
      }
    }

    /*
     * Don't need to implement this method unless your table's data can change.
     */
    public void setValueAt(Object value, int row, int col) {
      if (DEBUG) {
        System.out.println("Setting value at " + row + "," + col + " to "
            + value + " (an instance of " + value.getClass() + ")");
      }

      data[row][col] = value;
      fireTableCellUpdated(row, col);

      if (DEBUG) {
        System.out.println("New value of data:");
        printDebugData();
      }
    }

    private void printDebugData() {
      int numRows = getRowCount();
      int numCols = getColumnCount();

      for (int i = 0; i < numRows; i++) {
        System.out.print("    row " + i + ":");
        for (int j = 0; j < numCols; j++) {
          System.out.print("  " + data[i][j]);
        }
        System.out.println();
      }
      System.out.println("--------------------------");
    }
  }

  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI() {
    // Create and set up the window.
    JFrame frame = new JFrame("TableFilterDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Create and set up the content pane.
    TableFilterDemo newContentPane = new TableFilterDemo();
    newContentPane.setOpaque(true); // content panes must be opaque
    frame.setContentPane(newContentPane);

    // Display the window.
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
}

class SpringUtilities {

  public static void printSizes(Component c) {
    System.out.println("minimumSize = " + c.getMinimumSize());
    System.out.println("preferredSize = " + c.getPreferredSize());
    System.out.println("maximumSize = " + c.getMaximumSize());
  }

  public static void makeGrid(Container parent, int rows, int cols,
      int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err
          .println("The first argument to makeGrid must use SpringLayout.");
      return;
    }

    Spring xPadSpring = Spring.constant(xPad);
    Spring yPadSpring = Spring.constant(yPad);
    Spring initialXSpring = Spring.constant(initialX);
    Spring initialYSpring = Spring.constant(initialY);
    int max = rows * cols;

    Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0))
        .getWidth();
    Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0))
        .getWidth();
    for (int i = 1; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent
          .getComponent(i));

      maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
      maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
    }

    // Apply the new width/height Spring. This forces all the
    // components to have the same size.
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent
          .getComponent(i));

      cons.setWidth(maxWidthSpring);
      cons.setHeight(maxHeightSpring);
    }

    // Then adjust the x/y constraints of all the cells so that they
    // are aligned in a grid.
    SpringLayout.Constraints lastCons = null;
    SpringLayout.Constraints lastRowCons = null;
    for (int i = 0; i < max; i++) {
      SpringLayout.Constraints cons = layout.getConstraints(parent
          .getComponent(i));
      if (i % cols == 0) { // start of new row
        lastRowCons = lastCons;
        cons.setX(initialXSpring);
      } else { // x position depends on previous component
        cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST),
            xPadSpring));
      }

      if (i / cols == 0) { // first row
        cons.setY(initialYSpring);
      } else { // y position depends on previous row
        cons.setY(Spring.sum(lastRowCons.getConstraint(SpringLayout.SOUTH),
            yPadSpring));
      }
      lastCons = cons;
    }

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(Spring.constant(yPad),
        lastCons.getConstraint(SpringLayout.SOUTH)));
    pCons.setConstraint(SpringLayout.EAST, Spring.sum(Spring.constant(xPad),
        lastCons.getConstraint(SpringLayout.EAST)));
  }

  /* Used by makeCompactGrid. */
  private static SpringLayout.Constraints getConstraintsForCell(int row,
      int col, Container parent, int cols) {
    SpringLayout layout = (SpringLayout) parent.getLayout();
    Component c = parent.getComponent(row * cols + col);
    return layout.getConstraints(c);
  }

  /**
   * Aligns the first <code>rows</code> * <code>cols</code> components of
   * <code>parent</code> in a grid. Each component in a column is as wide as
   * the maximum preferred width of the components in that column; height is
   * similarly determined for each row. The parent is made just big enough to
   * fit them all.
   *
   * @param rows
   *            number of rows
   * @param cols
   *            number of columns
   * @param initialX
   *            x location to start the grid at
   * @param initialY
   *            y location to start the grid at
   * @param xPad
   *            x padding between cells
   * @param yPad
   *            y padding between cells
   */
  public static void makeCompactGrid(Container parent, int rows, int cols,
      int initialX, int initialY, int xPad, int yPad) {
    SpringLayout layout;
    try {
      layout = (SpringLayout) parent.getLayout();
    } catch (ClassCastException exc) {
      System.err
          .println("The first argument to makeCompactGrid must use SpringLayout.");
      return;
    }

    // Align all cells in each column and make them the same width.
    Spring x = Spring.constant(initialX);
    for (int c = 0; c < cols; c++) {
      Spring width = Spring.constant(0);
      for (int r = 0; r < rows; r++) {
        width = Spring.max(width, getConstraintsForCell(r, c, parent, cols)
            .getWidth());
      }
      for (int r = 0; r < rows; r++) {
        SpringLayout.Constraints constraints = getConstraintsForCell(r, c,
            parent, cols);
        constraints.setX(x);
        constraints.setWidth(width);
      }
      x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
    }

    // Align all cells in each row and make them the same height.
    Spring y = Spring.constant(initialY);
    for (int r = 0; r < rows; r++) {
      Spring height = Spring.constant(0);
      for (int c = 0; c < cols; c++) {
        height = Spring.max(height, getConstraintsForCell(r, c, parent, cols)
            .getHeight());
      }
      for (int c = 0; c < cols; c++) {
        SpringLayout.Constraints constraints = getConstraintsForCell(r, c,
            parent, cols);
        constraints.setY(y);
        constraints.setHeight(height);
      }
      y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
    }

    // Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(SpringLayout.SOUTH, y);
    pCons.setConstraint(SpringLayout.EAST, x);
  }
}

相關推薦

SwingJTableJDK1.6TableRowSorter實現過濾排序功能

TableRowSorter該物件是JDK1.6中才有的,可以通過該物件實現過濾和排序等功能 例子:實現過濾 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.

cas登入換 jdk1.6 報錯handshake_failure握手失敗

cas登入換用 jdk1.6 報錯handshake_failure握手失敗 用cas程式碼搭建demo,jdk版本為1.6,結果報錯javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure。

Java 集合系列01 總體框架 (依賴JDK1.6.0_45)

Java集合是java提供的工具包,包含了常用的資料結構:集合、連結串列、佇列、棧、陣列、對映等。Java集合工具包位置是java.util.* Java集合主要可以劃分為4個部分:List列表、Set集合、Map對映、工具類(Iterator迭代器、Enumeration列舉類、Arrays和Co

Python大薈基礎花式列印99加法表!

  “ 再簡單的問題也需要智慧。” 任何知識的學習,都要問題導向,盲目學習很快會遺忘,Python作為一門語言和工具,更是如此。我們先從簡單的九九加法表開始。             &nb

連結資料庫報錯(Communications link failure)解決

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet

精通MySQL索引注重練習!

老劉是即將找工作的研究生,自學大資料開發,一路走來,感慨頗深,網上大資料的資料良莠不齊,於是想寫一份詳細的大資料開發指南。這份指南把大資料的【基礎知識】【框架分析】【原始碼理解】都用自己的話描述出來,讓夥伴自學從此不求人。大資料開發指南地址如下: github:https://github.com/Bi

.NetDll掃盲如何在VS調試已經編譯好的dll?

技術分享 操作系統 鏈接 作者 怎麽辦 框架 好的 常見 pac 什麽是Dll? DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。 例如,在 Windows 操作系統中,Comdlg32 DLL 執行與對話框有關的常見函數。因此,每個程序都可以使用該Dll中包含的功

邏輯是生物在進行思考的時候來在所思考的事物事物之間進行聯系的方法

邏輯與 事件 多少 不同的 之間 獲得 方法 為我 當我 我認為邏輯並無對錯或有無之分,只有使用者的多少之分。 如果一定要定義,我會說:邏輯是生物在進行思考的時候,用來在所思考的事物與事物之間進行聯系的方法。你可以用多種方法聯系事物,沒有哪一種是錯的。只不過當別人和你所用的

構建NetCore應用框架實戰(四):BitAdminCore框架1.0登錄功能細化及技術選型

1.0 dmi 也會 繼承 blank bit 技術選型 cor 我會 本篇承接上篇內容,如果你不小心點擊進來,建議從第一篇開始完整閱讀,文章內容繼承性連貫性。 構建NetCore應用框架之實戰篇系列 一、BitAdminCore框架1.0版本 1、1.0版本是指

一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少 遞歸算法實現。//斐波那契數列

write pub else ole 位數 return spa sta ati 1 public class MainClass 2 { 3 public static void Main() 4 { 5 Console.WriteLine(F

UML工具(Win10無法使用VGAPlayer播放asf格式VGA課件的解決辦法)

      軟體工程學習完之後的專案是UML,在學習這個UML視訊時發現文件裡有兩個檔案,一個是asf格式的,一個是vga格式的,在經過志帥師哥的指導後才曉得原來是要兩個檔案一起開啟看的,但當下載下來VGAPlayer程式後發現我下載的播放器無法使用,然後就從師哥和小夥

Python好的語法更少的程式碼實現同樣的功能

  前言 今天給大家分享一些Python好用的語法糖,用更少的程式碼實現同樣的功能,而且還很優雅。 1. if python沒有三目運算子,我挺苦惱的,比如把兩個整數較大的那個複製給一個變數,有三目運算子的語言會這樣寫:   後來發現Pytho

基於Oracle資料庫SSM框架和easyUI實現分頁查詢操作

基於Oracle資料庫,用SSM框架和easyUI來實現分頁查詢操作: 第一步,首先擬定好資料庫中的表,在eclipse裡面用maver專案搭配好SSM框架(其中關於SSM框架的pom.xml,spring-mvc.xml,spring-bean.xml,以及webapp目錄下的WEB-INF

VC++6.0程式設計實現漢字拼音查詢

{ 4    m_List1.ResetContent(); 5    UpdateData(); 6    m_Edit1.TrimLeft(); 7    m_Edit1.TrimRight(); 8    if(m_Edit1.IsEmpty())    return; 9    UINT i;10  

jdk1.6垃圾收集器

圖1展示了1.6中提供的6種作用於不同年代的收集器,兩個收集器之間存在連線的話就說明它們可以搭配使用。在介紹著些收集器之前,我們先明確一個觀點:沒有最好的收集器,也沒有萬能的收集器,只有最合適的收集器。 1.Serial收集器 單執行緒收集器,收集時會暫停所有工作執行緒(

企業IT架構轉型阿裏巴巴臺戰略思想架構實戰

的人 正文 pan ima 企業 tar target 架構 bubuko 前言:   晚上11點多閑來無事,打開QQ技術群,發現有關 ‘中心化與引擎化‘ 的話題,本著學習的心態向大佬咨詢,大佬推薦一本書,我大概看了有四分之一的樣子,對於我這種對架構迷茫的人來說,如魚得水

LSTM的備胎卷積處理時間序列——TCN因果卷積(理論+Python實踐)

## 什麼是TCN TCN全稱Temporal Convolutional Network,時序卷積網路,是在2018年提出的一個卷積模型,但是可以用來處理時間序列。 ## 卷積如何處理時間序列 時間序列預測,最容易想到的就是那個馬爾可夫模型: $$P(y_k|x_k,x_{k-1},...,x_1)$$

JDK1.8HashMap實現

替換 應該 初始化 第一個元素 擴容 實現 1.8 put 相同 JDK1.8中的HashMap實現跟JDK1.7中的實現有很大差別。下面分析JDK1.8中的實現,主要看put和get方法。 構造方法的時候並沒有初始化,而是在第一次put的時候初始化 put

前端框架Vue.js——vue-i18n vue項目如何實現國際化

客戶端 效果 font 免費下載 賦值 視頻 安裝 定時 unp 每天學習一點點 編程PDF電子書、視頻教程免費下載:http://www.shitanlife.com/code 一、前言 趁著10月的最後一天,來寫一篇關於前端國際化的實踐型博客。國際化應該都

java常見練習實現陣列快速排序功能

題目:用java實現陣列快速排序功能 首先要實現快速排序的話需要先得到數組裡的每一個數字,先遍歷這個陣列,即: 第一步 int[] arr = {2,1,5,4,7,9}; for (int i = 0; i < arr.length; i++) { {