Swing:使用顶层容器

介绍 Swing 顶层容器。翻译 Using Top-Level Containers [url]http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html[/url]
author: ZJ 2007-7-24
Blog: [url]http://zhangjunhd.blog.51cto.com/[/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, JSplitPaneJTabbedPane. . 一个透明的内容面板将导致组件混乱. 尽管你可以使任何的透明的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 坐标排序 . 玻璃面板通常用来截获发生在顶层中的输入动作 , 并且同样可以用来在多重组件上进行绘画 .

你可能感兴趣的:(java,JFrame,swing,容器,休闲)