




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Swing之JTable详解类层次结构图:java.lang.Object-java.awt.Component-java.awt.Container-javax.swing.JComponent-javax.swing.JTabel1、JTable在使用JTable以前,我们先看一下它的构造函数有哪些,以及应该如何使用:JTabel构造函数:JTable():建立一个新的JTables,并使用系统默认的Model。JTable(intnumRows,intnumColumns):建立一个具有numRows行,numColumns列的空表格,使用的是DefaultTableModel。JTable(ObjectrowData,ObjectcolumnNames):建立一个显示二维数组数据的表格,且可以显示列的名称。JTable(TableModeldm):建立一个JTable,有默认的字段模式以及选择模式,并设置数据模式。JTable(TableModeldm,TableColumnModelcm):建立一个JTable,设置数据模式与字段模式,并有默认的选择模式。JTable(TableModeldm,TableColumnModelcm,ListSelectionModelsm):建立一个JTable,设置数据模式、字段模式、与选择模式。JTable(VectorrowData,VectorcolumnNames):建立一个以Vector为输入来源的数据表格,可显示行的名称。我们先以Array构造方式,说明如何利用JTable来建立一个简单的表格:importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.util.*;publicclassSimpleTablepublicSimpleTable()JFramef=newJFrame();ObjectplayerInfo=阿呆,newInteger(66),newInteger(32),newInteger(98),newBoolean(false),阿呆,newInteger(82),newInteger(69),newInteger(128),newBoolean(true),;StringNames=姓名,语文,数学,总分,及格;JTabletable=newJTable(playerInfo,Names);table.setPreferredScrollableViewportSize(newDimension(550,30);JScrollPanescrollPane=newJScrollPane(table);f.getContentPane().add(scrollPane,BorderLayout.CENTER);f.setTitle(SimpleTable);f.pack();f.show();f.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););publicstaticvoidmain(Stringargs)SimpleTableb=newSimpleTable();表格由两部份组成:分别是行标题(ColumnHeader)与行对象(ColumnObject).利用JTable所提供的getTableHeader()方法取得行标题。在这个例子中,我们将JTable放在JScrollPane中,这种做法可以将ColumnHeader与ColmnObject完整的显示出来,因为JScrollPane会自动取得ColumnHeader.但如果文坛读者将上面第15行去掉并修改第16行:f.getContentPane().add(table,BorderLayout.CENTER);则运行结果你会发现ColumnHeader不见了。如果你不想用JScrollPane,要解决这个问题,你必须将程序修改如下:JTabletable=newJTable(p,n);table.setPreferredScrollableViewportSize(newDimension(550,30);f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);f.getContentPane().add(table,BorderLayout.CENTER);运行结果就会跟之前一样有行标题了。面的运行结果就会跟发现,每个字段的宽度都是一样的,除非你自行拉曳某个列宽。若我们想一开始就设置列宽的值,可以利用TableColumn类所提供的setPreferredWidth()方法来设置,并可利用JTable类所提供的setAutoResizeMode()方法来设置调整某个列宽时其他列宽的变化情况,我们看下面这个例子:importjavax.swing.*;importjavax.swing.table.*;importjava.awt.*;importjava.awt.event.*;importjava.util.*;publicclassSimpleTable2publicSimpleTable2()JFramef=newJFrame();Objectp=阿呆,newInteger(66),newInteger(32),newInteger(98),newBoolean(false),newBoolean(false),阿呆,newInteger(82),newInteger(69),newInteger(128),newBoolean(true),newBoolean(false),;Stringn=姓名,语文,数学,总分,及格,作弊;TableColumncolumn=null;JTabletable=newJTable(p,n);table.setPreferredScrollableViewportSize(newDimension(550,30);table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);for(inti=0;iAbstractTableModel-extends-DefaultTableModel3、AbstractTableModel:java提供的AbstractTableModel是一个抽象类,这个类帮我们实现大部份的TableModel方法,除了getRowCount(),getColumnCount(),getValueAt()这三个方法外。因此我们的主要任务就是去实现这三个方法.利用这个抽象类就可以设计出不同格式的表格.我们来看看它所提供的方法:AbstractTableModel方法:voidaddTableModelListener(TableModelListenerl):使表格具有处理TableModelEvent的能力.当表格的TableModel有所变化时,会发出TableModelEvent事件信息。intfindColumn(StringcolumnName):寻找在行名称中是否含有columnName这个项目.若有,则返回其所在行的位置;反之则返回-1表示未找到。voidfireTableCellUpdated(introw,intcolumn):通知所有的Listener在这个表格中的(row,column)字段的内容已经改变了。voidfireTableChanged(TableModelEvente):将所收的事件通知传送给所有在这个tablemodel中注册过的TableModelListeners。voidfireTableDataChanged():通知所有的listener在这个表格中列的内容已经改变了.列的数目可能已经改变了,因此JTable可能需要重新显示此表格的结构。voidfireTableRowsDeleted(intfirstRow,intlastRow):通知所有的listener在这个表格中第firstrow行至lastrow列已经被删除了。voidfireTableRowsUpdated(intfirstRow,intlastRow):通知所有的listener在这个表格中第firstrow行至lastrow列已经被修改了。voidfireTableRowsInserted(intfirstRow,intlastRow):通知所有的listener在这个表格中第firstrow行至lastrow列已经被加入了。voidfireTableStructureChanged():通知所有的listener在这个表格的结构已经改变了.行的数目,名称以及数据类型都可能已经改变了ClassgetColumnClass(intcolumnIndex):返回字段数据类型的类名称。StringgetColumnName(intcolumn):若没有设置列标题则返回默认值,依次为A,B,C,.Z,AA,AB,.;若无此column,则返回一个空的StringPublicEventListenergetListeners(ClasslistenerType):返回所有在这个tablemodel所建立的listener中符合listenerType的listener,并以数组形式返回。booleanisCellEditable(introwIndex,intcolumnIndex):返回所有在这个tablemodel所建立的listener中符合listenerType形式的listener,并以数组形式返回。voidremoveTableModelListener(TableModelListenerl):从TableModelListener中移除一个listener。voidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex):设置某个cell(rowIndex,columnIndex)的值。若你仔细比较TableModel所定义的方法与上述AbstractTableModel所提供的方法,你可以发现,AbstractTableModel抽象类并没有实现getRowCount(),getColumnCount(),getValueAt()这三个方法,这也就是为什么我们要去实现这三个方法的原因。下面我们来看如何使用AbstractTableModel来实作出自己想要的表格模式。范例:TableModel1.javaimportjavax.swing.table.AbstractTableModel;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassTableModel1publicTableModel1()JFramef=newJFrame();MyTablemt=newMyTable();JTablet=newJTable(mt);t.setPreferredScrollableViewportSize(newDimension(550,30);JScrollPanes=newJScrollPane(t);f.getContentPane().add(s,BorderLayout.CENTER);f.setTitle(JTable1);f.pack();f.setVisible(true);f.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););publicstaticvoidmain(Stringargs)newTableModel1();classMyTableextendsAbstractTableModelObjectp=阿呆,newInteger(66),newInteger(32),newInteger(98),newBoolean(false),newBoolean(false),阿瓜,newInteger(85),newInteger(69),newInteger(154),newBoolean(true),newBoolean(false),;Stringn=姓名,语文,数学,总分,及格,作弊;publicintgetColumnCount()returnn.length;publicintgetRowCount()returnp.length;publicStringgetColumnName(intcol)returnncol;publicObjectgetValueAt(introw,intcol)returnprowcol;publicClassgetColumnClass(intc)returngetValueAt(0,c).getClass();上例中表格内的数据类型不论是String,int或是Boolean类型,都均以string的类型显示.例如在及格的字段中,原本的数据是以Boolean类型来表示,但显示在JTable上时便转换成字符串形式,若想要使表格能显示出不同的数据类型,我们要在MyTable中Override写getColumnClass()方法,这个方法可以让我们分辨出表格中每一行的数据类型,并将此类型作适当的显示:publicClassgetColumnClass(intc)returngetValueAt(0,c).getClass();这样作弊会以CheckBox显示,数据类型一律靠右显示,String类型一律靠左显示。TableModel2.javaimportjavax.swing.table.AbstractTableModel;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassTableModel2implementsActionListenerJTablet=null;publicTableModel2()JFramef=newJFrame(DataModel);JButtonb1=newJButton(数学老师);b1.addActionListener(this);JButtonb2=newJButton(学生阿呆);b2.addActionListener(this);JPanelpanel=newJPanel();panel.add(b1);panel.add(b2);t=newJTable(newMyTable(1);t.setPreferredScrollableViewportSize(newDimension(550,30);JScrollPanes=newJScrollPane(t);f.getContentPane().add(panel,BorderLayout.NORTH);f.getContentPane().add(s,BorderLayout.CENTER);f.pack();f.setVisible(true);f.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););publicvoidactionPerformed(ActionEvente)if(e.getActionCommand().equals(学生阿呆)t.setModel(newMyTable(1);if(e.getActionCommand().equals(数学老师)t.setModel(newMyTable(2);t.revalidate();publicstaticvoidmain(Stringargs)newTableModel2();classMyTableextendsAbstractTableModelObjectp1=阿呆,1234,newInteger(66),newInteger(50),newInteger(116),newBoolean(false),newBoolean(false);Stringn1=姓名,学号,语文,数学,总分,及格,作弊;Objectp2=阿呆,1234,newInteger(50),newBoolean(false),newBoolean(false),01234,阿瓜,1235,newInteger(75),newBoolean(true),newBoolean(false),05678;Stringn2=姓名,学号,数学,及格,作弊,电话;intmodel=1;publicMyTable(inti)model=i;publicintgetColumnCount()if(model=1)returnn1.length;elsereturnn2.length;publicintgetRowCount()if(model=1)returnp1.length;elsereturnp2.length;publicStringgetColumnName(intcol)if(model=1)returnn1col;elsereturnn2col;publicObjectgetValueAt(introw,intcol)if(model=1)returnp1rowcol;elsereturnp2rowcol;publicClassgetColumnClass(intc)returngetValueAt(0,c).getClass();4、TableColumnModel:TableColumnModel本身是一个Interface,里面定义了许多与表格的列(行)有关的方法,例如增加列,删除列,设置与取得列的相关信息。通常我们不会直接实现TableColumnModel界面,而是会利用JTable的getColumnModel()方法取得TableColumnModel对象,再利用此对象对字段做设置。举例来说,如果我们想设计的表格是包括有下拉式列表的ComboBox,我们就能利用TableColumnModel来达到这样的效果。我们先看看下面的例子:importjavax.swing.table.AbstractTableModel;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassColumnModelTestpublicColumnModelTest()JFramef=newJFrame();/*由于我们的MyTable类继承了AbstractTableModel并且实作了getColmunCount(),getRowCount(),getValueAt()方法.因此我们可以通过MyTable来产生TableModel的实体.*/MyTablemt=newMyTable();JTablet=newJTable(mt);/我们利用MyTable来建立JTable.JComboBoxc=newJComboBox();/建立一个JComboBox的对象.c.addItem(Taipei);/我们在新建立的JComboBox对象里新增三个项目.c.addItem(ChiaYi);c.addItem(HsinChu);/*我们利用JTable所提供的getTableColumnModel()方法取得TableColumnModel对象,*再由TableColumnModel类所提供的getColumn()方*法取得TableColumn对象,TableColumn类可针对表格中的每一行做具体的设置,*例如设置字段的宽度,某行的标头,设置输入较复杂的*数据类型等等.在这里,我们利用TableColumn类所提供的setCellEditor()方法,*将JComboBox作为第二行的默认编辑组件.*/t.getColumnModel().getColumn(1).setCellEditor(newDefaultCellEditor(c);t.setPreferredScrollableViewportSize(newDimension(550,30);JScrollPanes=newJScrollPane(t);f.getContentPane().add(s,BorderLayout.CENTER);f.setTitle(ColumnModelTest);f.pack();f.setVisible(true);f.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););publicstaticvoidmain(Stringargs)newColumnModelTest();classMyTableextendsAbstractTableModelObjectp=阿呆,Taipei,newInteger(66),newInteger(32),newInteger(98),newBoolean(false),newBoolean(false),阿瓜,ChiaYi,newInteger(85),newInteger(69),newInteger(154),newBoolean(true),newBoolean(false),;Stringn=姓名,居住地,语文,数学,总分,及格,作弊;publicintgetColumnCount()returnn.length;publicintgetRowCount()returnp.length;publicStringgetColumnName(intcol)returnncol;publicObjectgetValueAt(introw,intcol)returnprowcol;publicClassgetColumnClass(intc)returngetValueAt(0,c).getClass();/* publicbooleanisCellEditable(introwIndex,intcolumnIndex)returntrue;publicvoidsetValueAt(Objectvalue,introw,intcol)prowcol=value;fireTableCellUpdated(row,col);*/读者运行此程序可以发现,利用继承AbstractTableModel抽象类所产生的JTable的内容是不能被修改的。那如果想要让用户可以修改表格中的某一个字段,例如勾选CheckBox或是直接修改某个字段的数字,该怎么做呢很简单,只要我们在范例中的MyTable类中覆写AbstractTableModel抽象类中的isCellEditable()方法即可。下面即是isCellEditable()的实作:publicbooleanisCellEditable(introwIndex,intcolumnIndex)returntrue;在isCellEditable()中,我们只有一行简单的程序代码:returntrue,意思是将我们表格内的每个cell都变成可修改.但仅仅修改这个程序代码还不行,你可以发现虽然表格现在变成了可以修改了,但更改完之后按下Enter键,内容马上恢复成原有的值!解决的方法是覆写AbstractTableModel抽象类中的setValueAt()方法,这个方法主要是让我们将改过的值存入表格中,如下所示:publicvoidsetValueAt(Objectvalue,introw,intcol)prowcol=value;fireTableCellUpdated(row,col);其中value为我们所更改的值,我们将value存入prowcol中,并且调用firTableCellUpdated()函数来告诉我们的系统表格已经做了更改了,关于这一部份,我们后面会再对事件处理作详细地介绍,在此范例中有没有加入fireTableCellUpdated()方法对运行结果不会造成影响5、SelectionModel表格的选择模式是依据我们前面所讲的ListSelectionModel而来,因此它的操作模式与事件处理跟JList没什么分别!我们稍微复习一下ListSelectionModel这个Interface,它包含了3个常数值,如下:staticintSINGLE_SELECTIONstaticintSINGLE_INTERVAL_SELECTIONstaticintMULTIPLE_INTERVAL_SELECTION分别可让用户作单一选择,连续区间选择与多重选择.当用户作后面两个模式的操作时,应配合Shift键或Ctrl键。要使用ListSelectionModel可利用JTable的getSelectionModel()方法取得ListSelectionModel对象,再利用ListSelectionModel界面所定义的setSelectionModel()来设置选择模式。如同JList一般,当用户对表格作数据域位的选取时会产生ListSelectionEvent事件,要处理这个事件就必须实现ListSelectionListener这个界面,此界面定义了一个方法,那就是valueChanged()。我们来看下面的例子,用户可在按钮上选择哪种选择模式,当用户选取表格数据时,程序会将用户选取的数据显示在表格下面的JLabel中。SelectionModelDemo.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;publicclassSelectionModelDemoimplementsActionListener,ListSelectionListenerJTabletable=null;ListSelectionModelselectionMode=null;JLabellabel=null;/显示用户选取表格之用publicSelectionModelDemo()JFramef=newJFrame();Stringname=字段1,字段2,字段3,字段4,字段5;Stringdata=newString55;intvalue=1;for(inti=0;idata.length;i+)for(intj=0;jdata.length;j+)dataj=String.valueOf(value+);table=newJTable(data,name);table.setPreferredScrollableViewportSize(newDimension(400,80);table.setCellSelectionEnabled(true);/使得表格的选取是以cell为单位,而不是以列为单位.若你没有写此行,则在选取表格数/据时以整列为单位.selectionMode=table.getSelectionModel();/取得table的ListSelectionModel.selectionMode.addListSelectionListener(this);JScrollPanes=newJScrollPane(table);JPanelpanel=newJPanel();JButtonb=newJButton(单一选择);panel.add(b);b.addActionListener(this);b=newJButton(连续区间选择);panel.add(b);b.addActionListener(this);b=newJButton(多重选择);panel.add(b);b.addActionListener(this);label=newJLabel(你选取:);ContainercontentPane=f.getContentPane();contentPane.add(panel,BorderLayout.NORTH);contentPane.add(s,BorderLayout.CENTER);contentPane.add(label,BorderLayout.SOUTH);f.setTitle(SelectionModelDemo);f.pack();f.setVisible(true);f.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););/*处理按钮事件,利用ListSelectionModel界面所定义的setSelectionMode()方法来设置表格选取模式.*/publicvoidactionPerformed(ActionEvente)if(e.getActionCommand().equals(单一选择)selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);if(e.getActionCommand().equals(连续区间选择)selectionMode.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);if(e.getActionCommand().equals(多重选择)selectionMode.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);table.revalidate();/*当用户选取表格数据时会触发ListSelectionEvent,我们实现ListSelectionListener界面来处理这一事件.ListSelectionListener界*面只定义一个方法,那就是valueChanged().*/publicvoidvalueChanged(ListSelectionEventel)StringtempString=;/JTable的getSelectedRows()与getSelectedColumns()方法会返回已选取表格cell的indexArray数据.introws=table.getSelectedRows();intcol
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年北京昌平区高三二模高考英语试卷试题(含答案详解)
- 公众责任险培训大纲
- 培训管理员培训总结
- 如何做好安全管理培训
- 农村冬季行车安全培训
- 吊装作业培训课件
- 供应商入厂安全培训
- 轮椅电动租赁合同协议
- 产品研发及知识产权保护合同
- 电子商务知识培训
- 24春国家开放大学《公务员制度讲座》形成性考核1-4参考答案
- 污水管网工程项目方案资料目录清单及其表格
- 第1讲:二元一次方程组培优
- 《信息安全技术数据安全能力成熟度模型》
- 建筑材料采购投标方案(技术标)
- 货币的起源发展演变与未来课件
- 2024年山东省春季高考技能考试-汽车专业备考试题库(浓缩500题)
- 女性健康知识讲座通用课件
- 《神奇糖果店》教学课件
- 港口建设项目风险评估报告
- 中国传统文化“二十四节气”与美术学科的融合
评论
0/150
提交评论