海妖 发表于 2015-1-18 11:52:45

JAVA教程之java中怎样完成表格的多表头显现

再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。显现起首声明,这些内容都是自创来的,略微修改了一下。
次要就是三个使用类ColumnGroup,GroupableTableHeader,GroupableTableHeaderU
和一个示例类GroupableHeaderExample
1、ColumnGroup类次要卖力多表头的构建
importjava.awt.Component;
importjava.awt.Dimension;
importjava.util.Enumeration;
importjava.util.Vector;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.UIManager;
importjavax.swing.table.DefaultTableCellRenderer;
importjavax.swing.table.JTableHeader;
importjavax.swing.table.TableCellRenderer;
importjavax.swing.table.TableColumn;
publicclassColumnGroup{
protectedTableCellRendererrenderer;
protectedVectorv;
protectedStringtext;
protectedintmargin=0;
publicColumnGroup(Stringtext){
this(null,text);
}
publicColumnGroup(TableCellRendererrenderer,Stringtext){
if(renderer==null){
this.renderer=newDefaultTableCellRenderer(){
publicComponentgetTableCellRendererComponent(JTabletable,
Objectvalue,booleanisSelected,booleanhasFocus,
introw,intcolumn){
JTableHeaderheader=table.getTableHeader();
if(header!=null){
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
this.setText((value==null)?"":value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
returnthis;
}
};
}else{
this.renderer=renderer;
}
this.text=text;
v=newVector();
}
/**
*@paramobj
*TableColumnorColumnGroup
*/
publicvoidadd(Objectobj){
if(obj==null){
return;
}
v.addElement(obj);
}
/**
*@paramc
*TableColumn
*@paramv
*ColumnGroups
*/
publicVectorgetColumnGroups(TableColumnc,Vectorg){
g.addElement(this);
if(v.contains(c))
returng;
Enumerationenumeration=v.elements();
while(enumeration.hasMoreElements()){
Objectobj=enumeration.nextElement();
if(objinstanceofColumnGroup){
Vectorgroups=(Vector)((ColumnGroup)obj).getColumnGroups(c,
(Vector)g.clone());
if(groups!=null)
returngroups;
}
}
returnnull;
}
publicTableCellRenderergetHeaderRenderer(){
returnrenderer;
}
publicObjectgetHeaderValue(){
returntext;
}
publicintgetSize(){
returnv==null?0:v.size();
}
publicDimensiongetSize(JTabletable){
Componentcomp=renderer.getTableCellRendererComponent(table,
getHeaderValue(),false,false,-1,-1);
intheight=comp.getPreferredSize().height;
intwidth=0;
Enumerationenumeration=v.elements();
while(enumeration.hasMoreElements()){
Objectobj=enumeration.nextElement();
if(objinstanceofTableColumn){
TableColumnaColumn=(TableColumn)obj;
width+=aColumn.getWidth();
width+=margin;
}else{
width+=((ColumnGroup)obj).getSize(table).width;
}
}
returnnewDimension(width,height);
}
/**
*
*创立日期:(2003-7-1410:53:26)
*
*@returnjava.lang.String
*/
publicjava.lang.StringgetText(){
returntext;
}
/**
*列表头中删除Column创立日期:(2002-9-2515:49:00)
*/
publicbooleanremoveColumn(ColumnGroupptg,TableColumntc){
booleanretFlag=false;
if(tc!=null){
for(inti=0;i<ptg.v.size();i++){
ObjecttmpObj=ptg.v.get(i);
if(tmpObjinstanceofColumnGroup){
retFlag=removeColumn((ColumnGroup)tmpObj,tc);
//假如找到前往
if(retFlag)
break;
}elseif(tmpObjinstanceofTableColumn){
//判别是不是查找的对象
if(tmpObj==tc){
ptg.v.remove(i);
retFlag=true;
break;
}
}
}
}
returnretFlag;
}
/**
*列表头中删除ColumnGrp删除前往true,不然前往false;创立日期:(2002-9-2515:49:00)
*/
publicbooleanremoveColumnGrp(ColumnGroupptg,ColumnGrouptg){
booleanretFlag=false;
if(tg!=null){
for(inti=0;i<ptg.v.size();i++){
ObjecttmpObj=ptg.v.get(i);
if(tmpObjinstanceofColumnGroup){
//判别是不是查找的对象
if(tmpObj==tg){
ptg.v.remove(i);
retFlag=true;
break;
}else{
retFlag=removeColumnGrp((ColumnGroup)tmpObj,tg);
//假如找到前往
if(retFlag)
break;
}
}elseif(tmpObjinstanceofTableColumn){
break;
}
}
}
returnretFlag;
}
publicvoidsetColumnMargin(intmargin){
this.margin=margin;
Enumerationenumeration=v.elements();
while(enumeration.hasMoreElements()){
Objectobj=enumeration.nextElement();
if(objinstanceofColumnGroup){
((ColumnGroup)obj).setColumnMargin(margin);
}
}
}
publicvoidsetHeaderRenderer(TableCellRendererrenderer){
if(renderer!=null){
this.renderer=renderer;
}
}
/**
*
*创立日期:(2003-7-1410:53:26)
*
*@paramnewText
*java.lang.String
*/
publicvoidsetText(java.lang.StringnewText){
text=newText;
}
}
2、GroupableHeader承继自JTableHeader,为多表头布局的办理者
importjava.util.Enumeration;
importjava.util.Vector;
importjavax.swing.table.JTableHeader;
importjavax.swing.table.TableColumn;
importjavax.swing.table.TableColumnModel;

/**
*GroupableTableHeader
*@authorflyx
*/
publicclassGroupableTableHeaderextendsJTableHeader{
privatestaticfinalStringuiClassID="GroupableTableHeaderUI";
protectedVectorcolumnGroups=null;
publicGroupableTableHeader(TableColumnModelmodel){
super(model);
setUI(newGroupableTableHeaderUI());
setReorderingAllowed(false);
setRequestFocusEnabled(false);
}
publicvoidaddColumnGroup(ColumnGroupg){
if(columnGroups==null){
columnGroups=newVector();
}
columnGroups.addElement(g);
}
/**
*
*创立日期:(2001-8-3115:54:29)
*/
publicvoidclearColumnGroups(){
columnGroups=null;
}
publicColumnGroup[]getColumnGroups(){
ColumnGroup[]retg=null;
if(columnGroups.size()>0){
retg=newColumnGroup;
columnGroups.copyInto(retg);
}
returnretg;
}
publicEnumerationgetColumnGroups(TableColumncol){
if(columnGroups==null)
returnnull;
Enumerationenum=columnGroups.elements();
while(enum.hasMoreElements()){
ColumnGroupcGroup=(ColumnGroup)enum.nextElement();
Vectorv_ret=(Vector)cGroup.getColumnGroups(col,newVector());
if(v_ret!=null){
returnv_ret.elements();
}
}
returnnull;
}
/**
*Identifieswhetherornotthiscomponentcanreceivethefocus.
*Adisabledbutton,forexample,wouldreturnfalse.
*
*@returntrueifthiscomponentcanreceivethefocus
*/
publicbooleanisFocusTraversable(){
returnsuper.isFocusTraversable()&&isRequestFocusEnabled();
}
publicvoidsetColumnMargin(){
if(columnGroups==null)
return;
intcolumnMargin=getColumnModel().getColumnMargin();
Enumerationenum=columnGroups.elements();
while(enum.hasMoreElements()){
ColumnGroupcGroup=(ColumnGroup)enum.nextElement();
cGroup.setColumnMargin(columnMargin);
}
}
publicvoidsetReorderingAllowed(booleanb){
reorderingAllowed=b;
}
}
3、GroupableTableHeaderUI承继自BasicTableHeaderUI,是多表头的画匠

importjava.awt.Component;
importjava.awt.Dimension;
importjava.awt.Graphics;
importjava.awt.Rectangle;
importjava.util.Enumeration;
importjava.util.Hashtable;
importjava.util.Vector;
importjavax.swing.JComponent;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.UIManager;
importjavax.swing.plaf.basic.BasicTableHeaderUI;
importjavax.swing.table.*;
/**
*多表头TableHeaderUI
*
*@authorflyx
*/
publicclassGroupableTableHeaderUIextendsBasicTableHeaderUI{
privateintm_height;
privateDimensioncreateHeaderSize(longwidth){
TableColumnModelcolumnModel=header.getColumnModel();
width+=columnModel.getColumnMargin()*columnModel.getColumnCount();
if(width>Integer.MAX_VALUE){
width=Integer.MAX_VALUE;
}
returnnewDimension((int)width,getHeaderHeight());
}
/**
*取得该多表头下的基础列数(zjb)递回创立日期:(02-4-818:03:56)
*
*@returnint
*@paramcg
*nc.ui.pub.beans.table.ColumnGroup
*/
privateintgetColCountUnderColGroup(ColumnGroupcg,intiCount){
Vectorv=cg.v;
for(inti=0;i<v.size();i++){
Objectobj=v.elementAt(i);
if(objinstanceofColumnGroup)
iCount=getColCountUnderColGroup((ColumnGroup)obj,iCount);
else
iCount++;
}
returniCount;
}
publicintgetHeaderHeight(){
intheight=0;
TableColumnModelcolumnModel=header.getColumnModel();
for(intcolumn=0;column<columnModel.getColumnCount();column++){
TableColumnaColumn=columnModel.getColumn(column);
TableCellRendererrenderer=aColumn.getHeaderRenderer();
//
if(renderer==null){
renderer=newDefaultTableCellRenderer(){
publicComponentgetTableCellRendererComponent(
JTabletable,Objectvalue,booleanisSelected,
booleanhasFocus,introw,intcolumn){
JTableHeaderheader=table.getTableHeader();
if(header!=null){
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
setText((value==null)?"":value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
returnthis;
}
};
}
//
Componentcomp=renderer.getTableCellRendererComponent(header
.getTable(),aColumn.getHeaderValue(),false,false,-1,
column);
intcHeight=comp.getPreferredSize().height;
Enumerationenumeration=((GroupableTableHeader)header)
.getColumnGroups(aColumn);
if(enumeration!=null){
while(enumeration.hasMoreElements()){
ColumnGroupcGroup=(ColumnGroup)enumeration
.nextElement();
cHeight+=cGroup.getSize(header.getTable()).height;
}
}
height=Math.max(height,cHeight);
}
height=Math.max(height,m_height);
returnheight;
}
publicDimensiongetPreferredSize(JComponentc){
longwidth=0;
Enumerationenumeration=header.getColumnModel().getColumns();
while(enumeration.hasMoreElements()){
TableColumnaColumn=(TableColumn)enumeration.nextElement();
width=width+aColumn.getWidth();
}
returncreateHeaderSize(width);
}
publicvoidpaint(Graphicsg,JComponentc){
RectangleclipBounds=g.getClipBounds();
if(header.getColumnModel()==null)
return;
((GroupableTableHeader)header).setColumnMargin();
intcolumn=0;
Dimensionsize=header.getSize();
RectanglecellRect=newRectangle(0,0,size.width,size.height);
Hashtableh=newHashtable();
intcolumnMargin=header.getColumnModel().getColumnMargin();
Enumerationenumeration=header.getColumnModel().getColumns();
while(enumeration.hasMoreElements()){
cellRect.height=size.height;
cellRect.y=0;
TableColumnaColumn=(TableColumn)enumeration.nextElement();
EnumerationcGroups=((GroupableTableHeader)header)
.getColumnGroups(aColumn);
if(cGroups!=null){
intgroupHeight=0;
while(cGroups.hasMoreElements()){
ColumnGroupcGroup=(ColumnGroup)cGroups.nextElement();
RectanglegroupRect=(Rectangle)h.get(cGroup);
if(groupRect==null){
groupRect=newRectangle(cellRect);
Dimensiond=cGroup.getSize(header.getTable());
if(!System.getProperty("java.vm.version").startsWith(
"1.2")){
intiColCount=getColCountUnderColGroup(cGroup,0);//取得该多表头下的基础列数(zjb)
//System.out.println(iColCount);
groupRect.width=d.width-iColCount
*columnMargin;
}else
groupRect.width=d.width;
groupRect.height=d.height;
h.put(cGroup,groupRect);
}
paintCell(g,groupRect,cGroup);
groupHeight+=groupRect.height;
cellRect.height=size.height-groupHeight;
cellRect.y=groupHeight;
}
}
if(!System.getProperty("java.vm.version").startsWith("1.2"))
cellRect.width=aColumn.getWidth();
else
cellRect.width=aColumn.getWidth()+columnMargin;
if(cellRect.intersects(clipBounds)){
paintCell(g,cellRect,column);
}
cellRect.x+=cellRect.width;
column++;
}
}
privatevoidpaintCell(Graphicsg,RectanglecellRect,intcolumnIndex){
TableColumnaColumn=header.getColumnModel().getColumn(columnIndex);
TableCellRendererrenderer=aColumn.getHeaderRenderer();
//
if(renderer==null){
renderer=newDefaultTableCellRenderer(){
publicComponentgetTableCellRendererComponent(JTabletable,
Objectvalue,booleanisSelected,booleanhasFocus,
introw,intcolumn){
JTableHeaderheader=table.getTableHeader();
if(header!=null){
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
setText((value==null)?"":value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
returnthis;
}
};
}
//
//Componentcomponent=
//renderer.getTableCellRendererComponent(header.getTable(),
//aColumn.getHeaderValue(),false,false,-1,columnIndex);
//
StringheaderValue=aColumn.getHeaderValue().toString();
Componentcomponent=renderer.getTableCellRendererComponent(header
.getTable(),headerValue,false,false,-1,columnIndex);

rendererPane.add(component);
rendererPane.paintComponent(g,component,header,cellRect.x,
cellRect.y,cellRect.width,cellRect.height,true);
}
privatevoidpaintCell(Graphicsg,RectanglecellRect,ColumnGroupcGroup){
TableCellRendererrenderer=cGroup.getHeaderRenderer();
//
if(renderer==null){
renderer=newDefaultTableCellRenderer(){
publicComponentgetTableCellRendererComponent(JTabletable,
Objectvalue,booleanisSelected,booleanhasFocus,
introw,intcolumn){
JTableHeaderheader=table.getTableHeader();
if(header!=null){
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
setText((value==null)?"":value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
returnthis;
}
};
}
//
//Componentcomponent=
//renderer.getTableCellRendererComponent(header.getTable(),
//cGroup.getHeaderValue(),false,false,-1,-1);
//
StringheaderValue=cGroup.getHeaderValue().toString();
Componentcomponent=renderer.getTableCellRendererComponent(header
.getTable(),headerValue,false,false,-1,-1);
rendererPane.add(component);
rendererPane.paintComponent(g,component,header,cellRect.x,
cellRect.y,cellRect.width,cellRect.height,true);
}
publicvoidsetHeaderHeight(intiHeight){
m_height=iHeight;
}
}
4、一个复杂的测试用例GroupableHeaderExample
importjava.awt.Color;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.table.DefaultTableModel;
importjavax.swing.table.JTableHeader;
importorg.f5.ui.table.ColumnGroup;
importorg.f5.ui.table.GroupableTableHeader;

/**
*@version1.011/09/98
*/
publicclassGroupableHeaderExampleextendsJFrame{
GroupableHeaderExample(){
super("GroupableHeaderExample");
initialize();
}
privatevoidinitialize(){
DefaultTableModeldm=newDefaultTableModel();
dm.setDataVector(newObject[][]{
{"119","foo","bar","ja","ko","zh"},
{"911","bar","foo","en","fr","pt"}},newObject[]{
"SNo.","1","2","Native","2","3"});
JTabletable=newJTable(dm){
protectedJTableHeadercreateDefaultTableHeader(){
returnnewGroupableTableHeader(columnModel);
}
};
GroupableTableHeaderheader=(GroupableTableHeader)table
.getTableHeader();
javax.swing.table.TableColumnModelcm=table.getColumnModel();
//承受范例
ColumnGroupg_jslx=newColumnGroup(
"吸收范例");
g_jslx.add(cm.getColumn(1));
g_jslx.add(cm.getColumn(2));
header.addColumnGroup(g_jslx);

JScrollPanescroll=newJScrollPane(table);
getContentPane().add(scroll);
setSize(400,120);
//设置列头背景为白色
header.setBackground(Color.RED);
}
publicstaticvoidmain(String[]args){
GroupableHeaderExampleframe=newGroupableHeaderExample();
frame.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
frame.setVisible(true);
}
}
5、最终效果
等我会贴图了再贴下去吧


再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。

小女巫 发表于 2015-1-21 16:39:50

是一种使用者不需花费很多时间学习的语言

山那边是海 发表于 2015-1-30 21:12:52

让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

admin 发表于 2015-2-4 21:48:17

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

蒙在股里 发表于 2015-2-7 06:53:18

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

精灵巫婆 发表于 2015-2-11 00:54:53

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

透明 发表于 2015-2-11 06:31:54

不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。

乐观 发表于 2015-2-26 21:44:11

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

兰色精灵 发表于 2015-3-2 20:42:38

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

老尸 发表于 2015-3-4 08:57:01

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

爱飞 发表于 2015-3-11 18:07:43

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

分手快乐 发表于 2015-3-11 22:10:09

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

海妖 发表于 2015-3-13 09:09:43

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

只想知道 发表于 2015-3-15 00:25:37

是一种为 Internet发展的计算机语言

仓酷云 发表于 2015-3-17 12:10:32

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

深爱那片海 发表于 2015-3-24 09:43:44

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

冷月葬花魂 发表于 2015-3-26 19:09:27

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

变相怪杰 发表于 2015-3-31 06:15:02

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

活着的死人 发表于 2015-4-6 12:22:13

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

因胸联盟 发表于 2015-4-15 16:59:48

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
页: [1]
查看完整版本: JAVA教程之java中怎样完成表格的多表头显现