介绍Swing顶层容器。
翻译Using Top-Level Containers,[url]http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html[/url]
Swing提供3种顶层容器类:JFrame,JDialog,JApplet。当使用这三个类时,你必须注意如下几点:
1.为了显示在屏幕上,每一个GUI组件必须是包含层次(containment hierarchy)的一部分。包含层次是组件的一个树型结构,最顶层的容器是它的根。
2.每一个GUI组件只能被包含一次。若是一个组件已经在一个容器中,这时试图将它加入到一个新的容器,则这个组件会从第一个容器移除,并加入到第二个容器中。
3.每一个顶层容器都有一个内容面板(content pane),通常状况下,这个内容面板会包含(直接或间接地)全部顶层容器GUI的可视组件。
4.能够在顶层容器中加入一个菜单条(menu bar)。一般这个菜单条被放置在顶层容器中,但在内容面板外。
下面这张图片是经过应用程序建立的一个frame。这个frame包含一个绿色的菜单(空菜单),在这个frame的内容面板上有一个巨大的黄色空标签。
这个例子的源代码见TopLevelDemo.java。下图是这个例子GUI的包含层次。
1.顶层容器与包含层次
每一个使用Swing组件的程序都至少有一个顶层容器。这个顶层容器是包含层次的根节点—这个层次会包含全部将在这个顶层容器中出现的Swing组件。
一般状况下,一个单独的基于Swing GUI的应用程序至少有一个包含层次,且它的根节点是JFrame。举例来讲,若是一个应用程序拥有一个窗口和两个对话框,那么这个应用程序将会有三个包含层次,也即会有三个顶层容器。一个包含层次将JFrame做为它的根节点,两外两个包含层次各有一个JDialog做为它的根节点。
一个基于Swing组件的小程序(applet)至少含有一个包含层次,而且能够肯定其中必有一个是以JApplet做为其根节点的。例如,一个小程序带有一个对话框,则它会有两个包含层次。在浏览器窗口中的组件将会置于一个包含层次,它的根节点是一个JApplet对象。对话框会有一个包含层次,它的根节点是一个JDialog对象。
2.将组件加入到内容面板中
下面的代码操做是上面的例子中获得frame的内容面板并加入黄色标签:
frame.getContentPane().add(yellowLabel, BorderLayout.CENTER);
|
如代码所示,必须先找到顶层容器的内容面板,经过方法getContentPane实现。默认的内容面板是一个简单的中间容器,它继承自JComponent,使用一个BorderLayout做为它的面板管理器。
定制一个内容面板很简单—设置面板管理器或添加边框。这里必须注意,getContentPane方法将返回一个Container对象,而不是JComponent对象。这意味着若是须要利用JComponent的部分功能,还必须将返回值进行类型转换或建立你本身的组件来做为内容面板。咱们的实例一般采用的是第二种方式. 由于第二种方法比较清楚明朗。 另外一种咱们有时会使用的方法就是简单地将一个本身定义组件添加进内容面板, 彻底遮盖住内容面板。
若是你建立你本身的内容面板, 那么请注意确认它是不透明的. 一个不透明的JPanel将是一个不错的选择. 注意, 默认状况下JPanel的布局管理为FlowLayout, 你或许会想要用其它的布局管理器替换它。
为了使一个组件成为内容面板, 你须要使用顶层容器的setContentPane方法, 例如:
//Create a panel and add components to it.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(someBorder);
contentPane.add(someComponent, BorderLayout.CENTER);
contentPane.add(anotherComponent, BorderLayout.PAGE_END);
//Make it the content pane. //contentPane.setOpaque(true); topLevelContainer.setContentPane(contentPane);
|
注意: 不要使用透明的容器做为内容面板, 如JScrollPane, JSplitPane和JTabbedPane. . 一个透明的内容面板将致使组件混乱. 尽管你可使任何的透明的Swing组件经过setOpaque(true)方法来使其不透明化, 但当一些组件被设置成彻底不透明后看上去会不太对劲. 例如, 一个标签面板.
3.添加一个菜单栏 (Adding a Menu Bar)
从理论上来说每个顶层容器均可以有一个菜单栏. 但事实代表菜单栏仅出现于Frame或者Applet中. 为达到添加一个菜单栏到顶层容器, 你须要建立一个JMenuBar对象, 组装上一些菜单, 而后呼叫setJMenuBar方法. TopLevelDemo实例经过如下代码添加一个菜单栏到它的Frame中.
frame.setJMenuBar(cyanMenuBar);
|
4.根容器 (The Root Pane)
每一个顶层容器都依赖于一个隐式的称为根容器的中间容器. 这个根容器管理着内容面板和菜单栏, 而且连同两个或者两个以上的其它容器(见图中Layered Pane等). 你一般不须要了解关于使用Swing组件根容器方面的知识. 然而, 若是你想截获鼠标的点击或者在多重组件上进行绘画动做, 那么你须要知晓根容器.
下图所示由顶层容器某个Frame(也能够是其它任何顶层容器)容器中可能出现的全部中间容器:
上文已经讲述了关于内容面板与可选的菜单栏的内容,此处再也不复述. 根容器中包含的另外两个组件, 是布局面板和玻璃面板. 布局面板直接包含菜单栏和内容面板, 而且容许你对所添加的其它组件进行Z坐标排序. 玻璃面板一般用来截获发生在顶层中的输入动做, 而且一样能够用来在多重组件上进行绘画.