1.JTable与TableModel
1.TableModel与JTable的关系:
TableModel它是一个接口,
javax.swing.JTable table=new javax.swing.JTable();
table.setModel(new 实现了TableModel接口的类);
2.TableModel实践:
首先,我们编写一个TableModel的实现类如下:
import javax.swing.event.TableModelListener;
/**自定义的tableModel实现类*/
publicclass MyTableModelV1implementsjavax.swing.table.TableModel{
//多少行:
publicint getRowCount(){
return 10;
}
//多少列
publicint getColumnCount(){
return 5;
}
//取得列名
public String getColumnName(int columnIndex){
return " 第"+columnIndex+"列名";
}
//每一列的数据类型:我们这里显示的都是String型
public Class>getColumnClass(int columnIndex){
return String.class;
}
//指定的单元格是否可从界面上编辑
publicboolean isCellEditable(int rowIndex, int columnIndex){
if(columnIndex==0){
return false;
}
return true;
}
//取得指定单元格的值
public Object getValueAt(int rowIndex, int columnIndex){
return rowIndex+"--"+columnIndex;
}
//从表格界面上改变了某个单元格的值后会调用这个方法
publicvoid setValueAt(Object aValue, int rowIndex, int columnIndex){
String s="Change at: "+rowIndex+"--- "+columnIndex+" newValue: "+aValue;
System.out.println(s);
}
//这两个接口方法暂无用
publicvoid addTableModelListener(TableModelListenerl){}
publicvoidremoveTableModelListener(TableModelListener l){}
}
用以显示这个Model的Jtable和界面代码如下:
//TableModel应用测试
publicclass TestJTable {
//程序入口
publicstatic void main(String[] args) {
javax.swing.JFrame jf=new javax.swing.JFrame("表格测试");
jf.setSize(300,400);
java.awt.FlowLayout fl=new java.awt.FlowLayout();
jf.setLayout(fl);
//1.创建一个默认的简单表格对像:
javax.swing.JTable table=new javax.swing.JTable();
//2.创建我们自定义的TableModel对象
MyTableModelV1tm=new MyTableModelV1();
//3.将其设置为Table的Model
table.setModel(tm);
jf.add(table);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
}
}
3.使用JTable+TableModel展示java中的数据对象:
首先,我们需要编写自己的TableModel类,即实现了JtableModel接口的类,这个实现类使用装有UserInfo的List对象,负责将列表中的用户对象信息提供给Jtable对象显示:
import java.util.List;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
/**
*用以在JTable中显示UserInfo对象的TableModel实现类
* @author: 蓝杰
*/
publicclass UserInfoTableModel implements TableModel{
privateList userList;
//要显示的UserInfo对象列表
//创建模型对象时,必须传入要显示的UserInfo对象列表
public UserInfoTableModel(List userList){
this.userList=userList;
}
//得到行数:列表中有几个UserInfo对象,就显示几行
publicint getRowCount(){
return userList.size();
}
//得到列数,UserInfo对象的每个属性是一列,id,name,age,共3列
publicint getColumnCount(){
return 3;
}
//指定某列的类型:暂时都是字符串类型,
public Class> getColumnClass(int columnIndex){
return String.class;
}
//得到指定单元格的值:第几行,就是列表中的第几个UserInfo对象
public Object getValueAt(int rowIndex, int columnIndex){
// 第几行,就是列表中的第几个UserInfo对象
UserInfo user=userList.get(rowIndex);
if(columnIndex==0){//第一列是UserInfo对象的id值
return ""+user.getId();
}elseif(columnIndex==1){//第二列是name属性值
return user.getName();
}elseif(columnIndex==2){//第二列是age值
return ""+user.getAge();
}else{//除非设计时逻辑错误,否则不会到这里
【java|高级Swing界面JTable编程】return "出错!";
}
}
//界面数据有变化时,模型对象的这个方法会被调用,暂时弹出说明框
publicvoid setValueAt(Object aValue, int rowIndex, int columnIndex){
Stringinfo=rowIndex+"行"+columnIndex+"列的值改变: "+aValue.toString();
javax.swing.JOptionPane.showMessageDialog(null,info);
}
//指定某单元格是否可编辑:第一列不可编缉,第一列是ID,是每个对象的唯一识别号
publicboolean isCellEditable(int rowIndex, int columnIndex){
if(columnIndex!=0){
returntrue;
}
returnfalse;
}
//取每一列的列名
public String getColumnName(intcolumnIndex){
if(columnIndex==0){//第一列是UserInfo对象的id值
return "序号";
}
elseif(columnIndex==1){
//
第二列是
name
属性值
return "姓名";
}elseif(columnIndex==2){//第二列是age值
return "年令";
}else{//除非设计时逻辑错误,否则不会到这里
return "出错!";
}
}
//添加和移除监听器的方法暂不用,写为空的
publicvoid addTableModelListener(TableModelListenerl){}
publicvoid removeTableModelListener(TableModelListenerl){}
}
接下来,我们创建界面和JTable对象,使用我们新编写的UserInfoTableModel对象显示用户数据。
/**
*JTable和TableModel使用示例 v1
* @author: 蓝杰
*/
publicclass UserTableUIV1 {
//程序入口
publicstatic void main(String[] args) {
UserTableUIV1 lu=new UserTableUIV1();
lu.setupUI();
}
//显示主界面
publicvoid setupUI(){
javax.swing.JFramejf=new javax.swing.JFrame("JTable-TableModel示例");
jf.setSize(300,200);
java.awt.FlowLayout fl=new java.awt.FlowLayout();
jf.setLayout(fl);
//创建一个表格对象
final javax.swing.JTabletable=new javax.swing.JTable();
//得到要显示的用户列表对象:
ListuserList=getUserList();
//创建我们实现的TableModel对象,创建时要传入用户列表对象
UserInfoTableModel tm=new UserInfoTableModel(userList);
table.setModel(tm);
//将模型设给表格
jf.add(table);
jf.setDefaultCloseOperation(3);
jf.setVisible(true);
}
//模拟生成用户对象列表
private List getUserList(){
List uList=new ArrayList();
for(int i=0;
i<100;
i++){
UserInfo user=new UserInfo();
user.setId(i+1);
user.setAge(20+i);
user.setName("用户"+i);
uList.add(user);
}
return uList;
}
}
2.JTable展示方式的美化:
1.设置表格的宽度和高度:
如下代码示例:
//设每一列的宽度
for(int i=0;
i
table.getColumnModel().getColumn(i).setPreferredWidth(40);
}
table.setRowHeight(20);
//
设定每一列的高度
2.要显示表头:
要将Jtable放到滚动板(javax.swing.JscrollPane)上,并设定其大小:
效果图如下:
//将表格对象放到滚动面板对象上
javax.swing.JScrollPane scrollPane = new JScrollPane(table);
//设定表格在面板上的大小
table.setPreferredScrollableViewportSize(new Dimension(200, 70));
//超出大小后,JScrollPane自动出现滚动条
scrollPane.setAutoscrolls(true);
jf.add(scrollPane);
//
将
scrollPane
对象加到界面上
3.新加列,将列设为下拉框:
代码示例:
4.表格排序:
排序要实现的功能是,当单击表头时,所在列会自动排序,代码段如下:
RowSorter sorter = new TableRowSorter(table.getModel());
table.setRowSorter(sorter);
|
3. JTable事件响应和项目设想 JTable事件响应是非常简单,如下代码片断所示,我们可以给表格加上一个鼠标事件监听器,当鼠标单击表格(上的某一个单元格)时,弹出单元格所在的行表和单元格中的值:
//给table加上一个鼠标事件监听器对象
table.addMouseListener(new java.awt.event.MouseAdapter(){
publicvoid mouseClicked(MouseEvent e) {//仅当鼠标单击时响应
//得到选中的行列的索引值
int r= table.getSelectedRow();
int c= table.getSelectedColumn();
//得到选中的单元格的值,表格中都是字符串
Object value= https://www.it610.com/article/table.getValueAt(r, c);
String info=r+"行"+c+"列值 : "+value.toString();
javax.swing.JOptionPane.showMessageDialog(null,info);
}
});
|
效果如下图示:
表格某个单元格的值被编辑后,当焦点移出时,表格会自动调用自己的模型的setValueAt方法,传入改变后的值和行列索引,这个功能也可被利用来做事件响应。
JTable和JTree是Swing界面应用中两种常用的高级组件,如果我们能将JTree和JTable的应用组合起来,完善我们的《日志管理系统》,使用JTree导航,使用JTable展示数据,如下图示:
推荐阅读