第5章+边框

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第5章边框、图标和动作本章介绍Swing的三种实用工具:边框、图标和动作。边框绘制在组件的边界周围,它有许多不同的各类:线边框、雕刻边框、不光滑的边框等等。边框本身不是组件,所以,它们绘制在指定组件的边衬中。图标是图形对象,通常是一个小图像。与边框一样,图标在指定组件的指定位置上绘制。动作封装图形用户界面的一个逻辑操作,并且还简化用户界面元素的构造工作。动作通常由一个或多个图标或文本字符串组成。可以把动作添加到某些容器中,这些容器创建一个组件与这个动作相关联。例如,利用JMenu.add(Action)方法,可把动作添加到一个菜单中。当一个动作添加到一个菜单中时,这个菜单用与这个动作相关联的文本和图标来创建一个菜单项并把这个菜单项添加到菜单中。边框、图标和动作都是很有意义的,因为它们都可以与多个组件相关联。由于边框和图标都不是组件,但却都能绘制到组件中,所以,可以在支持使用边框和图标的多个组件中共享边框和图标。动作也必须被多个组件所共享,并且用来作为控制的中心点以维护与这个动作相关联的组件的启用状态。5.1边框通过构造所需类型的边框,然后把这个边框传送给JComponent.setBorder(Border),所有JComponent扩展(JViewport除外)都可以有边框。虽然每个组件可以只有一个边框,但Swing支持组合边框。因此,在实际应用中,单个组件可以使数个边框嵌套在一起,使边框有一定的深度。边框的使用很简单。例如,图5-1示出了一个带标题边框的JPanel实例。图5-1一个带标题边框的JPanel实例例5-1例出了图5-1所示的小应用程序的代码。例5-1一个带边框的JPanel的小应用程序importjava.awt.BorderLayout;importjavax.swing.*;importjavax.swing.border.*;publicclassTestextendsJApplet{publicvoidinit(){JPanelpanel=newJPanel();panel.setBorder(newTitledBorder(JPanelBorder));getContentPane().add(panel,BorderLayout.CENTER);}}这个小应用程序创建一个带标题的边框,这个边框传递给面板的setBorder方法。5.1.1边框和边衬AWT容器有一个insets属性,它定义容器的边衬。布局管理器仔细地布局一个容器中的各个组件,以便这些组件不会侵占这个容器的边衬区。容器的insets属性是一个只读属性,修改AWT容器insets属性唯一的方法是子类化一个容器并重载它的getInsets方法。5.1.2Swing的边框类型例5-2显示所有Swing边框类型的小应用程序importjava.awt.*;importjavax.swing.*;importjavax.swing.border.*;publicclassTestextendsJApplet{publicvoidinit(){JPaneljpanel=newAllBordersPanel();getContentPane().add(jpanel,BorderLayout.CENTER);}}classAllBordersPanelextendsJPanel{publicAllBordersPanel(){JPanelbl=newPanelWithTitle(BevelLowered),br=newPanelWithTitle(BevelRaised),c=newPanelWithTitle(Compound),l=newPanelWithTitle(Line),m=newPanelWithTitle(Matte),e=newPanelWithEmptyBorder(Empty),t=newPanelWithTitle(Titled),sbr=newPanelWithTitle(SoftBevelRaised),sbl=newPanelWithTitle(SoftBevelLowered),el=newPanelWithTitle(EtchedLowered),er=newPanelWithTitle(EtchedRaised);setLayout(newGridLayout(4,3,2,2));ImageIconicon=newImageIcon(this.getClass().getResource(smiley.gif));Dimensioniconsz=newDimension(icon.getIconWidth(),icon.getIconHeight());bl.setBorder(BorderFactory.createLoweredBevelBorder());br.setBorder(BorderFactory.createRaisedBevelBorder());sbr.setBorder(newSoftBevelBorder(BevelBorder.RAISED));sbl.setBorder(newSoftBevelBorder(BevelBorder.LOWERED));t.setBorder(BorderFactory.createTitledBorder(Titled));l.setBorder(BorderFactory.createLineBorder(Color.black,2));c.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.gray,10),BorderFactory.createRaisedBevelBorder()),BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.blue,5),BorderFactory.createLoweredBevelBorder())));el.setBorder(BorderFactory.createEtchedBorder(getBackground().brighter(),getBackground().darker()));er.setBorder(BorderFactory.createEtchedBorder(getBackground().darker(),getBackground().brighter()));m.setBorder(BorderFactory.createMatteBorder(iconsz.height,iconsz.width,iconsz.height,iconsz.width,icon));add(br);add(bl);add(sbr);add(sbl);add(c);add(el);add(er);add(e);add(l);add(m);add(t);}}classPanelWithTitleextendsJPanel{privateStringtitle;publicPanelWithTitle(Stringtitle){this.title=title;}publicvoidpaintComponent(Graphicsg){FontMetricsfm=g.getFontMetrics();Dimensionsize=getSize();inttitleW=fm.stringWidth(title);g.setColor(Color.black);g.drawString(title,size.width/2-titleW/2,size.height/2);}}classPanelWithEmptyBorderextendsPanelWithTitle{publicPanelWithEmptyBorder(Stringtitle){super(title);setBorder(BorderFactory.createEmptyBorder(10,10,10,10));}publicvoidpaintComponent(Graphicsg){Dimensionsize=getSize();Insetsinsets=getInsets();g.setColor(Color.red);g.fillRect(insets.left,insets.top,size.width-2*insets.left,size.height-2*insets.top);super.paintComponent(g);}}5.1.3不透明与透明之间的比较例5-3部分透明的边框的样例importjavax.swing.*;importjavax.swing.border.*;importjava.awt.*;publicclassTestextendsJApplet{JPanelpanel=newRainPanel();TitledBorderborder=newTitledBorder(JPanelBorder);publicvoidinit(){panel.setBorder(border);getContentPane().add(panel,BorderLayout.CENTER);System.out.println(opaque=+border.isBorderOpaque());System.out.println(insets=+border.getBorderInsets(panel));}}classRainPanelextendsJPanel{publicvoidpaintComponent(Graphicsg){Iconicon=newImageIcon(getClass().getResource(rain.gif));Dimensionsize=getSize();intpatchW=icon.getIconWidth(),patchH=icon.getIconHeight();for(intr=0;rsize.width;r+=patchW){for(intc=0;csize.height;c+=patchH)icon.paintIcon(this,g,r,c);}}}5.1.4边框包5.1.5边框接口5.1.6AbstractBoorder类5.1.7边框库——共享边框例5-4从边框库中获得边框importjava.awt.*;importjavax.swing.*;importjavax.swing.border.*;publicclassTestextendsJApplet{publicvoidinit(){ContainercontentPane=getContentPane();JPanelpanel=newJPanel();JPanelpanel2=newJPanel();Borderborder=BorderFactory.createRaisedBevelBorder();Borderborder2=BorderFactory.createRaisedBevelBorder();panel.setBorder(border);panel2.setBorder(border2);contentPane.add(panel,BorderLayout.NORTH);contentPane.add(panel2,BorderLayout.SOUTH);if(border==border2)System.out.println(bevelbordersareshared);elseSystem.out.println(bevelbordersareNOTshared);}}5.1.8替换内

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功