javax.swing
类 JTable
java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JTable
常用构造方法:
JTable() 构造一个默认的 JTable ,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。 |
JTable(int numRows, int numColumns) 使用 DefaultTableModel 构造具有 numRows 行和 numColumns 列个空单元格的 JTable 。 |
JTable(TableModel dm)
构造一个 JTable
,使用数据模型 dm
、默认的列模型和默认的选择模型对其进行初始化。
我觉得最后一种构造方法最好,原因其实很简单,就因为这个构造方法可以让自己定义的JTable类对象有更多的功能
关于TableModel:
void | addTableModelListener(TableModelListener l) 每当数据模型发生更改时,就将一个侦听器添加到被通知的列表中。 |
Class<?> | getColumnClass(int columnIndex) 针对列中所有的单元格值,返回最具体的超类。 |
int | getColumnCount() 返回该模型中的列数。 |
String | getColumnName(int columnIndex) 返回 columnIndex 位置的列的名称。 |
int | getRowCount() 返回该模型中的行数。 |
Object | getValueAt(int rowIndex, int columnIndex) 返回 columnIndex 和 rowIndex 位置的单元格值。 |
boolean | isCellEditable(int rowIndex, int columnIndex) 如果 rowIndex 和 columnIndex 位置的单元格是可编辑的,则返回 true。 |
void | removeTableModelListener(TableModelListener l) 每当数据模型发生更改时,就从被通知的列表中移除一个侦听器。 |
void | setValueAt(Object aValue, int rowIndex, int columnIndex) 将 columnIndex 和 rowIndex 位置的单元格中的值设置为 aValue 。 |
TableModel是一个接口,所以要使用它的话得全部实现其方法。
我们更常用的是TableModel的一个实现类AbstractTableModel,需要的方法只需从写即可。
如果table太大的话,我们可以把JTable对象放在一个JScrollPane里。
JTable的getColumnName方法可以设置表头信息,但有一个有趣的现象:表头信息在将JTable对象放在JScrollPane里才能显示(当然该有其他的方法让表头信息显示,但会复杂)。如果不做处理的话,表头信息是看不到的。
在做服务端的时候,我们需要一个表格(JTable)来将客户端信息表示出来,但是,要实现“一个客户端上线,表格增加一条记录”的功能,那么可以用这样的方法:
在TableModel里定义一个int row记录行数。
然后定义一个方法addRow()用来增加一行。
但之中有几点要注意的:
1.用JTable显示客户端信息的时候,要用一个队列保存所有客户端的信息,然后再setValueAt方法里用
public Object getValueAt(int rowIndex, int columnIndex) {
// 第几行,就是列表中的第几个UserInfo对象
if (ChatTools.userInfoList.size() == 0) {
return null;
}
if (rowIndex < ChatTools.userInfoList.size()) {
UserInfo user = ChatTools.userInfoList.get(rowIndex);
if (columnIndex == 0) {
return user.getName();
}
if (columnIndex == 1) {
return user.getPwd();
} else {
return "出错!";
}
}
return null;
}
这样就可以将所有客户端的信息显示到表格上。
也许,有一个细节我们会忘记,那就是刷新表格,我尝试了很多种方法,最后管用的只有updateUI()方法,推荐使用。
当然还可以给表格添加监听,这就不扯了,又到事件监听方面了。