分享
 
 
 

在运行时设置JTable的选项

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在运行时设置JTable的选项

概述

Jtable类提供丰富的网格数据显示功能。这个技巧处理有关动态改变诸如滚动条,列宽以及行高等通常的外观的问题 。 (900 words; 九月14, 2001) (九月 20,2001译)

Java基础类(JFC)为创建一个精巧和交互的图形用户界面(GUIs)提供了丰富的组件选择。你可以使用javax.swing.JTable 显示表格式的数据。在这个技巧中,我们研究如何JTable 的常见问题。

首先让我们定义一个最初的,基本的Jtable类――MyTable:

import javax.swing.table.*;

import javax.swing.*;

import java.awt.*;

public class MyTable extends JTable{

//缺省构造函数

public MyTable(){

super();

}

//使用指定的行列数创建表格的构造函数

public MyTable(int row, int col){

super(row, col);

}

}

相当简单!! 我们最初的 MyTable 实现就是一个普通的Jtable 。

下一节,我们将致力于不同的JTable 显示选项――例如滚动条,列宽,选择性以及其它一些属性。我们将扩充MyTable 并且合并一些不同的方法使得它支持我们想要的显示特性。每一节增加一个新方法到MyTable ,最后我们得到一个可完全复用的Jtable 。

滚动表格

首先,让我们的JTable 显示一些表格式的数据。我创建TableColumnTest示范Jtable 的能力:

import javax.swing.table.*;

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

/**Author Sonal Goyal, sonal_goyal@hotmail.com

*/

public class TableColumnTest{

protected JFrame frame;

protected JScrollPane scrollpane;

protected MyTable table;

public TableColumnTest(){

//(1) 创建表格模型。

DefaultTableModel dm = new DefaultTableModel();

// 每列的名字

String[] columnNames = {

"This is going to be a really long column header",

"Column B", "Column C", "Column D", "Column E", "Column F",

"Column G", "Column H", "Column I", "Column J"

};

// 实际的数据值

Integer[][] data = new Integer[8][10];

// 初始化数据矩阵。

for (int row = 0; row < 8; row++){

for (int col = 0; col < 10; ++col){

data[row][col] = new Integer(1000000);

}

}

// 设置模型和数据及列头关联

dm.setDataVector(data, columnNames);

//(2) 创建表格

table = new MyTable();

//(3) 连接模型和表格

table.setModel(dm);

//(4) 为表格创建滚动面板

scrollpane = new JScrollPane(table);

//(5) 显示表格

frame = new JFrame();

frame.getContentPane().add(scrollpane);

frame.setSize(200, 150);

frame.setVisible(true);

}

public static void main(String[] args){

TableColumnTest test = new TableColumnTest();

}

示范程序相当简单。我们通过下面的步骤构造了一个简单的JTable:

· 创建并设置TableModel, 它包含行,列,列头以及数据数据的信息

创建并设置JTable, 它根据模型显示数据

将JTable 和第一步创建的模型关联

但是在这个代码里有一个曲解: 第四步加入了一个滚动面板。我们将构建的表格显示在一个Jframe里面; 参看图1

图 1. 杂乱的滚动

就像图1显示的那样,很难辨别任何列头或者是表格数据。虽然我们增加了滚动条,但水平滚动条没有显示。让我们详细的查看JTable 来揭示原因。JTable 有一个自动调整大小的模式,这将决定表格是否自动的调整列宽 (去覆盖表格的整个宽度) 以及如何进行调整。可以使用下面的值:

· AUTO_RESIZE_OFF: 不自动调整列宽; 使用滚动条

AUTO_RESIZE_NEXT_COLUMN: 当一列被调整,反向调整下一列

AUTO_RESIZE_SUBSEQUENT_COLUMNS: 在调整时改变后续列以保持总的宽度

AUTO_RESIZE_LAST_COLUMN: 在所有的调整操作上只将调整应用到最后一列

AUTO_RESIZE_ALL_COLUMNS: 在所有的调整操作上成比例的调整所有的列。

缺省情况下,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 的其它属性看看你能创建一个什么样的有趣表格!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有