Swing之JTable详解Word文件下载.docx

上传人:b****5 文档编号:21562340 上传时间:2023-01-31 格式:DOCX 页数:22 大小:25.37KB
下载 相关 举报
Swing之JTable详解Word文件下载.docx_第1页
第1页 / 共22页
Swing之JTable详解Word文件下载.docx_第2页
第2页 / 共22页
Swing之JTable详解Word文件下载.docx_第3页
第3页 / 共22页
Swing之JTable详解Word文件下载.docx_第4页
第4页 / 共22页
Swing之JTable详解Word文件下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

Swing之JTable详解Word文件下载.docx

《Swing之JTable详解Word文件下载.docx》由会员分享,可在线阅读,更多相关《Swing之JTable详解Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。

Swing之JTable详解Word文件下载.docx

java.awt.event.*;

java.util.*;

  public 

class 

SimpleTable{

   public 

SimpleTable(){

    JFrame 

f=new 

JFrame();

    Object[][] 

playerInfo={

    {"

阿呆"

new 

Integer(66),new 

Integer(32),new 

Integer(98),new 

Boolean(false)},

Integer(82),new 

Integer(69),new 

Integer(128),new 

Boolean(true)},

   };

 

   String[] 

Names={"

姓名"

"

语文"

数学"

总分"

及格"

};

   JTable 

table=new 

JTable(playerInfo,Names);

   table.setPreferredScrollableViewportSize(new 

Dimension(550,30));

   JScrollPane 

scrollPane=new 

JScrollPane(table);

   f.getContentPane().add(scrollPane,BorderLayout.CENTER);

   f.setTitle("

Simple 

Table"

);

   f.pack();

   f.show();

   f.addWindowListener(new 

WindowAdapter() 

{

    public 

void 

windowClosing(WindowEvent 

e) 

     System.exit(0);

    }

   });

  } 

static 

main(String[] 

args){

   SimpleTable 

b=new 

SimpleTable();

  }

表格由两部份组成:

分别是行标题(Column 

Header)与行对象(Column 

Object).利用JTable所提供的getTableHeader()方法取得行标题。

在这个例子中,我们将JTable放在JScrollPane中,这种做法可以将Column 

Header与Colmn 

Object完整的显示出来,因为JScrollPane会自动取得Column 

Header.但如果文坛读者将上面第15行去掉并修改第16行:

f.getContentPane().add(table,BorderLayout.CENTER);

则运行结果你会发现Column 

Header不见了。

如果你不想用JScrollPane,要解决这个问题,你必须将程序修改如下:

 JTable 

JTable(p,n);

  table.setPreferredScrollableViewportSize(new 

  f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);

  f.getContentPane().add(table,BorderLayout.CENTER);

运行结果就会跟之前一样有行标题了。

面的运行结果就会跟发现,每个字段的宽度都是一样的,除非你自行拉曳某个列宽。

若我们想一开始就设置列宽的值,可以利用TableColumn类所提供的setPreferredWidth()方法来设置,并可利用JTable类所提供的setAutoResizeMode()方法来设置调整某个列宽时其他列宽的变化情况,我们看下面这个例子:

 import 

javax.swing.table.*;

SimpleTable2{

SimpleTable2(){

p={

     {"

Integer(98),

     new 

Boolean(false),new 

Integer(128),

Boolean(true),new 

    };

    String[] 

n={"

作弊"

    TableColumn 

column=null;

    JTable 

    table.setPreferredScrollableViewportSize(new 

    table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);

    for 

(int 

i=0;

i<

6;

i++){

    //利用JTable中的getColumnModel()方法取得TableColumnModel对象;

    //再利用TableColumnModel界面所定义的getColumn()方法取

    //TableColumn对象,利用此对象的setPreferredWidth()方法就可以控制字段的宽度.

    column=table.getColumnModel().getColumn(i);

    if 

((i%2)==0)

     column.setPreferredWidth(150);

    else

     column.setPreferredWidth(50);

   }

   f.setVisible(true);

   new 

SimpleTable2();

列可调整的5个参数:

AUTO_RESIZE_SUBSEQUENT_COLUMENS:

当调整某一列宽时,此字段之后的所有字段列宽都会跟着一起变动。

此为系统默认值。

AUTO_RESIZE_ALL_COLUMNS:

当调整某一列宽时,此表格上所有字段的列宽都会跟着一起变动。

AUTO_RESIZE_OFF:

当调整某一列宽时,此表格上所有字段列宽都不会跟着改变。

AUTO_RESIZE_NEXT_COLUMN:

当调整某一列宽时,此字段的下一个字段的列宽会跟着改变,其余均不会变。

AUTO_RESIZE_LAST_COLUMN:

当调整某一列宽时,最后一个字段的列宽会跟着改变,其余均不会改变。

由以上范例可知,利用Swing来构造一个表格其实很简单的,只要你利用Vector或Array来作为我们表格的数据输入,将Vector或Array的内容填入JTable中,一个基本的表格就产生了。

不过,虽然利用JTable(Object[][] 

columnNames)以及JTable(Vector 

columnNames)构造函数来构造构造JTable很方便,但却有些缺点。

例如上例中,我们表格中的每个字段(cell)一开始都是默认为可修改的,用户因此可能修改到我们的数据;

其次,表格中每个单元(cell)中的数据类型将会被视为同一种。

在我们的例子中,数据类型皆被显示为String的类型,因此,原来的数据类型声明为Boolean的数据会以String的形式出现而不是以检查框(Check 

Box)出现。

除此之外,如果我们所要显示的数据是不固定的,或是随情况而变,例如同样是一份成绩单,老师与学生所看到的表格就不会一样,显示的外观或操作模式也许也不相同。

为了因应这些种种复杂情况,上面简单的构造方式已不宜使用,Swing提供各种Model(如:

TableModel、TableColumnModel与ListSelectionModel)来解决上述的不便,以增加我们设计表格的弹性。

我们下面就先对TableModel来做介绍:

2、TableModel

TableModel类本身是一个interface,在这个interface里面定义了若干的方法:

包括了存取表格字段(cell)的内容、计算表格的列数等等的基本存取操作,让设计者可以简单地利用TableModel来实作他所想要的表格。

TableModel界面是放在javax.swing.table 

package中,这个package定义了许多JTable会用到的各种Model,读者可利用java 

api文件找到这个package,并由此package找到各类或界面所定义的方法。

TableModel方法:

addTableModelListener(TableModelListener 

l):

使表格具有处理TableModelEvent的能力。

当表格的Table 

Model有所变化时,会发出TableModel 

Event事件信息。

Class 

getColumnClass(int 

columnIndex):

返回字段数据类型的类名称。

int 

getColumnCount():

返回字段(行)数量.

String 

getColumnName(int 

返回字段名称.

getRowCount():

返回数据列数量.

Object 

getValueAt(int 

rowIndex,int 

返回数据某个cell中的值.

boolean 

isCellEditable(int 

返回cell是否可编辑,true的话为可编辑.

removeTableModelListener(TableModelListener 

l):

从TableModelListener中移除一个listener.

setValueAt(Object 

aValue,int 

设置某个cell(rowIndex,columnIndex)的值;

由于TableModel本身是一个Interface,因此若要直接实现此界面来建立表格并不是件轻松的事.幸好java提供了两个类分别实现了这个界面,一个是AbstractTableModel抽象类,一个是DefaultTableModel实体类.前者实现了大部份的TableModel方法,让用户可以很有弹性地构造自己的表格模式;

后者继承前者类,是java默认的表格模式.这三者的关系如下所示:

TableModel---implements--->

AbstractTableModel-----extends--->

DefaultTableModel

3、AbstractTableModel:

java提供的AbstractTableModel是一个抽象类,这个类帮我们实现大部份的TableModel方法,除了getRowCount(),getColumnCount(),getValueAt()这三个方法外。

因此我们的主要任务就是去实现这三个方法.利用这个抽象类就可以设计出不同格式的表格.我们来看看它所提供的方法:

AbstractTableModel方法:

使表格具有处理TableModelEvent的能力.当表格的Table 

Model有所变化时,会发出TableModelEvent事件信息。

findColumn(String 

columnName):

寻找在行名称中是否含有columnName这个项目.若有,则返回其所在行的位置;

反之则返回-1表示未找到。

fireTableCellUpdated(int 

row, 

column):

通知所有的Listener在这个表格中的(row,column)字段的内容已经改变了。

fireTableChanged(TableModelEvent 

e):

将所收的事件通知传送给所有在这个table 

model中注册过的TableModelListeners。

fireTableDataChanged():

通知所有的listener在这个表格中列的内容已经改变了.列的数目可能已经改变了,因此JTable可能需要重新显示此表格的结构。

fireTableRowsDeleted(int 

firstRow, 

lastRow):

通知所有的listener在这个表格中第firstrow行至lastrow列已经被删除了。

fireTableRowsUpdated(int 

lastRow):

通知所有的listener在这个表格中第firstrow行至lastrow列已经被修改了。

fireTableRowsInserted(int 

通知所有的listener在这个表格中第firstrow行至lastrow列已经被加入了。

fireTableStructureChanged():

通知所有的listener在这个表格的结构已经改变了.行的数目,名称以及数据类型都可能已经改变了

columnIndex):

若没有设置列标题则返回默认值,依次为A,B,C,...Z,AA,AB,..;

若无此column,则返回一个空的String

Public 

EventListener[] 

getListeners(Class 

listenerType):

返回所有在这个table 

model所建立的listener中符合listenerType的listener,并以数组形式返回。

rowIndex, 

model所建立的listener中符合listenerType形式的listener,并以数组形式返回。

从TableModelListener中移除一个listener。

aValue, 

设置某个cell(rowIndex,columnIndex)的值。

若你仔细比较TableModel所定义的方法与上述AbstractTableModel所提供的方法,你可以发现,AbstractTableModel抽象类并没有实现getRowCount(),getColumnCount(),getValueAt()这三个方法,这也就是为什么我们要去实现这三个方法的原因。

下面我们来看如何使用AbstractTableModel来实作出自己想要的表格模式。

范例:

TableModel1.java

javax.swing.table.AbstractTableModel;

public 

TableModel1{

TableModel1() 

JFrame 

new 

MyTable 

mt=new 

MyTable();

JTable 

t=new 

JTable(mt);

t.setPreferredScrollableViewportSize(new 

Dimension(550, 

30));

JScrollPane 

JScrollPane(t);

f.getContentPane().add(s, 

BorderLayout.CENTER);

f.setTitle("

JTable1"

f.pack();

f.setVisible(true);

f.addWindowListener(new 

System.exit(0);

}

});

main(String 

args[]) 

TableModel1();

extends 

AbstractTableModel{

Object[][] 

{"

 

Integer(66), 

Integer(32), 

Integer(98), 

阿瓜"

Integer(85), 

Integer(69), 

Integer(154), 

Boolean(false)}, 

String[] 

"

getColumnCount() 

return 

n.length;

getRowCount() 

p.length;

col) 

n[col];

p[row][col];

c) 

getValueAt(0, 

c).getClass();

上例中表格内的数据类型不论是String,int或是Boolean类型,都均以string的类型显示.例如在及格的字段中,原本的数据是以Boolean类型来表示,但显示在JTable上时便转换成字符串形式,若想要使表格能显示出不同的数据类型,我们要在MyTable中Override写getColumnClass()方法,这个方法可以让我们分辨出表格中每一行的数据类型,并将此类型作适当的显示:

   return 

这样"

会以Check 

Box显示,数据类型一律靠右显示,String类型一律靠左显示。

TableModel2.java

TableModel2 

implements 

ActionListener{

null;

TableModel2() 

JFrame("

DataModel"

    JButton 

b1 

JButton("

数学老师"

    b1.addActionListener(this);

b2 

学生阿呆"

    b2.addActionListener(this);

    JPanel 

panel 

JPanel();

    panel.add(b1);

    panel.add(b2);

    t=new 

JTable(new 

MyTable

(1));

    t.setPreferredScrollableVi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

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

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