简单讲就是在没有使用layout manager的时候用setSize,在使用了layout manager 的时候用setPreferredSize
并且setPreferredSize通常和setMinimumSize、setMaximumSize联系起来使用
setSize()是你手动来设置组件的大小
Dimension 类封装单个对象中组件的宽度和高度(精确到整数)。该类与组件的某个属性关联。由 Component 类和 LayoutManager 接口定义的一些方法将返回 Dimension 对象
setPreferredSize设置此组件的首选大小
一般会用setPreferredSize
table.changeSelection(row,0,false,false);
|
Returns the index of the first row whose selection may have changed. |
|
Returns the index of the last row whose selection may have changed. |
|
Returns whether or not this is one in a series of multiple events, where changes are still being made. |
|
Returns a |
http://melodyvictor.blog.163.com/blog/static/1180061572011417315978/
//设置是否可以选择此模型中的列。
jtabOrders.setColumnSelectionAllowed(false);
//设置是否可以选择此模型中的行。
jtabOrders.setRowSelectionAllowed(true);
//设置此表是否允许同时存在行选择和列选择。
jtabOrders.setCellSelectionEnabled(true);
|
selectionMode 属性的值:一次选择一个或多个连续的索引范围。 |
|
selectionMode 属性的值:一次选择一个连续的索引范围。 |
|
selectionMode 属性的值:一次选择一个列表索引。 |
编写该JTable的TableModel的String getColumnName(int columnIndex)方法
看了一篇实现JTable的列宽与内容的自适应 稍加修饰后如下:
http://www.blogjava.net/zeyuphoenix/archive/2010/04/08/317755.html
加载时选中多行:
JTable中列的排序:
排序有两个途径:
(1)为每列的值设置正确的类型,并且重写DefaultTableModel中的getColumnClass方法
因为Integer,Double实现了Comparator接口,即可正确排序
(2)table.setRowSorter(new TableRowSorter<TableModel>(model));
然后为每列指定特定的Comparator:
定义表的时候,选择按自定义算法排序的字段,如果不设置,默认按字符串的ASCII码排序
一个关于SWING的工程,当然会用到大量的表格最早清空表格是这样写的
// DefaultTableModel model = (DefaultTableModel) table.getModel();
// for (int i = model.getRowCount() - 1; i >= 0; i--) {
// model.removeRow(i);
// }
用这个方法是有问题的,因为是JTable >> TableModel >> TableData(Vector或String[])这样的映射关系,如果用上面的方法,如果数据增加或减少都不会通知TableModel ,就导致每次清数据就报数据越界异常ArrayIndexOutOfBoundsException。
如果直接清理数据是会通知上层的监听,改变模型
((DefaultTableModel) table.getModel()).getDataVector().clear(); //清除表格数据
((DefaultTableModel) table.getModel()).fireTableDataChanged();//通知模型更新
table.updateUI();//刷新表格
这样做了,程序好像是不出问题了,但是如果对表格做了排序操作,再看看,程序是不出错了,但是每加载一行,就看到表格会做一次排序,这个过程的开销很大,如果数据量大的话,甚至导致内存溢出。经过一天半的研究,跟踪,终于找到了问题所在,创建表的时候,引用了排序器,排序器的监听是一个独立于JTable >> TableModel >> TableData之外,又在后台影响着这三者之间的关系的一个人,在程序调试时,很难找到他在那里影响的,最终在JDK API里发现了一点端倪
javax.swing
类 RowSorter<M>
setSortKeys
颠倒指定列的排序顺序。调用此方法时,由子类提供具体行为。通常,如果指定列已经是主要排序列,则此方法将升序变为降序(或将降序变为升序);否则,使指定列成为主要排序列,并使用升序排序顺序。如果指定列不可排序,则此方法没有任何效果。
如果此方法导致更改排序顺序和排序操作,则它将发送适当的 RowSorterListener
通知。
参数:
column
- 要切换排序顺序的列,就底层模型而言
抛出:
IndexOutOfBoundsException
- 如果列超出底层模型的范围
上面这两个方法很像,但又有区别,我先用toggleSortOrder(int column) 这个column必须有一个有效的列号,就是说,不能用-1,这个方法是不能取消对表的排序选中的。那么另一个方法setSortKeys(List<? extendsRowSorter.SortKey> keys),这个就比较难了,我也不知道应该传什么参数,再看参数说明:null
是指定一个空列表的简写,表示视图应该是未排序的。“应该”两字说的实在是诡异,我就把它当成死马医,看看到底行不行,嘿嘿,通过方法:rowSort.setSortKeys(null);把表格还原到不排序的状态,就达到我想要的结果了,大功终于告成!
http://jingyan.baidu.com/article/fedf07377f003035ac8977c3.html
Java JTable 点击表头,能不能进行多列排序