Java中的JTable笔记.docx
《Java中的JTable笔记.docx》由会员分享,可在线阅读,更多相关《Java中的JTable笔记.docx(11页珍藏版)》请在冰豆网上搜索。
Java中的JTable笔记
JTable
用来创建表格
表格通常需要显示在滚动面板中,否则表格不会显示列标题。
构造方法:
1)JTable():
创建一个默认的构造方法,无初始化数据
2)JTable(Object[][]rowData,Object[]columnNames):
以二维数组rowData中的元素作为单元格中显示的数据,以一维数组columnNames中的元素值作为列名创建一个表格
例:
JTabletable=newJTable(newString[][]{
{"1","张飞","110"},
{"2","刘备","112"},
{"3","华佗","114"},
{"4","关羽","119"}
},newString[]{"学号","姓名","电话"});
JScrollPanejsp=newJScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
添加到滚动面板的语句也可以这样写,这样滚动条不设置有默认AS_NEEDED
JScrollPanejsp=newJScrollPane();
jsp.setViewportView(table);
3)JTable(TableModelmodel):
使用表格模型model创建一个表格
TableModel是javax.swing.table中的一个接口,这个包中的DefaultTableModel实现了这个接口
publicstaticvoidmain(String[]args){
GUI0807JTabletable=newGUI0807JTable();
String[]columnNames={"编号","课程名称","课程类别","学分","课时"};
String[][]rowData={
{"001","语文","必修","6","50"},
{"002","政治","必修","5","30"},
{"003","英语","选修","3","35"},
{"004","计算机","必修","8","60"},
};
DefaultTableModelmodel=newDefaultTableModel(rowData,columnNames);
JTablejTable=newJTable(model);
JScrollPanejsp=newJScrollPane();
jsp.setViewportView(jTable);
table.add(jsp);
table.setBounds(300,150,300,300);
table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table.setVisible(true);
}
运行结果:
4)JTable(VectordataVector,VectorcolumnVector):
以向量Vector中的元素值作为单元格中数据
以向量columnVector中的元素值作为列名创建一个表格
VectorcolumnVector=newVector();
columnVector.add("年");
columnVector.add("月");
columnVector.add("日");
Vector>dataVector=newVector>();
for(inti=1;i<=5;i++){
VectorrowVector=newVector();
rowVector.add("2010");
rowVector.add("5");
rowVector.add(String.valueOf(i));
dataVector.add(rowVector);
}
JTablejTable=newJTable(dataVector,columnVector);
运行结果:
常用方法:
getModel()
获得表格所显示数据的表格模式
getRowCount()
获得表格中所显示的数据的行数
getSelectedColumn()
获得表格中第一选择列的索引,如果没有被选择的列,返回-1
getSelectedRow()
获得表格中第一选择行的索引,如果没有被选择的行,返回-1
getValueAt()
获得由指定行索引row和列索引column指定单元格的值
setAutoResizeModel()
设置表格的自动调整模式
setSelectionModel()
设置表格的选择模式
注意:
1、表格的行和列索引都是从0开始的
2、表格的自动调整模式默认开启,调整窗体大小表格自动按比例调整所有列的宽度
JTable例子:
publicclassGUI0807JTable3extendsJFrame{
JTextFieldjtfA,jtfB;
publicGUI0807JTable3(){
String[]columnNames={"编号","课程名称","课程类别","学分","课时"};
String[][]rowData={{"001","语文","必修","6","50"},
{"002","政治","必修","5","30"},
{"003","英语","选修","3","35"},
{"004","计算机","必修","8","60"},};
finalDefaultTableModelmodel=newDefaultTableModel(rowData,
columnNames);
finalJTablejTable=newJTable(model);
JScrollPanejsp=newJScrollPane();
jsp.setViewportView(jTable);
//设置表格的排序器
jTable.setRowSorter(newTableRowSorter(model));
//设置表格的选择模式为单选
jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//为表格添加鼠标事件监听器
jTable.addMouseListener(newMouseAdapter(){
//发生了单击事件
publicvoidmouseClicked(MouseEvente){
//获得被选中行的索引
intselectedRow=jTable.getSelectedRow();//这里提示前面局部jTable必许加final修饰,否则出错
//从表格模型中获得指定值
Objectoa=model.getValueAt(selectedRow,0);//这里model一样,定义到类里就不需要了。
Objectob=model.getValueAt(selectedRow,1);
//将获得的值赋给文本框
jtfA.setText(oa.toString());
jtfB.setText(ob.toString());
}
});
finalJPaneljPanel=newJPanel();
//把面板添加到窗体下面
this.add(jPanel,BorderLayout.SOUTH);
jPanel.add(newJLabel("A:
"));
jtfA=newJTextField("A4",5);
jPanel.add(jtfA);
jPanel.add(newJLabel("B:
"));
jtfB=newJTextField("B4",5);
jPanel.add(jtfB);
finalJButtonjb_add=newJButton("添加");
jb_add.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//创建表格行数组
String[]rowValues={jtfA.getText(),jtfB.getText()};
//向表格中添加一行
model.addRow(rowValues);
//把表格的总行数加1
introwCount=jTable.getRowCount()+1;
//文本框设置值为A连接总行数加1的值
jtfA.setText("A"+rowCount);
jtfB.setText("B"+rowCount);
}
});
jPanel.add(jb_add);//把按钮添加到面板上
finalJButtonjb_updata=newJButton("修改");
jb_updata.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//获得被选中行的索引
intselectedRow=jTable.getSelectedRow();
if(selectedRow!
=-1){//判断是否存在被选中行
//修改表格模式当中的指定值
model.setValueAt(jtfA.getText(),selectedRow,0);
model.setValueAt(jtfB.getText(),selectedRow,1);
}
}
});
jPanel.add(jb_updata);
finalJButtonjb_delete=newJButton("删除");
jb_delete.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
intselectedRow=jTable.getSelectedRow();
if(selectedRow!
=-1){
model.removeRow(selectedRow);
}
}
});
jPanel.add(jb_delete);
this.add(jsp,BorderLayout.CENTER);
this.setTitle("维护表格模型");
this.setBounds(300,150,500,250);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
publicstaticvoidmain(String[]args){
newGUI0807JTable3();
}
}
运行结果:
对模型的事件监听与处理
TableModelListener接口可监听模型事件
实现该接口可监控表格的变化
该接口只有一个方法tableChanged()该方法只有一个入口参数TableModelEvent
TableModelEvent的方法有:
getColumn():
返回表格模型中事件的列
getFirstRow():
返回表格模型中第一个被更改的行
getLastRow():
返回表格模型中最后一个被更改的行
getType():
返回事件类型(INSERT、UPDATA和DELETE之一)
通过getType方法判断事件类型,再与TableModelEvent类的常用字段比较,就可以了
常用字段:
TableModelEvent。
DELETE对行或列进行了删除
TableModelEvent。
INSERT添加了新行或新列
TableModelEvent。
UPDATA对现有数据进行了修改
AbstractTableModel
除了数据模型发生变化会触发表格模型事件监听器外,还可以通过AbstractTableModel类提供的方法来触发。
AbstractTableModel类用于触发表格模型事件监听器的常用方法:
voidfireTableCellUpdated(introw,intcolumn)
通知所有侦听器,已更新[row,column]处的单元格值。
voidfireTableChanged(TableModelEvente)
将给定的通知事件转发到所有将自身注册为此表模型的侦听器的TableModelListeners。
voidfireTableDataChanged()
通知所有侦听器,表的所有行单元格值可能已更改。
voidfireTableRowsDeleted(intfirstRow,intlastRow)
通知所有侦听器,已删除范围在[firstRow,lastRow](包括)的行。
voidfireTableRowsInserted(intfirstRow,intlastRow)
通知所有侦听器,已插入范围在[firstRow,lastRow](包括)的行。
voidfireTableRowsUpdated(intfirstRow,intlastRow)
通知所有侦听器,已更新范围在[firstRow,lastRow](包括)的行。
使用AbstractTableModel类触发监听器时,并不是真正对表格模型进行了添加、修改和删除等操作,
只是通过这些方法来通知表格模型的所有监听器,并对事件进行响应处理。
附:
设置JTable的单元格不能被编辑、内容居中显示、隐藏JTable中的某一列
要使单元格不能被编辑,重写tableModel里面的isCellEditable即可,例如:
String[]columnNames={"编号","课程名称","课程类别","学分","课时"};
String[][]rowData={{"001","语文","必修","6","50"},
{"002","政治","必修","5","30"},
{"003","英语","选修","3","35"},
{"004","计算机","必修","8","60"},};
finalDefaultTableModelmodel=newDefaultTableModel(rowData,
columnNames){
publicbooleanisCellEditable(introw,intcolumn){
returnfalse;
}
};
finalJTablejTable=newJTable(model);
JScrollPanejsp=newJScrollPane();
jsp.setViewportView(jTable);
//使数据局中对齐
DefaultTableCellRendererr=newDefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
jTable.setDefaultRenderer(Object.class,r);
//隐藏表格中第一列
DefaultTableColumnModeldcm=(DefaultTableColumnModel)jTable.getColumnModel();//获得列模型
dcm.getColumn(0).setMinWidth(0);//将第一列最大宽度,最小宽度设为0就看不到了
dcm.getColumn(0).setMaxWidth(0);
设置单元格不能被编辑以后就可以在鼠标监听事件里设置双击事件来以其他方式修改单元格的数据了
jTable.addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
//双击单元格(这里可以获得行列索引然后操作)
if(e.getClickCount()==2){
intseleRow=jTable.getSelectedRow();
intseleColumn=jTable.getSelectedColumn();
Stringstring=JOptionPane.showInputDialog("修改为:
");
if(string==null){
return;
}else
if(string.equals("")){
JOptionPane.showMessageDialog(getContentPane(),"修改值不能为空!
");
}else
jTable.setValueAt(string,seleRow,seleColumn);
}
}
});
setValueAt(ObjectaValue,introwIndex,intcolumnIndex)方法