表格(table)的使用与介绍
8-1:使用jtable组件:
类层次结构图:
java.lang.object
--java.awt.component
--java.awt.container
--javax.swing.jcomponent
--javax.swing.jtabel
在使用jtable以前,我们先看一下它的构造函数有哪些, 以及应该如何使用:
jtabel构造函数:
jtable():建立一个新的jtables,并使用系统默认的model.
jtable(int numrows,int numcolumns):建立一个具有numrows行,numcolumns列的空表格,使用的是defaulttablemodel.
jtable(object[][] rowdata,object[][] columnnames):建立一个显示二维数组数据的表格,且可以显示列的名称。
jtable(tablemodel dm):建立一个jtable,有默认的字段模式以及选择模式,并设置数据模式。
jtable(tablemodel dm,tablecolumnmodel cm):建立一个jtable,设置数据模式与字段模式,并有默认的选择模式。
jtable(tablemodel dm,tablecolumnmodel cm,listselectionmodel sm):建立一个jtable,设置数据模式、字段模式、与选择模式。
jtable(vector rowdata,vector columnnames):建立一个以vector为输入来源的数据表格,可显示行的名称。
我们先以array构造方式,说明如何利用jtable来建立一个简单的表格:
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.util.*;
5 public class simpletable{
6 public simpletable(){
7 jframe f=new jframe();
8 object[][] playerinfo={
9 {"阿呆",new integer(66),new integer(32),new integer(98),new boolean(false)},
10 {"阿呆",new integer(82),new integer(69),new integer(128),new boolean(true)},
11 };
12 string[] names={"姓名","语文","数学","总分","及格"};
13 jtable table=new jtable(playerinfo,names);
14 table.setpreferredscrollableviewportsize(new dimension(550,30));
15 jscrollpane scrollpane=new jscrollpane(table);
16 f.getcontentpane().add(scrollpane,borderlayout.center);
17 f.settitle("simple table");
18 f.pack();
19 f.show();
20 f.addwindowlistener(new windowadapter() {
21 public void windowclosing(windowevent e) {
22 system.exit(0);
23 }
24 });
24 }
25 public static void main(string[] args){
26 simpletable b=new simpletable();
27 }
28 }
jtable table=new jtable(p,n);
table.setpreferredscrollableviewportsize(new dimension(550,30));
f.getcontentpane().add(table.gettableheader(),borderlayout.north);
f.getcontentpane().add(table,borderlayout.center);
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class simpletable2{
public simpletable2(){
jframe f=new jframe();
object[][] p={
{"阿呆",new integer(66),new integer(32),new integer(98),new boolean(false),new boolean(false)},
{"阿呆",new integer(82),new integer(69),new integer(128),new boolean(true),new boolean(false)},
};
string[] n={"姓名","语文","数学","总分","及格","作弊"};
tablecolumn column=null;
jtable table=new jtable(p,n);
table.setpreferredscrollableviewportsize(new dimension(550,30));
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);
}
jscrollpane scrollpane=new jscrollpane(table);
f.getcontentpane().add(scrollpane,borderlayout.center);
f.settitle("simple table");
f.pack();
f.show();
f.setvisible(true);
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
public static void main(string[] args){
new simpletable2();
}
}
import javax.swing.table.abstracttablemodel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class tablemodel1{
public tablemodel1() {
jframe f = new jframe();
mytable mt=new mytable();
jtable t=new jtable(mt);
t.setpreferredscrollableviewportsize(new dimension(550, 30));
jscrollpane s = new jscrollpane(t);
f.getcontentpane().add(s, borderlayout.center);
f.settitle("jtable1");
f.pack();
f.setvisible(true);
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
public static void main(string args[]) {
new tablemodel1();
}
}
class mytable extends abstracttablemodel{
object[][] p = {
{"阿呆", new integer(66),
new integer(32), new integer(98), new boolean(false),new boolean(false)},
{"阿瓜", new integer(85),
new integer(69), new integer(154), new boolean(true),new boolean(false)},
};
string[] n = {"姓名",
"语文",
"数学",
"总分",
"及格",
"作弊"};
public int getcolumncount() {
return n.length;
}
public int getrowcount() {
return p.length;
}
public string getcolumnname(int col) {
return n[col];
}
public object getvalueat(int row, int col) {
return p[row][col];
}
public class getcolumnclass(int c) {
return getvalueat(0, c).getclass();
}
}
public class getcolumnclass(int c) {
return getvalueat(0, c).getclass();
}import javax.swing.table.abstracttablemodel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class tablemodel2 implements actionlistener{
jtable t = null;
public tablemodel2() {
jframe f = new jframe("datamodel");
jbutton b1 = new jbutton("数学老师");
b1.addactionlistener(this);
jbutton b2 = new jbutton("学生阿呆");
b2.addactionlistener(this);
jpanel panel = new jpanel();
panel.add(b1);
panel.add(b2);
t=new jtable(new mytable(1));
t.setpreferredscrollableviewportsize(new dimension(550, 30));
jscrollpane s = new jscrollpane(t);
f.getcontentpane().add(panel, borderlayout.north);
f.getcontentpane().add(s, borderlayout.center);
f.pack();
f.setvisible(true);
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
public void actionperformed(actionevent e)
{
if (e.getactioncommand().equals("学生阿呆"))
t.setmodel(new mytable(1));
if (e.getactioncommand().equals("数学老师"))
t.setmodel(new mytable(2));
t.revalidate();
}
public static void main(string args[]) {
new tablemodel2();
}
}
class mytable extends abstracttablemodel{
object[][] p1 = {
{"阿呆", "1234",new integer(66),
new integer(50), new integer(116), new boolean(false),new boolean(false)}};
string[] n1 = {"姓名","学号","语文","数学","总分","及格","作弊"};
object[][] p2 = {
{"阿呆", "1234",new integer(50), new boolean(false),new boolean(false),"01234"},
{"阿瓜", "1235",new integer(75), new boolean(true),new boolean(false),"05678"}};
string[] n2 = {"姓名","学号","数学","及格","作弊","电话"};
int model = 1;
public mytable(int i){
model = i;
}
public int getcolumncount() {
if(model ==1)
return n1.length;
else
return n2.length;
}
public int getrowcount() {
if(model ==1)
return p1.length;
else
return p2.length;
}
public string getcolumnname(int col) {
if(model ==1)
return n1[col];
else
return n2[col];
}
public object getvalueat(int row, int col) {
if(model == 1)
return p1[row][col];
else
return p2[row][col];
}
public class getcolumnclass(int c) {
return getvalueat(0, c).getclass();
}
}
import javax.swing.table.abstracttablemodel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class columnmodeltest{
public columnmodeltest() {
jframe f = new jframe();
/*由于我们的mytable类继承了abstracttablemodel并且实作了getcolmuncount(),getrowcount(),getvalueat()方法.因此我们可以通
*过mytable来产生tablemodel的实体.
*/
mytable mt=new mytable();
jtable t=new jtable(mt);//我们利用mytable来建立jtable.
jcombobox c = new jcombobox();//建立一个jcombobox的对象.
c.additem("taipei");//我们在新建立的jcombobox对象里新增三个项目.
c.additem("chiayi");
c.additem("hsinchu");
/*我们利用jtable所提供的gettablecolumnmodel()方法取得tablecolumnmodel对象,再由tablecolumnmodel类所提供的getcolumn()方
*法取得tablecolumn对象,tablecolumn类可针对表格中的每一行做具体的设置,例如设置字段的宽度,某行的标头,设置输入较复杂的
*数据类型等等.在这里,我们利用tablecolumn类所提供的setcelleditor()方法,将jcombobox作为第二行的默认编辑组件.
*/
t.getcolumnmodel().getcolumn(1).setcelleditor(new defaultcelleditor(c));
t.setpreferredscrollableviewportsize(new dimension(550, 30));
jscrollpane s = new jscrollpane(t);
f.getcontentpane().add(s, borderlayout.center);
f.settitle("columnmodeltest");
f.pack();
f.setvisible(true);
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
public static void main(string args[]) {
new columnmodeltest();
}
}
class mytable extends abstracttablemodel{
object[][] p = {
{"阿呆", "taipei",new integer(66),
new integer(32), new integer(98), new boolean(false),new boolean(false)},
{"阿瓜", "chiayi",new integer(85),
new integer(69), new integer(154), new boolean(true),new boolean(false)},
};
string[] n = {"姓名",
"居住地",
"语文",
"数学",
"总分",
"及格",
"作弊"};
public int getcolumncount() {
return n.length;
}
public int getrowcount() {
return p.length;
}
public string getcolumnname(int col) {
return n[col];
}
public object getvalueat(int row, int col) {
return p[row][col];
}
public class getcolumnclass(int c) {
return getvalueat(0, c).getclass();
}
/*public boolean iscelleditable(int rowindex, int columnindex) {
return true;
}
public void setvalueat(object value, int row, int col) {
p[row][col] = value;
firetablecellupdated(row, col);
}*/
}
public void setvalueat(object value,int row,int col){
p[row][col]=value;
firetablecellupdated(row,col);
}import java.awt.*;说明:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class selectionmodeldemo implements actionlistener,listselectionlistener{
jtable table=null;
listselectionmodel selectionmode=null;
jlabel label=null;//显示用户选取表格之用
public selectionmodeldemo(){
jframe f=new jframe();
string[] name={"字段1","字段2","字段3","字段4","字段5"};
string[][] data=new string[5][5];
int value=1;
for(int i=0;i<data.length;i++){
for (int j=0;j<data.length;j++){
data[j]=string.valueof(value++);
}
}
table=new jtable(data,name);
table.setpreferredscrollableviewportsize(new dimension(400,80));
table.setcellselectionenabled(true);//使得表格的选取是以cell为单位,而不是以列为单位.若你没有写此行,则在选取表格数
//据时以整列为单位.
selectionmode=table.getselectionmodel();//取得table的listselectionmodel.
selectionmode.addlistselectionlistener(this);
jscrollpane s=new jscrollpane(table);
jpanel panel=new jpanel();
jbutton b=new jbutton("单一选择");
panel.add(b);
b.addactionlistener(this);
b=new jbutton("连续区间选择");
panel.add(b);
b.addactionlistener(this);
b=new jbutton("多重选择");
panel.add(b);
b.addactionlistener(this);
label=new jlabel("你选取:");
container contentpane=f.getcontentpane();
contentpane.add(panel,borderlayout.north);
contentpane.add(s,borderlayout.center);
contentpane.add(label,borderlayout.south);
f.settitle("selectionmodeldemo");
f.pack();
f.setvisible(true);
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
/*处理按钮事件,利用listselectionmodel界面所定义的setselectionmode()方法来设置表格选取模式.*/
public void actionperformed(actionevent e){
if (e.getactioncommand().equals("单一选择"))
selectionmode.setselectionmode(listselectionmodel.single_selection);
if (e.getactioncommand().equals("连续区间选择"))
selectionmode.setselectionmode(listselectionmodel.single_interval_selection);
if (e.getactioncommand().equals("多重选择"))
selectionmode.setselectionmode(listselectionmodel.multiple_interval_selection);
table.revalidate();
}
/*当用户选取表格数据时会触发listselectionevent,我们实现listselectionlistener界面来处理这一事件.listselectionlistener界
*面只定义一个方法,那就是valuechanged().
*/
public void valuechanged(listselectionevent el){
string tempstring="";
//jtable的getselectedrows()与getselectedcolumns()方法会返回已选取表格cell的index array数据.
int[] rows=table.getselectedrows();
int[] columns=table.getselectedcolumns();
//jtable的getvalueat()方法会返回某行的cell数据,返回值是object数据类型,因此我们要自行转成string数据类型.
for (int i=0;i<rows.length;i++){
for (int j=0;j<columns.length;j++)
tempstring = tempstring+" "+(string)table.getvalueat(rows, columns[j]);
}
label.settext("你选取:"+tempstring);
}
public static void main(string[] args){
new selectionmodeldemo();
}
}
import java.awt.*;
import java.awt.event.*;
import java.util.vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class addremovecells implements actionlistener
{
jtable table = null;
defaulttablemodel defaultmodel = null;
public addremovecells()
{
jframe f = new jframe();
string[] name = {"字段 1","字段 2","字段 3","字段 4","字段 5"};
string[][] data = new string[5][5];
int value =1;
for(int i=0; i<data.length; i++)
{
for(int j=0; j<data.length ; j++)
data[j] = string.valueof(value++);
}
defaultmodel = new defaulttablemodel(data,name);
table=new jtable(defaultmodel);
table.setpreferredscrollableviewportsize(new dimension(400, 80));
jscrollpane s = new jscrollpane(table);
jpanel panel = new jpanel();
jbutton b = new jbutton("增加行");
panel.add(b);
b.addactionlistener(this);
b = new jbutton("增加列");
panel.add(b);
b.addactionlistener(this);
b = new jbutton("删除行");
panel.add(b);
b.addactionlistener(this);
b = new jbutton("删除列");
panel.add(b);
b.addactionlistener(this);
container contentpane = f.getcontentpane();
contentpane.add(panel, borderlayout.north);
contentpane.add(s, borderlayout.center);
f.settitle("addremovecells");
f.pack();
f.setvisible(true);
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
/*要删除列必须使用tablecolumnmodel界面定义的removecolumn()方法。因此我闪先由jtable类的getcolumnmodel()方法取得
*tablecolumnmodel对象,再由tablecolumnmodel的getcolumn()方法取得要删除列的tablecolumn.此tablecolumn对象当作是
*removecolumn()的参数。删除此列完毕后必须重新设置列数,也就是使用defaulttablemodel的setcolumncount()方法来设置。
*/
public void actionperformed(actionevent e)
{
if(e.getactioncommand().equals("增加列"))
defaultmodel.addcolumn("增加列");
if(e.getactioncommand().equals("增加行"))
defaultmodel.addrow(new vector());
if(e.getactioncommand().equals("删除列"))
{
int columncount = defaultmodel.getcolumncount()-1;
if(columncount >= 0)//若columncount<0代表已经没有任何列了。
{
tablecolumnmodel columnmodel = table.getcolumnmodel();
tablecolumn tablecolumn = columnmodel.getcolumn(columncount);
columnmodel.removecolumn(tablecolumn);
defaultmodel.setcolumncount(columncount);
}
}
if(e.getactioncommand().equals("删除行"))
{
int rowcount = defaultmodel.getrowcount()-1;//getrowcount返回行数,rowcount<0代表已经没有任何行了。
if(rowcount >= 0)
{
defaultmodel.removerow(rowcount);
defaultmodel.setrowcount(rowcount);//删除行比较简单,只要用defaulttablemodel的removerow()方法即可。删除
//行完毕后必须重新设置列数,也就是使用defaulttablemodel的setrowcount()方法来设置。
}
}
table.revalidate();
}
public static void main(string args[]) {
new addremovecells();
}
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器