版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主要参考文现:美Herbert Schildt著 鄢爱兰 鹿江春译java参考大全J2SE清华大学出版社2006年1月孙卫琴 Java面向对象编程出版社及日期不详java API开发人员文档本文作者:黄邦勇帅本文的说明:本文主要讲解了对大学初学Swing时对根面板JRootPa ne,内容面板con ta in Pa ne,层面板JLayeredPa ne,玻璃面板glassPnae的困惑,本文对各种面板作了详尽的讨论,让读者能真正的明白根面板,内容面板,层面板到底是 什么,他们在程序中的作用,以及他们之间的关系,透明性,可见性,作了讲解。本文内容完全属于个人见解与参考 文现的作者无关,其中难
2、免有误解之处,望指出更正。Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)JFrame框架窗口中各面板的层次结构JFrame框架窗口 JRootPa ne根面板 JLayeredPa ne 层面板MenuBar菜单栏 con tai nPa ne内容面板 glassPa ne玻璃面板注意:各层面板都完全覆盖了 JFrame窗口除标题栏和边条 的全部内容。此图为了说明层 次关系,而作了立体化处理第一部分:JFrame中各面板间的关系,透明性与可见性问题注:在某些地方把面板也叫做窗格,比如根面板,也叫根窗格,层面板也叫分层窗格等。注意窗格与窗体是不一样的。在S
3、wing中的JFrame窗体与 AWT中的Frame窗体有一些不同。JFrame由他的窗体本身加上其上的JRootPane根面板,JLayeredPa ne层面板,contain Pa ne内容面板,glassPa ne玻璃面板,JMe nuBar菜单栏(可选,不包括在内)四部分组成。 其中根面板在 JRootPane类中实现,层面板在 JLayeredPane类中实现,他们都是JComponent的子类。而 containPane和glassPane没有专门对应的类。1、各种面板(或称窗格)的关系及作用:JRootPane根面板:该面板是在JFrame窗体创建时就默认添加进来的,是所有其他面
4、板的载体或父级,他覆盖窗体的 除标题栏和边条之外的整个表面。根面板默认是不可见的。根面板负责管理其他面板(层面板,玻璃面板),如使其他面板覆盖整个JFrame窗体等。JLayeredPane层面板:该面板是其他所有面板的父级,在JRootPane面板的上面,他再次覆盖窗体的整个表面,内容面板和JMenuBar菜单栏被添加到层面板上。当添加了菜单栏时,菜单栏被添加到JLayeredPane面板的顶部,剩下的部 分被内容面板填充。层面板是分很多层的,每一层使用一个相应的数字来表示,而内容面板就位于层面板中的某一层, 在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板将负责管理
5、各种内部窗体的叠放问 题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。层面板的内容后面会作具体介绍。 containPane内容面板:由层面板的介绍可知,内容面板是层面板中的某一层。默认的内容面板是不透明的,而且是一 个JPane对象。该面板在窗体中起着工作区的作用,当我们向窗体添加组件时就应该添加到这一层上,而不能像AWT那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件无法显示。比如要添加按钮jb 则正确的方 式为,Con ta in er p=jframe.getCo nte ntPa ne();p.add(j
6、r);或jframe.getContentPane().add(jr);其中getContentPane()是JFrame类中的方法,该方法将反回内容面板的引用,这是访问 默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。glassPane玻璃面板:该面板总是存在的,而且他位于最上面,默认情况下玻璃面板是不可见的,玻璃面板用于接收鼠 标事件和在其他组件上绘图。2、各面板中使用的布局管理器:在内容面板上使用的布局管理器默认是BorderLayout。在根面板上 使用的布局管理器是一个自定义的 LayoutManager(布局管理器),他的作用是布局根面板之上的其他面板。
7、很明显如果你要向根面板中添加组件就应使用setLayout方法为其设置合适的布局管理器或自已设定组件的大小和显示 位置。如果你改变了根面板自定义的 LayoutManager 那么你就应编写负责布局根面板之上的各种面板的程序,如果没 有这样的程序,那么在根面板之上的各种面板就不能正常的布局,因此对于根面板的布局管理器一般不要随便更改。 玻璃面板 的默认布局管理器是 FlowLayout 。对于层面板 而言,在将容器添加进层面板时,将在添加容器时指定把该容器添加进层面板的哪一层,因而某层的布局 管理器由添加到该层的容器所决定,因此无需为层面板的某一层设置布局管理器, 也就是说层面板没有布局管理器
8、 。 当把某一容器(比如Panel)设为某种面板(内容面板)时,则面板的布局与添加进来的容器的布局管理器相同, 比如把Panel 作为内容面板,则内容面板的布局管理器就是 FlowLayout 。注意:对于层面板的各层来说,只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层。3、各面板的可见性和透明性问题可见性使用setVisible方法来显示(在AWT时已见过不少),透明性使用setOpaque方法来设置。setOpaque方法只有在 javax.swing 包中的组件才有,对于 java.awt 包中的组件是没有该方法的,因此要使用该方法有时需要使用强制类型
9、转 换可见性与透明性的区别 :区别在于,当面板是不可见时,则该面板中包含的组件也会不可见。若该面板是透明但可见 的,则只是面板会透明 (比如面板的背景色无法看到 ),但面板上的组件仍会显示。根面板: 默认情况下,根面板是可见且不透明的。内容面板:默认情况下,内容面板是可见的且不透明的,因此我们创建的JFrame窗体,实际上看到的是内容面板中的内容。玻璃面板:默认的玻璃面板是透明的且不可见的,因此要显示默认的玻璃面板应设置setVisible和setOpaque两个方法,若你把某一容器(比如Panel)设为玻璃面板,那么这时的玻璃面板仍然是不可见的,但他不是透明的,这取决于容器(比如Pan el
10、)是否是透明的。因此要把这种类型的玻璃面板显示出来只需设置setVisible方法就够了。层面板: 不管是你自已创建的层面板还是默认的层面板都是透明的且可见的,层面板中的内容面板是个特例,要使层 面板可显示应设置 setOpaque方法。层面板和内容面板可见性与透明性的关系: 内容面板默认在层面板的 -30000 层,若我们像层面板添加组件时应设置将 该组件添加进层面板的哪一层,若不然就会出现一些问题,因此应使用add(Component com. Object constrainer)这个方法,在添加组件时使用add(com, new Integer(100);这样的形式,Integer对象
11、是int装相后的结果,装相后把整数当作对象来看待,其实 Integer 对象就是一个整数。内容面板和层面板及层面板之间的显示问题,因为只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层, 我们也无法直接该问到层面板中的其他各层, 因此层面板将只会有一种背景色 (除内容面板外 )且背 景色使用 JLayeredPane 类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明 也只能由 JLayeredPane 的对象来设置,不能设置层面板中各个层次的透明性。因此在层面板的各层之间他们始终是彼 此透明的,无法更改,而相对与其他面板层面板(
12、比如根面板)可以透明也可以不透明(使用JLayeredPane对象来设定)。而对于内容面板而言,由于内容面板是存在于层面板中的某一层,因此层面板中的其他层相对于内容面板也是透明的, 无法更改。但是在 层面板的所有层中只有内容面板是不透明的,因此若我们既为内容面板设置了背景色也为层面板设置了背景色那么最后只会显示内容面板的背景色,除非让内容面板透明或不可见,这时才会显示出层面板的背景色。 当向层面板中添加的组件在内容面板之上(大于-30000)时,这些组件将与内容面板的组件同时显示(若不重叠的话,若重叠则显示层数数值更大的组件)。若向层面板中添加的组件在内容面板之下(小于-3000 层),那么内
13、容面板将把层面板中的组件都遮挡住,因为内容面板是不透明的。应注意的问题:1 、内容面板是层面板中的某一层。 是我们的工作区间, 组件都应该添加到该面板上。 而不能像 AWT 那样直接向 Frame 窗体添加组件。2、 可以创建根面板的对象,但无法把该对象设置为某一个窗体的根面板,因此一般情况下JFrame 窗体的根面板是唯 一的。比如 JRootPane jr=new JRootPane; 但不能使用 JFrame 中的 jframe.setRootPane(jr); 方法把 jr 设置为该窗体的 根面板,因为setRootPane方法是protected类型的,只能由继承自该类的子类的构造方
14、法使用。3、 关于设置面板的问题:对于JFrame窗口的根面板和层面板只能把JRootPane和JLayeredPane类型的对象设为根面板和层面板,而不能把 Component 或 Container 类型的组件设为根面板或层面板。而对于玻璃面板则可以把 Component 类型的对象设为玻璃面板,对于内容面板可以把 Container 类型的对象设为内容面板。这取决于 JFrame 类中的set*Pane(类型 参数);方法中的"类型"是什么。对根面板其类型为JRootPane,对内容面板类型为 Container4、关于内容面板:除了默认的层面板附带有内容面板之外,你
15、自已创建的层面板将不会拥有内容面板,这时你必须手动为层面板设置一个内容面板(比如把JPanel设为内容面板),因为层面板是不可见且透明的,因此我们现在看到的将是根面板的内容,若你为根面板设置了背景色,则将显示该背景色。比如JLayeredPane jp=new JLayeredPane();jframe.setLayeredPane(jp); 这时若使用 jframe.getContentPane().add(jb); 语句,那么按钮 jb 将无法显示,因为该层面 板中还没有内容面板存在,在添加组件之前应把某个容器设为内容面板,比如jframe.setContentPane(jpanel);
16、这样程序就能正常运行了。5、关于所有面板都设为不可见或透明时的问题:若除根面板外把其他所有面板都设为不可见或透明,则若根面板设为 透明,则会显示JFrame的面板,标题栏和边框。若根面板设为不可见,则我们只能看到一个框架,即只有标题栏, 边框,看不见 JFrame 的面板。6、关于层面板的透明问题:层面板都是透明的且不可见的,在层面板的各层之间他们始终是彼此透明的,无法更改,我们也无法直接访问到层面板中的其他各层,因此层面板将只会有一种背景色(除内容面板外 )且背景色使用JLayeredPa ne类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能 由JLa
17、yeredPane的对象来设置,不能设置层面板中各个层次的透明性。各层面板之间的可见性透明性及各种面板之间的关系示例:import java.awt.*;import java.awt.event.*;publicimport javax.swing.*;p1.setBackground(p2.setBackground(p3.setBackground(p4.setBackground(Color . red );Color . yellow );Color . blue );Color . green ); JFramef= new JFrame ();JPanel jp1= new JP
18、anel ();JButtonjb1=newJButton( " 玻璃面板默认 FlowLayout布局 " );JButtonjb2=newJButton( " 内容面板默认 BorderLayout布局 " );JButtonjb3=newJButton( " 在内容面板之下的层面板 ");JButtonjb4=newJButton( " 根面板无默认布局 " );JButtonjb5=newJButton( " 在内容面板之上的层面板 ");JButtonjb6=newJButton( &
19、quot;JFrame 窗体 " );将 JFrame所反回的面板都强制转换为 JComponent 类型,以便调用 setOpaque/class A public staticvoid main( String arg)方法。JComponentp1=(JComponent)f.getGlassPane();JComponentp2=(JComponent)f.getContentPane();JComponentp3=(JComponent)f.getLayeredPane();JComponentp4=(JComponent)f.getRootPane();p1.add(jb
20、1); p2.add(jb2, BorderLayout . SOUTH);/ 为层面板 p3 添加两个按钮,且分别放置在内容面板之上和内容面板之下/ 将按钮 jb3 ,放置在内容面板之下/ 将按钮 jb5 ,放置在内容面板之上p3.add(jb3,new Integer(-30001);p3.add(jb5,new Integer(22);jb5.setSize(200,22); jb5.setLocation(7,35); jb3.setSize(200,22); jb3.setLocation(7,90);/ 向根面板 p4 中添加一个按钮 jb4 p4.add(jb4);try Thr
21、ead . sleep (2000); catchp1.setVisible(true );p1.setOpaque(true );f.repaint();/ 应使用 repaintwhile ( true )/ 玻璃面板默认是不可见且透明的。显示玻璃面板红色背景。jb4.setSize(200,22); jb4.setLocation(7,60);/f.add(jb6,BorderLayout.NORTH);/ f.setLocation(222,222); f.setSize(222,222); f.setVisible(该方法实际上是把按钮 jb5 添加到了内容面板上, 并未把 jb5
22、添加到窗体 f 上。 true );/ 循环显示各层面板( InterruptedException e) 方法重缓一次,要不然会出现组件上次显示的残影/ 使玻璃面板透明, 但是是可见的,这样的话就会显示内容面板和层次数目在内容面板之上的层面板的内容。因为层面板自 身层内之间是相互透明的,因此不会显示层面板的蓝色背景,相反内容面板是不透明的,因此会显示内容面板的背景颜色try Thread . sleep (2000); catch ( InterruptedExceptione) p1.setOpaque( false );/p1.setVisible(false); /你也可以把该行的注释
23、删除掉,以便观察可见性与透明性的区别。f.repaint();/ 使内容面板透明,因为前面已把玻璃面板设为透明,因此 会显示全部的层面板的内容,包括层面板的蓝色背景 try Thread . sleep (2000); catch ( InterruptedExceptione) p2.setOpaque( false );/p2.setVisible(false);p3.setOpaque( true );f.repaint();/ 使层面板透明,因为内容面板是层面板中的某一层,因此该设置同样会使内容面板透明,再加上之前已把玻璃面板设为透明,因此最后将会显示即不透明也是可见的根面板的内容及其
24、绿色的背景色。try Thread . sleep (2000); catch ( InterruptedExceptione) p3.setOpaque( false );/p3.setVisible(false);f.repa in t();/使所有面板的可见性及透明性还原 try Thread . sleepp1.setVisible(p2.setOpaque(p3.setOpaque(f.repai nt(); (2000); false );true );true );ocatch ( InterruptedExceptione) 程序结果按如下顺序循环显示1、最先显示2、两秒之后玻
25、璃面板上的按钮默认时玻璃面板是透明的且不可见的 但可以更改其可见性与透明性把内容面板和玻璃面板都设为透明时的效果显示层面板背景色把玻璃面板设为可见且不透明时的效果 显示玻璃面3、再2秒之后一玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来因为层面板彼此之间的各层是透明的,因此该按钮仍被显示出来把玻璃面板设为透明时的效果-显示内容面板背景色4、再2秒之后玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来因为层面板彼此之间的各层是透明的,因此该按钮仍被显示出来该层位于内容面板之下, 因为把内容面板设置为透明的,因此该层的按钮就被显示出来了,而且层面板的背景色蓝色也显示
26、出来了5、再2秒之后根面板之上的按钮根面板的绿色背景把层面板和玻璃面板都设为透明时的效果显示根面板背景色JRootPane.RootLayout:该类自定义布局管理器负责层面板,玻璃面板和菜单栏的布局。第2部分:JRootPane类对于根面板的内容,我们在前面已介绍过,这里我们来具体看一下 JRootPane类的内容,该类只有一个默认的构造方法, 但要注意,若你自已创建一个JRootPa ne对象,那些你应该对在根面板之上的层面板,玻璃面板和菜单栏的布局负责JRootPane类的内部类有:JRootPane类的常量有:内容窗格(或面板)当面板成为焦点并有类似按下protected Contai
27、ner conten tPa ne protected JButt on defaultButt onEnter键的特定于UI的操作发生时被激活的按钮。protected Comp onent glassPa ne protected JLayeredPa ne layeredPa ne玻璃窗格,便于截取鼠标移动等操作管理菜单栏和内容窗格的分层窗格玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来5、再2秒之后COLOR_CHOOSER_DIALOG ERROR_DIALOG FILE_CHOOSER_DIALOG FRAMEINFORMA TION_DIALOG NONEPLA
28、IN_DIALOG QUESTION_DIALOG WARNING_DIALOGJRootPane的方法有:protected Container createC onen tPa ne(); protected Comp onent createGlassPa ne(); protected JLayeredPa ne createLayeredPa ne(); protected LayoutManager createRootLayout (); void setC onten tPa ne(C ontainer co); void setGlassPa ne(Comp onent g)
29、; void setJMe nuBar(JMe nuBar m);void setLayeredPa ne(JLayeredPa ne jl); Container getC onten tPa ne();Comp onent getGlassPa ne(); JMe nuBar getJMe nuBar(); JLayeredPa ne getLayeredPa ne(); void setDefaultButton (JButton de); JButton getDefaultButton (); void setUI (RootPaneUI ui);RootPaneUI getID (
30、); String getUIClassID (); void setWi ndowDecorati on Style (int w); int getWindowDecorationSytle ();protected JMenuBar menuBar菜单栏以下的常量为 static int类型,都是供 windowDecorationStyle属性使用的常量指示JRootPane应提供适合 Dialog的装饰以便显示 JColorChooser 指示JRootPane应提供适合Dialog的装饰以便显示一条错误消息指示JRootPane应提供适合 Dialog的装饰以便显示 JFileCh
31、ooser 指示JRootPane应提供适合Frame的装饰指示JRootPane应提供适合Dialog的装饰以便显示一条报告消息指示JRootPane不应提供任何类型的Window装饰指示JRootPane应提供适合Dialog的装饰指示JRootPane应提供适合 Dialog的装饰以便向用户显示一个问题 指示JRootPane应提供适合Dialog的装饰以便显示一条警告消息由构造方法调用以创建默认的内容面板。注意该方法只能由构造方法调用。由构造方法调用以创建默认的玻璃面板由构造方法调用以创建默认的层面板由构造方法调用以创建默认的布局管理。设置内容窗格。设定此根窗格的玻璃窗格设置在分层窗格
32、中使用的菜单栏设置供根窗格使用的分层窗格反回内容窗格。反回此根窗格的当前玻璃窗格反回窗格层的菜单栏反回根窗格使用的分层窗格设置defaultButton属性,它确定此 JRootPane的当前默认按钮。反回defaultButton属性的值设置呈现此组件的 L&F对象反回呈现此组件的 L&F对象。反回一个指定呈现此组件的L&F类名称的字符串。设置JRootPane应提供的Window装饰类型。反回JRootPane提供的Window装饰类型的常量。默认不提供任何 Window 装饰(即外观)。其值为JRootPane类中定义的那些 static int常量。5、再2秒之
33、后void setDoubleBuffered (boolean b); void updateUI ();设置此组件是否使用双缓冲技术 将UI属性重置为当前外观对应的值。5、再2秒之后第 3 部分: JLayeredPane 类(主要讲解组件相互重叠在一起的情况 )1、前面已介绍过, JLayperedPane 层面板是分很多层的,因此,在 JLayeredPane 类中,为层面板的各层都赋于了一个 编号,以区别正在使用的是哪一层,这个编号是一个 Integer 类型(把 int 类型装相就成为该类型 )的整数, Integer 实际上 就是一个整数。编号数字越大的层位于编号数字更小的层的前
34、面,也就是说当各层的子组件重叠时,高层的子组件将 显示在低层中的子组件之上,即低层的子组件被高层的子组件遮挡住了。再次说明,对于层面板的每一层都相当于是 一个容器,因此可以直接向层面板中添加组件。2、为了方便 JLayeredPane 类定义了一些深度不同的层,这些层由 JLayeredPane 类中的常量所标识他们是:DEFAULT_LAYER PALETTE_LAYER MODAL_LAYER默认层。该层是大多数组件位于的标准层,其值为Integer(0)palette调色板层。位于默认层之上,它们对于浮动工具栏和调色板很有用,其值为Integer(100)该层用于模式对话框。它们将出现在
35、容器中所有工具栏,调色板和标准组件之上,其值为Interger(200)POPUP_LAYER弹出层。组合框,工具提示和与帮助文本关联的弹出式窗口将出现在组件,调色板或生生成他们的对话框之上。其值为 Interger(300)DRAG_LAYER拖动一个组件时,将该组件重分配到拖动层可确保将其定位在容器中的其他所有组件之上。完成拖动后,可将该组件重分配到其正常层。其值为Interger(400)FRAME_CONTENT_LAYER 内容面板层,我们经常使用的内容面板层就位于该层上。其值为Interger(-30000)面我们主要讲解,添加的组件相互重叠明的问题:index 索引值: a、 在
36、 java 中,每向容器添加一个组件都会产生一个随带的索引值,即使组件在不同的层上也不影响索 引值的产生,若在同一层的多个组件相重叠时,则索引值越大的组件将被放置在越后面。索引值 0 表示组件在最上层,最先添加的组件索引值为0,第二个添加的其值为 1,而-1 表示最底层。 每添加一个组件程序都会自动为其设置索引值, 第三个添加的则为 2,以此类推。b、当新添加进来的组件改变了原来的索引顺序时,则所有组件的索引将重新排列,比如组件1的索引为0,组件2的为 1组件 5的为 4,当把组件 6添加到索引位置 2时,这时的索引顺序是, 组件 1 索引为 0,组件 2为 1,组件 6为 2,组件 3 为
37、3,组件 4 为 4,组件 5 为 5。因此索引值与组件的产生顺序有关,最先产生的组件索引值小,而后面产生的组件的索引值都比紧前一个组件的大1。c、当在比当前层更低层的面板上产生新组件时,虽然系统产生的索引值的规律是一样的,但是这时你在更低层面板上 改变组件的索引值时就有一个最小值的限制,这个最小值就是当前层的组件个数。比如当前层有4 个组件,因此索引值最大为 3,那么更低层组件的索引值的最小值就是4。在比当前层更高层的面板上产生新组件时,不受此限制。positon位置值:在同一层中,组件不但有一个索引值,而且组件所在的位置还有一个位置值,位置值与索引值的作用 是相同的,产生的方式也是一样的,
38、位置值与索引值的区别在于位置值只能在同一层中使用,而索引值是能跨层使用 的,也就是说在不同的层中索引值是不相同的,而在不同的层中位置值有可能是相同的,比如在111 层上有 4 个组件,那么这 4个组件的索引值和位置值都分别是从 0到 3,这时在 112层上又有 3个组件, 那么这两个组件的索引值可能是 4到 6(也有可能被你设置为 0到2),而位置值则只能是 0到 2之间。index 索引值与 position 位置值的关系: 索引值与位置值的功能和产生方式都是一样的, 因此当你改变位置值或索引值 时,索引值或位置值就会作相应的改变,当然索引值与位置值不一定是相等的,位置值取决与同一层中的组件
39、数,而 索引值则取决于所有层中的组件总数。改变索引值的方法有add(),改变位置值的方法有setLayer()和setPosition(), moveToBack()和moveToFront()方法。使用 Container 类中的 void add(Component com, Object constrainer) 方法。该方法的作用是,把组件 com 添加到层面板中指定的层上。该方法的用法是,把 Integer 类型的对象指定为 constrainer 参数 , 比 如 layeredPane.add(component, JLayeredPane.DEFAULT_LAYER) ;或者
40、layeredPane.add(component, new Integer(10) 。这里要注意的是第二个参数一定要是 Integer 类型的, 不可以使用 int 类型, 若使用 int 类型, 则不会出错, 因为在 Container 类中还有一个 add 方法,其形式为 add(Component com, int index); 表示将组件添加到指定的索引处。 使用 Container 类中的 void add(Component com, Object constrainer, int index) 方法该方法与上面带两个参数的 add方法相似,不同的是该方法将组件 com添加到l
41、ayerPane中指定层上的指定索引处。 比 如 layeredPane.add(com, new Integer(10), 3); 表示将组件添加到层面板编号为 10的那一层上, 其位置在该层索引为 3的 地方。注意,这里使用的是索引值,而不是位置值,注意他们的区别。setLayer()方法:使用该方法应注意的地方是,当使用该方法时只是把组件设置在层面板中的哪一层中出现,程序并没 有把该组件添加到该层中,在使用 setLayer 方法后还应使用 add 方法把组件添加进层面板的这一层中,而且 add 方法 应出现在 setLayer 方法之后。比女口 layerPane.setLayer(c
42、omponent, 3);layerPane.add(component);该方法有 2 个变体,分别是:void setLayer(Component c, int layer);将组件 c 放在编号为 layer 的层上,并把它放置在该层的最底部。void setLayer(Component c, int layer, int position);将组件 c 放在编号为 layer 的层上, 且把它放置在该层指定的位置值处(注意,这个方法的第 3个参数是否不起作用,我在程序中试过好多次 ) void setPosition(Component c, int position); 将组件
43、c 放置在当前层的 position 位置值 (注意不是索引值 )处,其中 0 表 示放置在该层的最顶层,数值 -1 放置在最底层。对于其他数字,数字越 大则放置在越后面。JLayeredPane 使用技巧: 使用 JLayeredPane 类设置多层面板时应先创建一个 JLayeredPane 类的对象,再使用 setLayeredPane 方法把该对象设为窗体的层面板,这时就可以使用该对象调用 JLayeredPane 类中的相应方法,若使用 JFrame 类中的 getLayeredPane 方法,则不能使用 JLayeredPane 类中的方法,因为 getLayeredPane 方法
44、反回的对象是 Component 对象,该对象无法调用 JLayeredPane 类中的方法有了前面的知识,那么下面我们就来看看JLayeredPane 类中的具体内容JLayeredPane 类中的常量有 (都为 static Integer 类型 ) :DEFAULT_LAYER PALETTE_LAYER MODAL_LAYER默认层。该层是大多数组件位于的标准层,其值为Integer(0)palette调色板层。位于默认层之上,它们对于浮动工具栏和调色板很有用,其值为Integer(100)该层用于模式对话框。它们将出现在容器中所有工具栏,调色板和标准组件之上,其值为Interger(
45、200)POPUP_LAYER弹出层。组合框,工具提示和与帮助文本关联的弹出式窗口将出现在组件,调色板或生生成他们的对话框之上。其值为 Interger(300)DRAG_LAYER拖动一个组件时,将该组件重分配到拖动层可确保将其定位在容器中的其他所有组件之上。完成拖动后,可将该组件重分配到其正常层。其值为Interger(400)FRAME_CONTENT_LAYER 内容面板层,我们经常使用的内容面板层就位于该层上。其值为 Interger(-30000) static String LAYER_PROPERTY 绑定属性。JLayeredPane 类有一个默认的构造方法JLayeredP
46、ane 类中的方法有:Component getComponentsInLayer (int layer); int getComponentCountInLayer (int layer); int getIndexOf (Component c);int getLayer (Component c);static int getLayer(JComponent c);int highestLayer ();int lowestLayer ();反回指定层中组件的数组 反回指定层中组件的个数 反回指定组件的索引值 反回指定组件所在层的 int 值 (即组件在第几层 ) 反回指定的 JComp
47、onent 组件在第几层。 反回当前层面板中所拥有的子层中最顶层的层的值。 反回当前层面板中所拥有的子层中最底层的层的值。boolean isOptimizedDrawingEnabled ();void moveToBack (Component c);void moveToFront (Component c);void paint (Graphics g);static void putLayer (JComponent c, int layer);判断组件是否可以重叠,若可以则反回 false ,否则反回 true将组件c移动到当前层中所有组件的最底层(位置-1处),只能改变位置值将组
48、件c移动到当前层中所有组件的最顶层(位置0处),只能改变位置值绘制此 JLayeredPane该方法与 setLayer 方法类似,只是不会产生一些副作用,比如重绘,而 且只适用于 JComponent 组件。void remove (int index);void removeAll ();void setLayer(Component c, int layer);从此窗格中移除索引为 index 的组件 从此容器中移除所有组件。将组件 c 放在编号为 layer 的层上,并把它放置在该层的最底部。void setLayer(Component c, int layer, int posit
49、ion); 将组件 c 放在编号为 ( 注意, 这个方法的第 void setPosition(Component c, int position);将组件 c 放置在当前层的layer 的层上, 且把它放置在该层指定的位置值处3 个参数是否不起作用, 我在程序中试过好多次 ) position 位置值 (注意位置值与索引值的区别 )处,其中 0 表示放置在该层的最顶层,数值 -1 放置在最底层。对于其他数字,数字越大则放置在越后面。int getPosition(Component c);反回组件 c 所在层的位置值,注意位置值与索引值的区别。importimportimportjava.a
50、wt.*; java.awt.event.*; javax.swing.*;JLayeredPane层面板示例:在该示例中,我们可以看到位置值与索引值的区别,以及怎样使用多个层。具体情况请自行运行试验。public class A public static JFrame f= new JFrame ();JLayeredPane p= new JLayeredPane/Component p=f.getLayeredPane(); /void main( String arg)(); / 要使用 JLayeredPane 类中的函数,应创建一个 JLayeredPane 的对象 或使用该方法
51、则无法使用 JLayeredPane 类中的各种函数,因为该方法反回的结果是 Component 类型的,该类型是 JLayeredPane的父类,父类不能使用子类中的方法,除非强制转换JButtonjb1=newJButton( "kkk1");JButtonjb3=newJButton( "kkk3");JButtonjb5=newJButton( "kkk5");JButtonjb2=newJButton( "kkk2");JButtonjb4=newJButton( "kkk4");JB
52、uttonjb6=newJButton( "kkk6");f.setLayeredPane(p);/将JLayeredPane对象p设置为窗口 f的层面板。/ 布置按钮 jb1p.add(jb1,new Integer (111);/ 使用 add 方法把按钮 jb1 添加到层面板的 111 层,层面板中的每一层其实就是一个容器,因此可以直接向层面板中添加组件。jb1.setSize(88,44);/ 因为层面板没有布局管理器,所以应对按钮组件的大小和位置进行设置,这里的位置使用的是默认值左上角。若不设置按钮的大小,我们最后将看不到按钮。int ps1=p.getPosit
53、ion(jb1);System . out .println( "ps1="+ps1);/ 这里输出的是当前的位置值,当后面添加了新组件并设置了位置值时,该值有可能会变化。jb1.setVisible(true );/ 布置按钮 jb2p.add(jb2,new Integer (111),0);/ 使用 add 方法把按钮 jb2 添加到层面板的 111 层,并使其显示在相同层的最 顶层,注意这里的 0 是一个索引值,而不是位置值,注意索引值与位置值 position 的区别jb2.setSize(88,44);int ps2=p.getPosition(jb2);System . out .println( "ps2="+ps2);jb2.setVisible(true );/ 布置按钮 jb3p.setLayer(jb3,111);/ 使用 setLayer 方法将 jb3 按钮添加到层面板的 111 层,并将该组件放置在同层的最底层。p.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物理系课程设计范文
- 特殊数据输出课程设计
- 玉米制糖技术考核试卷
- 新兴技术对行业现状的影响考核试卷
- 2024年冷链物流配送合同示范文本(生鲜专递)3篇
- 早教社会拓展课程设计
- 2024年水土保持设施建设项目施工合同一
- 扁叉机械制造课程设计
- 小企业网站建设课程设计
- 程序设计课程设计心得
- (完整版)自动感应门施工方案
- _ 基本粒子与宏观物体内在联系
- 象棋比赛积分编排表
- 工会新闻的写作培训讲义(共36页).ppt
- 小学赣美版六年级美术上册第二十课向往和平课件(16张)ppt课件
- 中药饮片购进验收记录表格模板
- TCM远红外发展初析
- 房地产开发企业土地增值税清算政策与实务操作(成都市)解读
- 房地产估计第九章假设开发法练习题参考答案
- [爆笑小品校园剧本7人]爆笑小品校园剧本
- 第五章 逆向选择
评论
0/150
提交评论