ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:39.16KB ,
资源ID:6620763      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6620763.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(swing中Jtable使用的方法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

swing中Jtable使用的方法.docx

1、swing中Jtable使用的方法如何使用Table 利用 JTable 类,可以以表格的形式展示数据,可设置允许用户编辑数据。JTable 本身不拥有或者缓存数据;它只是数据的视图。这里有一个放在滚动面板上的典型表格: 本文展示如何完成一些常见的表格相关的任务:包括以下部分:(1)创建一个简单的表格(2)向容器添加表格(3)改变每每一栏的宽度(4)用户选择(5)创建表格模型(6)监听数据改变(7)点燃数据改变事件(8)概念:编辑器和渲染器(9)使用自定义渲染器(10)为单元格指定提示工具(11)为列头指定提示工具(12)排序和过滤(13)使用组合框作为编辑器(14)使用其他编辑器(15)使用

2、编辑器验证用户的文本输入(16)打印(17)例子列表 (1)创建一个简单的表格 SimpleTableDemo.java 中的表格在一个字符串数组中声明各个列名Java代码 1 String columnNames = First Name, 2 Last Name, 3 Sport, 4 # of Years, 5 Vegetarian; 数据初始化并存储在二维数组:Java代码 6 Object data = 7 Kathy, Smith, 8 Snowboarding, new Integer(5), new Boolean(false), 9 John, Doe, 10 Rowing,

3、 new Integer(3), new Boolean(true), 11 Sue, Black, 12 Knitting, new Integer(2), new Boolean(false), 13 Jane, White, 14 Speed reading, new Integer(20), new Boolean(true), 15 Joe, Brown, 16 17 Pool, new Integer(10), new Boolean(false) 18 ; 接着表格使用这些数据和列名构造一个表格:Java代码 19 JTable table = new JTable(data,

4、columnNames); 有两个接收数据的 JTable 构造器: JTable(Object rowData, Object columnNames) JTable(Vector rowData, Vector columNames) 这些构造函数的好处是容易实现,而缺点是: 他们自动设置每个单元格为可编辑 数据类型都视为一样的(字符串类型)。例如,如果表格的一列有 Boolean 数据,表格用单选框来展示这个数据。可是,如果你用上面两种构造,你的 Boolean 数据将显示为字符串,就像前面表格截图中的 Vegetarian 一列一样。 它们要求你把所有表格数据放入一个数组或者vecto

5、r,这些数据结构可能不适合某些数据类型。例如,如果你实体化一组数据库对象,比起拷贝所有值放入数组和vector,你可能仅仅想要直接查询这些对象的值。 如果你想避免这些限制,你需要实现你自己的表格模型,见“(5)创建表格模型”。 (2)向容器添加表格 这里有一段创建滚动面板作为表格容器的常规代码:Java代码 20 JScrollPane scrollPane = new JScrollPane(table); 21 table.setFillsViewportHeight(true); 这两行代码实现了:表格对象的引用作为 JScrollPane 构造函数的参数,创建一个容纳table的容器,

6、table添加到容器中;JTable.setFillsViewportHeight 方法设置了 fillsViewportHeight 属性。当这个属性为 true 时,表格会占据容器整个高度,即便表格没有足够的行去使用这些垂直空间。这使得表格更容易实现拖拉操作。 滚动面板自动把表格头放置在视窗的顶端。当表格数据垂直滚动时,列名保持在视窗顶端可视。 如果你想要使用一个没有滚动面板的表格,你必须获得表格头组件,然后自己放置它,例如:Java代码 22 container.setLayout(new BorderLayout(); 23 container.add(table.getTableHe

7、ader(), BorderLayout.PAGE_START); 24 container.add(table, BorderLayout.CENTER); (3)改变每每一列的宽度 默认情况下,表格所有列等宽,切这些列自动填满整个表格的宽度。当表格变宽或者变窄时(通常是用户调整包含表格的窗口大小),所有的列宽自动调整到适当宽度。 当用户通过拖动列头的右边界来调整某一列的宽度时,要么别的列的宽度会受到影响而改变,要么整个表格的宽度会改变。默认情况下,表格整体宽度保持不变,“拖动点“的右侧各列利用增加或减少的空间自我调整,拖动的那一列的左侧各列保持不变。 要定义各列初始化宽度,你可以对表格各列

8、调用 setPreferredWidth 方法。可以设置各列首选宽度,和他们的相对宽度。例如,向demo增加下面代码,是的第三列比其他列更宽:Java代码 25 TableColumn column = null; 26 for (int i = 0; i 5; i+) 27 column = table.getColumnModel().getColumn(i); 28 if (i = 2) 29 column.setPreferredWidth(100); /third column is bigger 30 else 31 column.setPreferredWidth(50); 32

9、 33 如上面代码所示,每一列代表一个 TableColumn 对象, TableColumn 提供 getter 和 setter 方法设置和获取列的最小、首选、最大宽度 和 目前宽度。 基于估计单元格内容需要的空间调整单元格宽度,查看TableRenderDemo.java. 中的 initColumnSizes 方法。 当用户明确的调整列宽度,列的”首选宽度“就被设置为用户指定的”新的当前宽度“。不过,当表格因视窗调整而改变大小是,列的”首选宽度“不会改变。”首选宽度“的存在是用于计算新的列的宽度,来填充可用空间。 你可以通过调用 setAutoResizeMode 改变一个表格的调整模

10、式。 (4)用户选择 默认配置情况下,一个表格支持选择一行或多行。用户可以选择一组连续的或不连续的行。用户最后指示的那个单元格,在 Metal 样式中,会被outlined(轮廓虚线)。这个单元格被称为 ”lead selection“(导联选择(器, 钮));有时候也称为 ”聚焦单元格“ 或 ”当前单元格“。 用户使用鼠标键盘实现选择,选择的方式描述如下 操作鼠标动作键盘动作选择单行点击向上或向下选中连续多行Shift点击/拖拉Shitf-向上 或 Shift-向下 向选中的行集增加行/切换选择Control-点击Control+向上或向下, 使用空格键增加当前行或切换选择. 下面的例子程序

11、TableSelectionDemo.java展示了类似的表格,允许用户操纵某些 JTable 选项。还有一个文本面板记录”选择事件“。(这个demo里面的有关复选框事件处理代码写的好好) 在下面的截图中,这事默认的Metal样式,选中的行highlight,选择的单元格outline 在下面的”Selection Mode“下,有一些复选框,选择”Single Selection“。现在你只能在某一时刻选中一行,如果你选中”Single Interval Selection“,你可以选择连续的多行。 所有的”Selection Mode“下面的复选框按钮,调用 JTable.setSelec

12、tionMode. 这个方法带一个参数,为javax.swing.ListSelectionModel: MULTIPLE_INTERVAL_SELECTION, SINGLE_INTERVAL_SELECTION, andSINGLE_SELECTION.中的一个(依次为,多行可间隔,多行无间隔,单行) 回到我们的 demo,注意,在”Selection Options“下三个复选框,每个复选框控制一个由 JTable 定义的绑定属性的boolean类型状态值: ”Row Selection“控制 控制 rowSelectionAllowed 属性,通过setRowSelectionAllo

13、wed 和getRowSelectionAllowed 设置和读取。当这个绑定属性为 true (同时 columnSelectionAllowed属性为 false)时,用户可以选择行。 ”Coolumn Selection“控制 columnSelectionAllowed 属性,通过setColumnSelectionAllowed和getColumnSelectionAllowed 设置和读取。当这个绑定属性为 true 时,用户可以选择单个单元格,或者呈矩阵块地选择多个单元格 ”Cell Selection“控制 cellSelectionEnabled,通过 setCellSele

14、ctionEnabled andgetCellSelectionEnabled 设置和获取。当这个绑定属性为 true 是,用户可以选择单个单元格,或是以矩阵块的形式选择多个单元格。 提醒:JTable使用很简单的选择原则来管理 行 和 列 的交集,它并非设计成全面处理独立的单元格选择。(就是说,有些多单元格的选择是不被handle的,你也选不到) 如果你清空三个复选框,就没有selection了,只有lead selection表现而已。(我觉得lead selection只是形式上的选择,是一种导航观察的形式,而selection是确切选中表格中某些单元格的事实。我无法确切地解释出lead

15、 selection 和 selection的区别,我只能意会呀) 你可能注意到”Cell Selection“复选框在”multiple interval selection“选择模式中是不可用的。只是在这个demo的模式中是不被支持的。你可以在”multiple interval selection“模式中指定单元格选择,但是表格也不会产生有效的selection。 你或许还注意到,改变这”selection option“中某个选项可能影响其他选项。这是因为允许行选择和列选择,就意味着允许单元格原则。JTable自动更新三个绑定属性,以保持它们的一致性。 提醒:设置 cellSelect

16、ionEnabled 的值会附带同时设置 rowSelectionEnabled 和 columnSelectionEnabled 的效果。同样,设置后两者的值同样会影响 cellSelectionEnabled 的值。设置 row和 cloumn为不同值,同时设置 cell为 false,可以测试一下。 要获得当前的selection,使用 JTable.getSelectedRows,返回一个带索引行数的数组,使用 JTable.getSelectedColumns 返回 列索引。 要获得 lead selection 的坐标,需要引用table本身的 selection model 和

17、table 的 column model。下面代码格式化一个包含一个lead selection的行和列的字符串:Java代码 34 String.format(Lead Selection: %d, %d. , 35 table.getSelectionModel().getLeadSelectionIndex(), 36 table.getColumnModel().getSelectionModel().getLeadSelectionIndex(); 使用selections产生一些时间。参考 How to Write a List Selection Listener in the

18、Writing Event Listeners (5)创建表格模型 每个 table 对象 使用一个 table model 对象来管理表格中真实的数据。一个 table model 对象一定要实现 TableModel 接口,如果程序没有提供一个 table model 对象,JTable自动创建一个 DefaultTableModel实例。这种关系可用下面的图来解释 SimpleTableDemo 中 JTable 的构造器如下面代码一样,创建它的 table model:Java代码 37 new AbstractTableModel() 38 public String getColu

19、mnName(int col) 39 return columnNamescol.toString(); 40 41 public int getRowCount() return rowData.length; 42 public int getColumnCount() return columnNames.length; 43 public Object getValueAt(int row, int col) 44 return rowDatarowcol; 45 46 public boolean isCellEditable(int row, int col) 47 return

20、true; 48 public void setValueAt(Object value, int row, int col) 49 rowDatarowcol = value; 50 fireTableCellUpdated(row, col); 51 52 上面代码,简单的实现了一个 table model。通常在 AbstractTableModel 的子类中实现 table model。 你的模型可以支持 数组、vector 或 hash map类型的数据。甚至是从外资资源,如数据库中获得数据。他甚至可以在运行期间产生数据。 这个TableDemo.java例子中的表格与前面 Simp

21、leTableDemo 中的表格有几点区别: TableDemo的自定义 table model,即便它很简单,不过他可以轻松地确定数据的类型,帮助 JTable 用最好的格式展示数据。 SimpleTableDemo 自动创建的 table model, 并不知道 # of Years 一栏包括数字(需要右对齐且特殊格式),也不知道 Vegetarian 一栏包含用单选框表示的布尔值。 在 TableDemo 中实现的 table model 并不是让你编辑那些表示姓名的栏目,而是修改其他栏。在 SimpleTableDemo中,所有单元格都是可编辑的。观察 TableDemo.java 的

22、代码,粗体部分是区别于 SimpleTableDemo自动创建的 table model:Java代码 53 public TableDemo() 54 . 55 JTable table = new JTable(new MyTableModel(); 56 . 57 58 59 class MyTableModel extends AbstractTableModel 60 private String columnNames = ./same as before. 61 private Object data = ./same as before. 62 63 public int ge

23、tColumnCount() 64 return columnNames.length; 65 66 67 public int getRowCount() 68 return data.length; 69 70 71 public String getColumnName(int col) 72 return columnNamescol; 73 74 75 public Object getValueAt(int row, int col) 76 return datarowcol; 77 78 79 public Class getColumnClass(int c) 80 retur

24、n getValueAt(0, c).getClass(); 81 82 83 84 85 86 /* 87 * Dont need to implement this method unless your tables 88 * editable. 89 */ 90 public boolean isCellEditable(int row, int col) 91 /Note that the data/cell address is constant, 92 /no matter where the cell appears onscreen. 93 if (col 2) 94 retu

25、rn false; 95 else 96 return true; 97 98 99 100 101 102 103 /* 104 * Dont need to implement this method unless your tables 105 * data can change. 106 */ 107 public void setValueAt(Object value, int row, int col) 108 datarowcol = value; 109 fireTableCellUpdated(row, col); 110 111 . 112 (6)监听数据改变 一个 ta

26、ble model 可以有多个监听器,无论何时,只要表格数据被改变,都会通知这些监听器。监听器是TableModelListener 类的实例。在下面的例子代码中, SimpleTableDemo 增加了一个监听器,粗体部分是新的代码: Java代码 113 import javax.swing.event.*; 114 import javax.swing.table.TableModel; 115 116 117 118 119 public class SimpleTableDemo . implements TableModelListener 120 121 122 123 . 12

27、4 public SimpleTableDemo() 125 . 126 table.getModel().addTableModelListener(this); 127 128 129 . 130 131 132 public void tableChanged(TableModelEvent e) 133 int row = e.getFirstRow(); 134 int column = e.getColumn(); 135 TableModel model = (TableModel)e.getSource(); 136 String columnName = model.getC

28、olumnName(column); 137 Object data = model.getValueAt(row, column); 138 139 ./ Do something with the data. 140 141 142 143 . 144 (7)点燃数据改变事件 为了唤醒数据改变事件,table model一定要知道如果构造 TableModelEvent 对象。这是个复杂的过程,但是已经在 DefaultTableModel 中实现了。你可以让 JTable 使用他自己默认的 DefaultTableModel 实例,或者创建自定义的 DefaultTableModel 子

29、类。 如果 DefaultTableModel 不适合作为自定义 table model 类的基类,考虑使用 AbstractTableModel 作为基类。这个类实现了构造 TableModelEvent 对象的简单框架。(DefaultTableModel 是该抽象类的子类)当外界改变了表格数据的时候,你的自定义类仅仅需要调用 AbstractTableModel 方法中的一个,如下: Method ChangefireTableCellUpdatedUpdate of specified cell. 单元格更新fireTableRowsUpdatedUpdate of specified rows 行更新fireTableDataChangedUpdate of entire table (data only). 表格范围内的数据更新fireTableRowsInsertedNew rows inserted. 插入新行fireTableRowsDeletedExisting rows Deleted 删除存在的行fireTableStructureChanged Invalidat

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1