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接口定義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*");
更多建議: