在运行时设置JTable的选项 |
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
在运行时设置JTable的选项概述 Java基础类(JFC)为创建一个精巧和交互的图形用户界面(GUIs)提供了丰富的组件选择。你可以使用 首先让我们定义一个最初的,基本的 相当简单!! 我们最初的 下一节,我们将致力于不同的 滚动表格 import javax.swing.table.*; dm.setDataVector(data, columnNames); 示范程序相当简单。我们通过下面的步骤构造了一个简单的 · 创建并设置
但是在这个代码里有一个曲解: 第四步加入了一个滚动面板。我们将构建的表格显示在一个
图 1. 杂乱的滚动 |
就像图1显示的那样,很难辨别任何列头或者是表格数据。虽然我们增加了滚动条,但水平滚动条没有显示。让我们详细的查看JTable
来揭示原因。JTable
有一个自动调整大小的模式,这将决定表格是否自动的调整列宽 (去覆盖表格的整个宽度) 以及如何进行调整。可以使用下面的值:
· AUTO_RESIZE_OFF: 不自动调整列宽; 使用滚动条
缺省情况下,JTable
调整其它列以保持总的外观,就像图1说明的那样。因此,如果我们想用水平滚动条显示列,我们需要给MyTable
添加一个方法并在构造函数里面调用它:
/**这个方法在需要的时候显示水平滚动条
* 两个构造函数都调用它
*/
public void showHorScroll(boolean show){
if (show){
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}else{
setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
}
}
图 2 显示了一个可见的水平滚动条:
图 2. 可见的水平滚动条 |
控制JTable 的列
你可以控制列的宽度,也可以使它们不可调整,这一节展示该如何做。
加宽列
通常你想让一个列必另一个更宽或更窄。要改变列的宽度,你可以使用TableColumnModel
:
/**这个方法设置pColumn指示的列的宽度为pWidth
*/
public void setColumnWidth(int pColumn, int pWidth){
//得到列的样式
TableColumnModel colModel = getColumnModel();
//得到pColumn列然后设置它的最佳宽度
colModel.getColumn(pColumn).setPreferredWidth(pWidth);
}
你也可以给Jframe增加一个按钮以及它的监听器
,点击按钮改变表格的宽度:
JButton resizeButton = new JButton("Resize Third Column");
setResizeButton.addActionListener(this);
public void actionPerformed(ActionEvent e){
//检查是哪一个按钮被点击
if (e.getActionCommand().equals("Resize Third Column")){
System.out.println("Resize called - resizes third column
to 300");
table.setColumnWidth(2, 300);
//强制GUI刷新
table.invalidate();
frame.invalidate();
frame.validate();
frame.repaint();
}
在这个例子中, pColumn
是列的索引值,pWidth
是新的列宽。点击Resize 按钮的效果显示为图3 和 4。
图 3. 点击前 |
图四 4. 点击后 |
不可变列
对于通常的应用,你可以拖动列头调整列的大小。下面的代码根据pIsResize 的值设置表格的调整性。如果pIsResize
为true, 列宽可以调整;否则不能:
public void setResizable(int pColumn, boolean pIsResize){
//得到列的样式
TableColumnModel colModel = getColumnModel();
//设置可调整性
colModel.getColumn(pColumn).setResizable(pIsResize);
}
在这个例子中, pColumn
是不可调整列的索引值。得到列(getColumn(..)
)然后设置一个简单的属性 (setResizable(..)
) 就是全部要做的。
列的选择性
为什么不在点击按钮时选中整列而不只是一个单元? JTable
通过调用单元的isCellSelected(int row, int col)方法显示该单元是否被选中。重载这个方法可以给你想要的结果,结果和传递到setSelect(
int col, boolean select)的参数
select有关。如果为false, 将不被选中。关键是将该列设置为colSelect()
, 用"select" 标记指明该列是被选中还是取消选中:
int colSelect;
boolean select;
/** 设置列col 为选中或取消选中
* -根据select决定
*/
public void setSelect(int col, boolean select){
colSelect = col;
this.select = select;
}
/**这个方法返回某个单元是否被选中
*/
public boolean isCellSelected(int row, int column)
throws IllegalArgumentException{
//重载verride the method for the column set in setSelect()
if (colSelect == column){
if (select)
return true;
else
return false;
} else {
return super.isCellSelected(row, column);
}
}
图 5 显示了Column D 被选中的结果。
图 5. 选中整列 |
控制列头
你可能注意到第一列列头的长度比列宽大。我们通过重设列宽来处理这个:
/**根据列头文本的宽度设置列头和列的大小
*/
public void setHeaderSize(int pColumn){
//得到指定列的名字
String value = getColumnName(pColumn);
//计算列宽
FontMetrics metrics = getGraphics().getFontMetrics();
int width = metrics.stringWidth(value) +
(2*getColumnModel().getColumnMargin());
//设置宽度
setColumnWidth(pColumn, width);
}
上面的代码被执行后重设列头的结果显示在图6中。
图 6. 完全可见的列头 |
特性丰富的JTable
在这个技巧中,我们在简单的Jtable 上
测试了不同的选项,并且在表格被显示后改变那些选项。在这个过程中,我们开发了一个能提供丰富的用户界面能力的表格。研究JTable
's 的其它属性看看你能创建一个什么样的有趣表格!