Java Swing JTable

2018-01-09 19:23 更新

Java Swing教程 - Java Swing JTable


JTable使用行和列来显示数据。

JTable不存储数据。 它只显示数据。

JTable使用一个模型来存储数据,列数和行数。

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

DefaultTableModel类是TableModel接口的实现。

当我们使用JTable类的默认构造函数时,Java会将DefaultTableModel类的实例设置为其模型。

如果我们要添加或删除列/行,我们必须使用它的模型。 我们可以使用它的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);

要设置表中单元格的值,请使用表的模型或表的setValueAt(Object data,int row,int column)方法在其单元格中设置值。

以下代码在表的模型中设置(0,0)的值。

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

在表中设置(0,0)的值。与使用表的模型设置值相同

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

为了支持滚动,我们需要将表添加到JScrollPane。

列标题的标签设置为A,B和C,我们可以双击任何单元格开始编辑单元格中的值。

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

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

我们可以使用其model类的removeRow(int row)方法从JTable中删除一行。

要使用模型的setColumnIdentifiers()方法为列标题设置自定义标签,如下所示:

// 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);

我们可以创建一个有两行和三列的JTable,如下所示:

JTable table  = new JTable(2, 3);

JTable的其他两个构造函数允许我们设置行数和列数,以及数据。

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

下面的代码显示了如何使用上面的构造函数。

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类实现了TableModel接口。 它为TableModel接口的方法提供了一个空实现。

我们必须在自定义表模型类中至少实现以下三个方法获得只读表模型:

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

DefaultTableModel类继承自AbstractTableModel类。它为TableModel接口中的所有方法提供了一个默认实现。

它使用向量的向量来存储表的数据。

下面的代码实现了一个简单的表模型,使用一个数组数组来存储数据。

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);
  }
}


分类

要添加数据排序功能,请调用setAutoCreateRowSorter(true)。

要添加数据排序功能,请调用setAutoCreateRowSorter(true)。...

我们可以使用行过滤器,它将根据一些标准隐藏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);
  }
}

过滤

我们可以使用行过滤器,它将根据一些标准隐藏JTable中的行。...

RowFilter有几个返回RowFilter对象的静态方法我们可以直接使用RowSorter对象。

以下代码显示了如何创建行过滤器:

创建只显示开始行的过滤器  在第二列中的“汤姆"(列索引= 1)

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

要创建只显示具有的行的过滤器  在其第三列中的“女性"值(列索引= 2)

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

要创建一个过滤器,只显示具有第3,  第5和第7列以“A"

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

创建只显示具有任何行的过滤器  列的值以“A"开头的列

RowFilter anyFilter2  = RowFilter.regexFilter("^A*");
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号