Java Swing JTable

2018-01-09 19:23 更新

Java Swing教程 - Java Swing JTable


JTable使用行和列來顯示數(shù)據(jù)。

JTable不存儲數(shù)據(jù)。 它只顯示數(shù)據(jù)。

JTable使用一個模型來存儲數(shù)據(jù),列數(shù)和行數(shù)。

TableModel接口的實例表示JTable的模型。

DefaultTableModel類是TableModel接口的實現(xiàn)。

當我們使用JTable類的默認構(gòu)造函數(shù)時,Java會將DefaultTableModel類的實例設(shè)置為其模型。

如果我們要添加或刪除列/行,我們必須使用它的模型。 我們可以使用它的getModel()來獲得JTable的模型的引用,方法。

讓我們向表中添加兩行和三列。

DefaultTableModel tableModel  = (DefaultTableModel)table.getModel();

// Set  the   number of  rows  to 2 
tableModel.setRowCount(2);

// Set  the   number of  columns  to 3 
tableModel.setColumnCount(3);

要設(shè)置表中單元格的值,請使用表的模型或表的setValueAt(Object data,int row,int column)方法在其單元格中設(shè)置值。

以下代碼在表的模型中設(shè)置(0,0)的值。

tableModel.setValueAt("new value",  0, 0);

在表中設(shè)置(0,0)的值。與使用表的模型設(shè)置值相同

table.setValueAt("new value", 0, 0);

為了支持滾動,我們需要將表添加到JScrollPane。

列標題的標簽設(shè)置為A,B和C,我們可以雙擊任何單元格開始編輯單元格中的值。

要獲取單元格中的值,請使用表的模型或JTable的getValueAt(int row,int column)方法。

我們可以使用DefaultTableModel類的addColumn()和addRow()方法向JTable添加更多的列或行。

我們可以使用其model類的removeRow(int row)方法從JTable中刪除一行。

要使用模型的setColumnIdentifiers()方法為列標題設(shè)置自定義標簽,如下所示:

// Store the   column  headers in an  array
Object[] columnHeaderLabels = new Object[]{"Name", "DOB", "Gender"};

// Set  the   column  headers for the   table using its  model tableModel.setColumnIdentifiers(columnHeaderLabels);

我們可以創(chuàng)建一個有兩行和三列的JTable,如下所示:

JTable table  = new JTable(2, 3);

JTable的其他兩個構(gòu)造函數(shù)允許我們設(shè)置行數(shù)和列數(shù),以及數(shù)據(jù)。

JTable(Object[][] rowData,   Object[] columnNames)
JTable(Vector rowData,   Vector   columnNames)

下面的代碼顯示了如何使用上面的構(gòu)造函數(shù)。

Object[] columnNames = {"ID", "Name",  "Gender"  }  ;

Object[][] rowData  = new Object[][]  {
    {new Integer(1), "Tom", "Male"  },
    {new Integer(2), "Jane", "Female"}
};

// Create a  JTable with  the   data and  the   column  headers
JTable table  = new JTable(rowData,  columnNames);


TableModel

TableModel接口定義JTable的模型。這里是TableModel接口的聲明:

public interface  TableModel{
    public int  getRowCount();
    public int  getColumnCount();
    public String getColumnName(int  columnIndex);
    public Class<?>   getColumnClass(int  columnIndex);
    public  boolean isCellEditable(int rowIndex, int  columnIndex);
    public Object getValueAt(int rowIndex, int  columnIndex);
    public void  setValueAt(Object aValue, int  rowIndex, int  columnIndex);
    public void  addTableModelListener(TableModelListener l);
    public void  removeTableModelListener(TableModelListener l);
}

AbstractTableModel類實現(xiàn)了TableModel接口。 它為TableModel接口的方法提供了一個空實現(xiàn)。

我們必須在自定義表模型類中至少實現(xiàn)以下三個方法獲得只讀表模型:

public int  getRowCount();
public int  getColumnCount();
public Object getValueAt(int row,  int  column);

DefaultTableModel類繼承自AbstractTableModel類。它為TableModel接口中的所有方法提供了一個默認實現(xiàn)。

它使用向量的向量來存儲表的數(shù)據(jù)。

下面的代碼實現(xiàn)了一個簡單的表模型,使用一個數(shù)組數(shù)組來存儲數(shù)據(jù)。

import java.awt.BorderLayout;
import java.awt.Container;
/*from  w  ww  . j  a  v  a2s .c  o  m*/
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

class SimpleTableModel extends AbstractTableModel {
  private Object[][] data = {};
  private String[] columnNames = { "ID", "Name", "Gender" };
  private Class[] columnClass = { Integer.class, String.class, String.class };
  private Object[][] rowData = new Object[][] {
      { new Integer(1), "Tom", "Male" },
      { new Integer(2), "Jack", "Female" } };

  public SimpleTableModel() {
  }

  @Override
  public int getRowCount() {
    return rowData.length;
  }

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

  @Override
  public String getColumnName(int columnIndex) {
    return columnNames[columnIndex];
  }

  @Override
  public Class getColumnClass(int columnIndex) {
    return columnClass[columnIndex];
  }

  @Override
  public boolean isCellEditable(int rowIndex, int columnIndex) {
    boolean isEditable = true;
    if (columnIndex == 0) {
      isEditable = false; // Make the ID column non-editable
    }
    return isEditable;
  }

  @Override
  public Object getValueAt(int rowIndex, int columnIndex) {
    return rowData[rowIndex][columnIndex];
  }

  @Override
  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    rowData[rowIndex][columnIndex] = aValue;
  }
}

public class Main extends JFrame {
  public Main() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    JTable table  = new JTable(new SimpleTableModel());

    Container contentPane = this.getContentPane();
    contentPane.add(new JScrollPane(table), BorderLayout.CENTER);
  }

  public static void main(String[] args) {
    Main bf = new Main();
    bf.pack();
    bf.setVisible(true);
  }
}


分類

要添加數(shù)據(jù)排序功能,請調(diào)用setAutoCreateRowSorter(true)。

要添加數(shù)據(jù)排序功能,請調(diào)用setAutoCreateRowSorter(true)。...

我們可以使用行過濾器,它將根據(jù)一些標準隱藏JTable中的行。

import java.awt.BorderLayout;
import java.awt.Container;
/*from ww  w . j  av a2 s . com*/
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;

class SimpleTableModel extends AbstractTableModel {
  private Object[][] data = {};
  private String[] columnNames = { "ID", "Name", "Gender" };
  private Class[] columnClass = { Integer.class, String.class, String.class };
  private Object[][] rowData = new Object[][] {
      { new Integer(1), "Tom", "Male" }, { new Integer(2), "Jack", "Female" } };

  public SimpleTableModel() {
  }

  @Override
  public int getRowCount() {
    return rowData.length;
  }

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

  @Override
  public String getColumnName(int columnIndex) {
    return columnNames[columnIndex];
  }

  @Override
  public Class getColumnClass(int columnIndex) {
    return columnClass[columnIndex];
  }

  @Override
  public boolean isCellEditable(int rowIndex, int columnIndex) {
    boolean isEditable = true;
    if (columnIndex == 0) {
      isEditable = false; // Make the ID column non-editable
    }
    return isEditable;
  }

  @Override
  public Object getValueAt(int rowIndex, int columnIndex) {
    return rowData[rowIndex][columnIndex];
  }

  @Override
  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    rowData[rowIndex][columnIndex] = aValue;
  }
}

public class Main extends JFrame {
  public Main() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    JTable table = new JTable(new SimpleTableModel());

    TableRowSorter sorter = new TableRowSorter(table.getModel());
    table.setRowSorter(sorter);

    RowFilter<SimpleTableModel, Integer> IDFilter = new RowFilter<SimpleTableModel, Integer>() {
      @Override
      public boolean include(
          Entry<? extends SimpleTableModel, ? extends Integer> entry) {
        SimpleTableModel model = entry.getModel();
        int rowIndex = entry.getIdentifier().intValue();
        Integer ID = (Integer) model.getValueAt(rowIndex, 0);
        if (ID.intValue() <= 100) {
          return false; // Do not show rows with an ID <= 100
        }
        return true;
      }
    };

    sorter.setRowFilter(IDFilter);

    Container contentPane = this.getContentPane();
    contentPane.add(new JScrollPane(table), BorderLayout.CENTER);
  }

  public static void main(String[] args) {
    Main bf = new Main();
    bf.pack();
    bf.setVisible(true);
  }
}

過濾

我們可以使用行過濾器,它將根據(jù)一些標準隱藏JTable中的行。...

RowFilter有幾個返回RowFilter對象的靜態(tài)方法我們可以直接使用RowSorter對象。

以下代碼顯示了如何創(chuàng)建行過濾器:

創(chuàng)建只顯示開始行的過濾器  在第二列中的“湯姆"(列索引= 1)

RowFilter nameFilter  = RowFilter.regexFilter("^Tom*", 1);

要創(chuàng)建只顯示具有的行的過濾器  在其第三列中的“女性"值(列索引= 2)

RowFilter genderFilter  = RowFilter.regexFilter("^Female$", 2);

要創(chuàng)建一個過濾器,只顯示具有第3,  第5和第7列以“A"

RowFilter anyFilter1  = RowFilter.regexFilter("^A*", 3, 5, 7);

創(chuàng)建只顯示具有任何行的過濾器  列的值以“A"開頭的列

RowFilter anyFilter2  = RowFilter.regexFilter("^A*");
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號