在JTable类中除了默认的构造方法之外,还提供了利用指定表格列名数组和表格数据数组创建表格的构造方法,如下:
JTable(Object[][] rowData,Object[] columnNames)
使用表格时,一般将其添加到滚动面板中,然后将滚动面板加到相应的位置。
在JTable中还提供了利用指定表格的列名向量和表格数据向量创造表格的构造方法,如下: JTable(Vector rowData,Vector columnNames)
在使用表格时,有时候不需要使用滚动条,就可以在窗体中显示整个表格,在这种情况下,也可以直接将表格添加到相应的容器中。
注意:如果是将表格添加到相应的容器中,则需要通过JTable类的 getTableHeader()
方法获得JTableHeader类的对象,然后再将该对象添加到容器的相应位置,否则表格将没有列名。
简单表格案例:
package view.flight; import javax.swing.*; import java.awt.*; /** * @author: 我的袜子都是洞 */ public class TestGui extends JFrame { // 列名 String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"}; // 表格具体数据 String[][] columnDate = new String[][]{ {"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"}, {"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"}, {"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"}, {"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"}, }; JTable table = new JTable(columnDate, columnName); TestGui(String title) { super(title); init(); setComponent (); addComponent(); addListener(); setVisible(true); } private void init () { setSize(600, 400); // 设置窗口位置居中 setLocationRelativeTo(null); // 设置布局 setLayout(new BorderLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void setComponent () { // 设置第一列宽度为40 table.getColumnModel().getColumn(0).setPreferredWidth(40); // 设置第二列宽度为120 table.getColumnModel().getColumn(1).setPreferredWidth(120); } private void addComponent () { // 使用srcllpane会自动显示列名 JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); } private void addListener () { } public static void main(String[] args) { new TestGui("JTable演示"); } } 复制代码
表格创建之后,还需要对其进行一系列的定义,以便适合于具体的使用情况。默认情况下双击单元格便可对其编辑,如果不需要此功能,可以通过重构JTable类的 isCellEditable(int row,int column)
方法实现该方法返回boolean型值true,表示可以编辑,否则返回false则表示不可编辑。
可通过JTableHeader类的s etReorderingAllowed(boolean reorderAllowed)
方法设置表格是否支持重新排列功能,该方法返回boolean型值true表示支持,返回false表示不支持。
默认情况下,单元格中的内容左侧显示,如果需要居中显示,可通过重构JTable类的 getDefaultRenderer(Class<?> columnClass)
方法来实现。 重构的代码:
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) { DefaultTableCellRenderer cr=(DefaultTableCellRenderer)super.getDefaultRenderer(columnClass); cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER); return cr; } 复制代码
JTable类的用来定义表格的常用方法
setRowHeight(int rowHeight) setRowSelectionAllowed(boolean sa) setSelectionMode(int sm) setSelectionBackground(Color cr) setSelectionForeground(Color fc) setAutoResizeMode(int mode)
在利用 setSelectionMode(int sm)
方法设置表格行的选择模式时,它的入口参数从ListSelectionModel的静态常量中选择。如下:
在利用 setAutoResizeMode(int mode)
方法设置表格的自动调整模式时,它的入口参数从JTable类的静态常量中选择。
注意:表格的自动调整模式,就是在调整表格的某一列的宽度时,表格采用何种方式保持其总宽度不变。
在编写应用程序时,经常需要获得表格的一些信息,如下是JTable类中的三个经常用来获得表格信息的方法。
getRowCount() getColumnCount() getColumnName(int column)
JTable类中经常用来操纵表格选中行的方法如下:
setRowSelectionInterval(int from,int to)
:选中行索引从from到to的所有行(包括索引为from到to的行) addRowSelectionInterval(int from,int to)
:将行索引从from到to的所有行追加为表格的选中行 isRowSelected(int row)
:查看行索引为row的行是否被选中 selectAll()
:选中表格中的所有行 clearSelection()
:取消所有选中行的选择状态 getSelectedRowCount()
:得到选中行的数量,返回值为int型,如果没有被选中的行,则返回-1 getSelectedRow()
:得到被选中的行中最小的索引值,返回值为int型,如果没有被选中的行,则返回-1 - getSelectedRows()
:获得所有被选中行的索引值,返回值为int数组 接口TableModel定义了一个表格模型,抽象类AbstracTableModel实现了TableModel接口的大部分方法,只有以下3个抽象方法没有实现。
public int getRowCount() public int getColumnCount() public Object getValueAt(int rowIndex,int columnIndex)
通过继承AbstractTableModel可以实现上面的3个抽象方法可以创建自己的表格模型类。DefaultTableModel类便是由Swing类提供的继承了AbstractTableModel类并实现了上面3个抽象方法的表格模型类。
从JDK1.6开始,提供了对表格进行排序的功能。通过JTable类的 setRowSorter(RowSorter<? extends TableModel> sorter)
方法可以为表格设置排序器。TableRowSorter类是由Swing提供的排序类,为表格设置排序器的代码如下:
DefaultTableModel tableModel=new DefaultTableModel(); JTable table=new JTable(tableModel); table.setRowSorter(new TableRowSorter(tableModel)); 复制代码
在使用表格排序器时,通常需要为其设置表格模型,一种方法是通过构造方法 TableRowSorter(TableModel model)
,另一种方法是通过 setModel(TableModel model)
方法为表格排序器设置表格模型。
维护表格模型
使用表格时,需要经常对表格中的内容进行维护,如向表格中添加新的数据行、修改表格中某一单元格的值、从表格中删除数据行等,这些操作都可以通过维护表格模型来完成。
在向表格模型中添加新的数据行时有两种情况:一种是添加到表格模型的尾部,另一种是添加到表格模型指定的索引处,分别由 addRow(Object[] rowData)
和 insertRow(int row,Object[] rowData)
或 addRow(Vector rowData)
和 insertRow(int row,Vector rowData)
方法实现。
如果需要修改表格模型中某一个单元格的数据,可以通过方法 setValueAt(Object aValue,int row,int column)
完成,其中aValue就是修改后的值,可以通过 getValueAt(int row,int column)
获得单元格的值,该方法返回Object型。
如果需要删除表格模型中某一行的数据,可以通过方法 removeRow(int row)
来完成,其中row为欲要删除行的索引。
使用TableModel模型案例:
import javax.swing.*; import javax.swing.table.AbstractTableModel; import java.awt.*; /** * @author: 我的袜子都是洞 */ public class TestGui extends JFrame { JTable table = new JTable(new FlightTableModel()); TestGui(String title) { super(title); init(); setComponent (); addComponent(); addListener(); setVisible(true); } private void init () { setSize(600, 400); // 设置窗口位置居中 setLocationRelativeTo(null); // 设置布局 setLayout(new BorderLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void setComponent () { // 设置第一列宽度为40 table.getColumnModel().getColumn(0).setPreferredWidth(40); // 设置第二列宽度为120 table.getColumnModel().getColumn(1).setPreferredWidth(120); } private void addComponent () { // 使用srcllpane会自动显示列名 JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); } private void addListener () { } public static void main(String[] args) { new TestGui("JTable演示"); } } class FlightTableModel extends AbstractTableModel { // 列名 String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"}; // 表格具体数据 String[][] flightDate = new String[][]{ {"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"}, {"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"}, {"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"}, {"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"}, }; /** * 返回一共多少行 */ @Override public int getRowCount() { return flightDate.length; } /** * 返回一共多少列 */ @Override public int getColumnCount() { return columnName.length; } /** * 返回每一个单元格的值 */ @Override public Object getValueAt(int rowIndex, int columnIndex) { return flightDate[rowIndex][columnIndex]; } /** * 获取每一列的名称 */ @Override public String getColumnName(int column) { return columnName[column]; } /** * 单元格是否可以修改 */ @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } } 复制代码
效果:
通过监听选中单元格获取对应数据的实例:
import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import java.awt.*; /** * @author: 我的袜子都是洞 */ public class TestGui extends JFrame { FlightTableModel flight = new FlightTableModel(); JTable table = new JTable(flight); TestGui(String title) { super(title); init(); setComponent (); addComponent(); addListener(); setVisible(true); } private void init () { setSize(600, 400); // 设置窗口位置居中 setLocationRelativeTo(null); // 设置布局 setLayout(new BorderLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void setComponent () { // 设置第一列宽度为40 table.getColumnModel().getColumn(0).setPreferredWidth(40); // 设置第二列宽度为120 table.getColumnModel().getColumn(1).setPreferredWidth(120); } private void addComponent () { // 使用srcllpane会自动显示列名 JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); } private void addListener () { // selection监听器监听表格哪行被选中 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { // 被选中的行 int row = table.getSelectedRow(); String str = (String)flight.getValueAt(row,0); System.out.println("选中的行号是:"+row+",航班号是:"+str); } }); } public static void main(String[] args) { new TestGui("JTable演示"); } } class FlightTableModel extends AbstractTableModel { // 列名 String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"}; // 表格具体数据 String[][] flightDate = new String[][]{ {"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"}, {"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"}, {"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"}, {"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"}, }; /** * 返回一共多少行 */ @Override public int getRowCount() { return flightDate.length; } /** * 返回一共多少列 */ @Override public int getColumnCount() { return columnName.length; } /** * 返回每一个单元格的值 */ @Override public Object getValueAt(int rowIndex, int columnIndex) { return flightDate[rowIndex][columnIndex]; } /** * 获取每一列的名称 */ @Override public String getColumnName(int column) { return columnName[column]; } /** * 单元格是否可以修改 */ @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } } 复制代码
关键部分:
// selection监听器监听表格哪行被选中 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { // 被选中的行 int row = table.getSelectedRow(); String str = (String)flight.getValueAt(row,0); System.out.println("选中的行号是:"+row+",航班号是:"+str); } }); 复制代码
获取到的结果图: 窗口图:
数据: