Java Swing JTable
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*");
更多建议: