Swing中的表格
?JTable类:
JTable类是表格中最基本的类,主要负责对数据的显示。
技术要点:
JTable的构造函数:
JTable();创建一个默认的表格。JTable(int rows,int cols);创建具有指定行数、列数的表格。JTable(Object[][] rowData,Object[][] ColumnNames);创建表格显示二维数组中的只值,列名为columnNames.
JTable(TableModeldm);创建一个指定数据模型的表格。
JTable(TableModel dm,TableColumnModel cm):创建指定数据模型、指定列模型的表格
JTable(TableModel dm,TableColumnModel cm ,ListSelectionModel sm);创建一个指定了数据模型、
列模型和指定选择模型的表格
常用方法:
●Public void selectAll():选中表中的行、列。
●Public void clearSelection():取消选中状态。
●Public void remove/setRowSelectionInterval(int index0,int index1):取消/选中指定索引值之间的行。
●Public void remove/setColumnSelectionInterval()nt index0,int index1):取消/选中指定索引值之间的列。
●Public int getSelectedColumn()/getSelectedRow():选中返回列/行的索引。
●Public int getSelectedColumnCount/getSelectedRowCount():返回选中列/行数。
●Public Boolean isColumnSelected(int col)/isRowSelected(int row):判断知道那个索引的列/行是否选中。
●Public void setRowHeight(int rowHeight)/ setRowHeight(int row,int rowHeight):设定行的高度及指定
行的高度。
●Public void setRowMargin(int rowMargin):设置相邻单元格之间的距离。
●Public void setSelectionForegraound(Color selectionfOREGROUND):设置选定单元格的前景色。
●Public void setShowGrid(Boolean showGrid)/setGridColor(Color c):是否绘制网格线/设置网格线的颜
色。
●Public void setShowHorizontalLines(Boolean bool)/setShowVeticalLines(Boolean bool):绘制单元格之
间的水平线或单元格间的垂直线。
创建表格代码如下:
public class JTableTest extends JFrame
{
Vector vdata=new Vector();//创建包含表格数据的向量
{//记住此地方的大括号的使用,没有效果也是一样
Vector tempv1=new Vector();//创建表示行数据的子向量
Vector tempv2=new Vector();
Vector tempv3=new Vector();
Vector tempv4=new Vector();
Vector[] tempv = {tempv1,tempv2,tempv3,tempv4};
String[] data1 = {"1001","怀旧牛仔裤","200.0","120.0","已发货"};
String[] data2 = {"1002","长袖针织衬衫","110.0","85.0","交易完毕"};
String[] data3 = {"1003","波西米亚长裙","300.0","180.0","待发货"};
String[] data4 = {"1004","短装牛仔服","90.0","47.0","等待处理"};
String[][] datav = {data1,data2,data3,data4};
for(int i=0;i { for(int j=0;j { tempv[i].add(datav[i][j]); //依次将每行的字符串数组添加到表示行数据的子向量中 }//添加表示行数据的子向量到包含表格数据的向量中 vdata.add(tempv[i]); } } //创建包含表格标题的向量 Vector vhead=new Vector(); { //创建表格标题的字符串数组 String[] dataHead = {"商品ID","商品名称","商品原价","成交金额","处理情况"}; for(int i=0;i { vhead.add(dataHead[i]); //将标题的字符串添加到包含表格标题的向量中 } } JTable table=new JTable(vdata,vhead); JScrollPane scrollPane=new JScrollPane(table); //必须将表格添加到滚动面板中,否则不显示列名 public JTableTest() {//设置表格的一些属性 //设置不绘制表格的垂直线 // table.setShowVerticalLines(false);/ table.setRowHeight(3,30); /设置指定行行高 table.setGridColor(Color.gray); //设置网格线的颜色为灰色 this.add(scrollPane); //将包含表格的滚动窗格添加进窗体 //窗体设置此处省略 } //主方法省略………… } 表格模型: 在表格中,JTable最主要负责表格的显示,而表格数据的管理则由数据模型进行管理。逼走个模型主要有:TableModel接口、AbstractTableModel类、DefaultTableModel类。 Ⅰ.TableModel接口常用方法如下: ●Public void addTableModelListener(TableModelListener e):为表模型注册TableModel 事件监听器。 ●Public int getColumnCount()/getRowCount():返回该模型中的列数/行数。 ●Public String getColumnName(int columnIndex):返回指定索引烈的列名。 ●Public object getValueAt(int rowIndex,int columnIndex):返回指定单元格的值。 ●Public void setValueAt(int rowIndex,int columnIndex):设置具体单元格的值。 ●Public Boolean isCellEditable(int rowIndex,int columnIndex):判断指定单元格是否可 以编辑。 1.Public void removeTableModelListener(TableModelListener e):从表格模型中移除事件监 听器。 2.Public Class> getColumnClass(int columnIndex):返回指定列的数据类型。 Ⅱ.AbstractTableModel类: 由于TabelModel接口有多种方法,因此实现此接口必须实现大量的方法,使用不方便。 Javax.swing.table包中提供了一个AbstractTableModel类,该类实现了TabelMOdel接口中的大部分类, 只有三种方法需要用户实现。(用户实现三种方法如下) ●Public abstract int getRowCount() ●Public abstract int getColumnCount() ●Public abstract Object getValueAt(int rowIndex,int columnIndex) 另外,AbstractTableModel类也有一些常用方法: ●Public void fireTableCellUpdated(int rowIndex,int columnIndex):更新指定单元格处的 值时通知监听器。 ●Public void fireTableDataChanged():表格的行单元格值更改时通知监听器。 ●Public void fireTableStructureChanged():表格的结构更改时通知监听器。 ●Public int findColumn(String columnName):获取指定列名的索引值。 Ⅲ.DefaultTableModel类:(常用构造方法如下) ●DefaultTableModel()/ DefaultTableModel(int rowcount,int columncount)/ DefaultTableModel(Object[][] data,Object[] columnNames)/ ●DefaultTableModel(Object[] columnNames,int rowCount) 常用方法如下: ●Public void addColumn(Object columnName,Object[] columnData/Vector columnData ): 添加列到模型中,新列中的数据是columnData中的元素。 ●Public void addRow(Object[] rowData/Vector rowData):添加行到模型的结尾,新行的数据是 rowData。 ●Public void insertRow(int row ,Vector rowData):在指定的行的位置插入指定的数据。 ●Public void removeRow(int row):删除指定索引处的行。 ●Public void setColumnCount(int columncount)/setRowCount(int rowCount):设置模型的 列数/行数。 public class TableModelTest extends JFrame implements ActionListener {//创建面板,按钮数组,表格,滚动条 JPanel panel=new JPanel(); JButton addRow =new JButton("增加行"); JButton addColumn =new JButton("增加列"); JButton deleteRow =new JButton("删除行"); JButton deleteColumn =new JButton("删除列"); JButton[] buttonArray= {addRow, addColumn, deleteRow, deleteColumn}; //创建初始列标题字符串 String[] head={"第1列"}; //创建初始表格数据字符串 String[][] data={{"第1行第1列"}}; //创建表格模型 DefaultTableModel tableModel=new DefaultTableModel(data,head); JTable table=new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); public TableModelTest() {//给按钮注册监听器,添加到面板中,将组件添加到相应的容器中,设置窗体属性for(int i=0;i { panel.add(buttonArray[i]);//将按扭添加进JPanel容器中 buttonArray[i].addActionListener(this);//为按扭注册动作事件监听器 } this.add(panel,BorderLayout.NORTH);//将按扭容器添加进窗体的顶部 this.add(scrollPane,BorderLayout.CENTER); //设置窗体的标题、位置、大小、可见性以及关闭动作.............. } public void actionPerformed(ActionEvent e) { DefaultTableModel temp=(DefaultTableModel)table.getModel();//获得表格模型,必须重新获取,不能直接使用自己定义的tableModel int c=temp.getColumnCount();//获得表格的列数 int r=temp.getRowCount(); //获得表格的行数 if(e.getSource()==buttonArray[0]) {//按下“增加行”按钮时执行的代码 //创建新行的数据向量 Vector newR=new Vector(); for(int i=0;i { newR.add((r+1)+"行"+(i+1)+"列");//为数据向量添加数据 } temp.getDataVector().add(newR);//添加新的数据向量到表格模型中 ((DefaultTableModel)table.getModel()).fireTableStructureChanged(); //刷新表格后重新绘制 } else if(e.getSource()==buttonArray[1]) {//按下“增加列”按钮执行的代码 Vector newC=new Vector();//创建新列的数据向量 for(int i=0;i { newC.add((i+1)+"行"+(c+1)+"列");//为数据向量添加数据 } temp.addColumn("第"+(c+1)+"列",newC); } else if(e.getSource()==buttonArray[2]) {//按下“删除行”按钮执行的代码 if(r>0)//检查行数是否大于0,如果大于0,删除最后一行 { temp.removeRow(r-1); //删除最后一行,此处temp.setRowCount (r-1)效果是一样的 } } else if(e.getSource()==buttonArray[3]) {//按下“删除列”按钮执行的代码 if(c-1>0)//检查当前列数是否大于1,如果大于1,删除最后一列 { temp.setColumnCount(c-1); //设置表的列数为当前列数减1,也就是最后一列被删除 } } } //主方法此处省略............. }