在TWaver的各个使用手册,文档和Demo中我们可以看到,TWaver提供了Layer的概念,就是图层,这与一些制图软件也有几分相似。在实际应用中也是比较的多。比如TWaver的Demo中有TWaver水印的字样,就是通过使用的TWaver层,将带有水印文字的图层自于最上方并不可选中。

下面我们再通过一个实际的例子具体来看看TWaver Layer的叠加效果,先上最终效果图:

这是一个使用TWaver Java制作的自动布局的例子,有人能看得出这里使用了多少个图层合并而成的吗?

呵呵,我们先来看看整体的一个布局:首先frame中添加了一个LayeroutPanel,panel中放了一个network,network中间部分是用于存放网元,连线,右半部分是scrollPanel

一.    Network的叠加

我们先来看看中间这个network的图层是如何叠加的

1.阴影层首先是在network的Cushion上添加了一个网元阴影层,cushion在TWaver的定义中是处于所有图层之下的一层。

network.addCanvasCushion(newShadowCushion(this));

阴影也可以这样添加。

2.网元层

在默认图层上添加布局的网元

1

this.cloud=this.createNode("/demo/layout/images/cloud.png");2this.center1=this.createNode("/demo/layout/images/center.png");3this.center2=this.createNode("/demo/layout/images/center.png");4this.gather1=this.createNode("/demo/layout/images/gather.png");5this.gather2=this.createNode("/demo/layout/images/gather.png");6this.router1=this.createNode("/demo/layout/images/router1.png",0,"Router 1");7this.router2=this.createNode("/demo/layout/images/router2.png",1,"Router 2");8this.server1=this.createNode("/demo/layout/images/pc.png",2,"Spring Layout");9this.server2=this.createNode("/demo/layout/images/pc.png",3,"Office Network");10this.server3=this.createNode("/demo/layout/images/pc.png",4,"US Map");11this.client1=this.createNode("/demo/layout/images/pc.png",5,"Bar Chart");12this.client2=this.createNode("/demo/layout/images/pc.png",6,"Tag Cloud");13this.client3=this.createNode("/demo/layout/images/pc.png",7,"Bus Layout");14this.createLink(gather1, client1);15this.createLink(gather1, client2);16this.createLink(gather1, client3);17this.createLink(gather2, server1);18this.createLink(gather2, server2);19this.createLink(gather2, server3);20this.createLink(cloud, center1);21this.createLink(cloud, center2);22this.createLink(router1, center1);23this.createLink(router2, center2);24this.createLink(router1, gather1);25this.createLink(router2, gather2);

TWaver提供了多种布局的效果,这是一个左树形布局,下面的toolbar上提供了更多的布局方式。

3.背景层

设置network背景图片,背景层也是处于所有数据层之下的一层,但是在cushion层之上

1

this.setImageBackground("/demo/layout/images/bottom.png");

4.顶层

添加top的图层节点,并设置图层为1

1

this.top=this.createNode("/demo/layout/images/top.png");2this.top.setLayerID("top");3Layer topLayer=newLayer("top");4topLayer.setMovable(false);5topLayer.setSelectable(false);6this.getDataBox().getLayerModel().addLayer(1, topLayer);

使用一个Node最为最上层的图片,哈哈,这也是TWaver中的一个使用技巧。

5.工具条层

添加toolbar图层并设置为1,这样toolbar的图层会在top层之上

this.toolbar=this.createNode("/demo/layout/images/toolbar.png");

this.toolbar.setLocation(21,68);

this.toolbar.setLayerID("toolbar");

Layer toolbarLayer=newLayer("toolbar");

toolbarLayer.setMovable(false);

toolbarLayer.setSelectable(false);

this.getDataBox().getLayerModel().addLayer(1, toolbarLayer);

工具条也是一张图片哦,哈哈,没想到吧!

工具条的动画效果

从上面分解中可以看出,工具条是叠加在top层之上的,这其中还有一个动画的效果,当鼠标移动到工具条所有的区域范围时,才会出现,移出并会隐藏。

1

this.getCanvas().addMouseMotionListener(newMouseMotionAdapter(){2

publicvoidmouseMoved(MouseEvent e){3

if(isAdjustingToolbar){4return;5        }6

if(toolbarBounds.contains(e.getPoint())){7

if(!toolbar.isVisible()){8                isAdjustingToolbar=true;9                toolbar.setVisible(true);10

                TWaverUtil.animateMove(toolbar, toolbar.getWidth(),0,newRunnable(){11

publicvoidrun(){12                        isAdjustingToolbar=false;13                    }14                });15            }16

        }else{17

if(toolbar.isVisible()){18                isAdjustingToolbar=true;19

                TWaverUtil.animateMove(toolbar,-toolbar.getWidth(),0,newRunnable(){20

publicvoidrun(){21                        toolbar.setVisible(false);22                        isAdjustingToolbar=false;23                    }24                });25            }26        }27    }28});

6.最终合并效果

最后twaver根据添加的这些图层顺序,就会在network上叠加出一个左半部分的效果,如下:

二.    ScrollPanel的叠加

看完network中间部分的叠加效果,我们再来看看这张图的右半部分scrollerPanel是如何叠加的

1. 组件层

这是最重要的放置内容面板的一层,里面放置了24个独立的组件。通过设置边框的范围让其只显示中间部分,每个独立的组件都可以单独操作:选中,移动,染色,tooltip…都可以呈现。

1

for(inti=0; i<24; i++){2JComponent component=null;3intindex=i%8;4

if(index==0){5       component=newRouter1();6}7

8

if(component!=null){9        component.setPreferredSize(CARDSIZE);10        component.setMaximumSize(CARDSIZE);11        component.setMinimumSize(CARDSIZE);12        component.setBounds(XGAP, i*CARDSIZE.height+YGAP, CARDSIZE.width-XGAP*2, CARDSIZE.height-YGAP*2);13this.add(component);14    }1516}

2.相框层

这是一个给每个组件设置相框的一个图层,首先我们需要相框图片

设置成透明效果,将其放置每个组件之上(除了最中间的component之外),最中间的再通过画笔画上上左下右的边框,这样这个相框就完成了

1

Rectangle rect=newRectangle(0, i*CARDSIZE.height, CARDSIZE.width, CARDSIZE.height);2

if(i!=(this.currentIndex+8)){3                g2.drawImage(CARDIMAGE, rect.x, rect.y, rect.width, rect.height,null);4

            }else{5                rect.grow(-XGAP+4,-YGAP+4);6                g2.setColor(Color.white);7                g2.setStroke(TWaverConst.BASIC_STROKE);89intd=8;10                g2.drawLine(rect.x, rect.y, rect.x+d*2, rect.y);11                g2.drawLine(rect.x, rect.y, rect.x, rect.y+d);1213                g2.drawLine(rect.x+rect.width, rect.y+rect.height, rect.x+rect.width-d*2, rect.y+rect.height);14                g2.drawLine(rect.x+rect.width, rect.y+rect.height, rect.x+rect.width, rect.y+rect.height-d);15            }

3.蒙版层

这是最上边的类似于蒙版的一层,通过两张上下透明的图片将其放置在scrollerPane的最上边一层

1

if(top){2    image=TWaverUtil.getImageIcon("/demo/layout/images/mist1.png");3

}else{4    image=TWaverUtil.getImageIcon("/demo/layout/images/mist2.png");5}6

JComponent canvas=newJComponent(){7

publicvoidpaintComponent(Graphics g){8super.paintComponent(g);9        g.drawImage(image.getImage(),0,0, image.getIconWidth(), image.getIconHeight(),null);10    }11};

蒙版层上也是有动画效果的,当鼠标点击上或下的蒙版,组件面板会自动上移或下移一个

4.最终叠加效果

这样两张图片一叠加就可以得到我们最开始提供的那种图了。

PS:这是一个网元图层的例子,在实际应用中,用户可以将网元设置在不同的layer上,由此来控制网元上下显示顺序。对于同一层上的图元,被选中的网元会处于其他网元之上。

附上源代码供大家学习分享:TopoDemo

java swing 图层_用Swing制作精美的图层叠加图相关推荐

  1. xmind添加父类主题_制作精美思维导图(Xmind)入门技巧篇

    作为一款头脑风暴和思维导图工具,XMIND能够协助用户快速捕捉创意与灵感,通过直观.友好的图形化操作界面,将思想.策略及商务信息转化为行动蓝图,全面提升企业办公效能:如果你以前没有使用过XMIND,本 ...

  2. java jtable刷新_使用Swing timer实现Jtable数据定时更新

    程序分三部分,主程序类SuperTable.java,框架类SuperTableFrame.java,数据模板类SuperTableModel.java. 主程序类SuperTable.java,如下 ...

  3. java 布局层次_[求助]swing问题---层次布局

    [求助]swing问题---层次布局 代码功能为:用两个按钮来控制组件的层次,一个是"往上一层",另一个是"往下一层",蓝色的代码为错误的! package m ...

  4. java swing列表_高级Swing——列表

    1. 列表 1.1 JList构件 JList可以将多个选项放置在单个框中.为了构建列表框,首先需要创建一个字符串数组,然后将这个数组传递给JList构造器. String[] words= { &q ...

  5. java swing 空白_用swing创建窗体运行后怎么一片空白,什么都没有

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我一边敲一边现学,不知道哪里错了,也是一样的空白 package homework; import javax.swing.*; import java. ...

  6. java jtable 颜色_更改Swing JTable单元格颜色

    我试图使自己熟悉JTables,TableModels,JTableHeaders,渲染器等.我试图制作一个简单的虚拟表(出于实践目的),如下所示: -    1    2   3 A    A1  ...

  7. java 奥运五环_用 canvas 制作奥运五环

    var bg = document.getElementById('xxb'); var ctx = bg.getContext('2d'); //第一个圆圈 ctx.beginPath(); ctx ...

  8. ai直线怎么变折线_用Illustrator制作简单的折线图

    1文档设置 新建一个文档,'将单位设置为px,在高和宽输入600px.点开高级按钮,将颜色模式设置为RGB,栅格效果 screen 72 ppi.将新建对象与网格对齐取消勾选.点击确定. 接下来我们要 ...

  9. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)

    规划或地理等相关专业的同学可能会遇到城市关系强度图的制作.我们主要介绍制图部分,至于城市间关系强度如何计算,请左转自行查文献或相关资料学习. ArcMap中有个XY转线(XY to Line)的GP工 ...

最新文章

  1. c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论
  2. 安装ubuntu时将boot目录单独挂载的意义
  3. 平安产险_平安产险史良洵:财产险未来三大机遇,新能源车险、非车险以及健康险...
  4. 【PAT乙级】1045 快速排序 (25 分)
  5. LoaderManager使用详解(一)---没有Loader之前的世界
  6. Beaglebone bootloader杂谈
  7. NS3官方参考资料manual和tutorial
  8. SQLi LABS Less 23 联合注入+报错注入+布尔盲注
  9. c++ c超简单的求公约数
  10. IBGP的自己下一跳,指定源命令。
  11. ActiveReports报表控件V11 SP1版本正式发布!
  12. cps评分和tps评分_一文总结:PD-1/PD-L1免疫检查点抑制剂和TPS、CPS、IPS
  13. python怎么统计单词总数_python统计单词
  14. 3dmax软件渲染模型导出JPG格式图片的方法
  15. android手机与电脑无线连接工具handshaker
  16. PPIO边缘云聚焦音视频底层技术,探索元宇宙“登月工程”
  17. 算法学习【1】三个空汽水瓶可以换一瓶汽水
  18. R语言和python语言的区别在什么地方,各自的应用场景是什么
  19. Python中pupl的基础操作
  20. 云南师范大学商学院计算机二级证书,云南师范大学商学院计算机科学和技术系.doc...

热门文章

  1. 转 程序员学习的革命-如何使用大脑
  2. jQuery——入门(二)动画
  3. js实现select跳转
  4. 关于OSI七层模型详细解释
  5. OpenCV3学习(6.1)——边缘检测---Canny,Sobel,Prewitt,Robert,Laplace,LOG,DOG算子
  6. 7-4 吃货的最短路径 (10 分)
  7. 7-66 计算工资 (15 分)
  8. 2015中缀表达式转化为后缀表达式(C++,附思路,注释多)
  9. STM32(三)-------流水灯(标准库函数)
  10. 不想用鸿蒙系统怎么办,华为鸿蒙系统出大BUG!网友:这再也不是用户想要的鸿蒙系统...