Swing:使用顶层容器

2023-11-10

介绍Swing顶层容器。翻译Using Top-Level Containers[url]http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html[/url]
author: ZJ 2007-7-24

 

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坐标排序. 玻璃面板通常用来截获发生在顶层中的输入动作, 并且同样可以用来在多重组件上进行绘画.

转载于:https://blog.51cto.com/zhangjunhd/35200

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swing:使用顶层容器 的相关文章

  • 使用 Intellij Idea 和 gradle 在应用程序引擎上调试 localhost

    我正在使用 IntelliJ 社区添加并使用 Gradle 构建应用程序引擎标准环境应用程序 在迁移到 IntelliJ 和端点框架之前 我使用的是 Android Studio 我无法调试我的本地主机 我添加了 jvmFlags 如下所述
  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • grep -v grep使用说明

    目录 一 ps ef 二 grep java 三 grep job 四 grep v grep 五 awk print 2 六 xargs kill 9 当我们要杀掉某个应用服务进程时 一般会执行以下命令 ps ef grep java g
  • 微信小程序getPhoneNumber快速获取用户手机号组件

    小程序中有很多地方都会用到注册用户信息的地方 用户需要填写手机号等 有了这个组件可以快速获取微信绑定手机号码 无须用户填写 1 getPhoneNumber这个组件通过button来实现 别的标签无效 将button中的open type
  • Java复制数组(深拷贝,浅拷贝)

    1 Object clone 简单直接 只能对源数组完整地复制 此方法是深拷贝 也就是如果clone 那么clone 的新数组修改不会影响老数组 但是能使用该方法为基本数据类型加上string String 有final修饰 不可变 基本数
  • 在线安装visual studio时failed signature validation的原因和解决办法

    这两天给笔记本重装了系统 笔记本的系统是windows 8 1 在装visual studio的时候想换个2017试试 就使用在线的方式装了个2017 community 感觉不错 所以准备把开发的虚拟机里面的2015也换成2017 开发虚
  • T1 mapping的用途

    弥漫性反应性纤维化 其特征是心脏中胶原蛋白的不成比例积累 长期以来被认为是舒张功能障碍 心力衰竭和心源性猝死病因的重要因素 因此 心肌间质成为强烈关注的主题 但结构变化的弥散性使得通过使用常规T1加权成像几乎不可能检测到间质纤维化 在过去几
  • 如何看待区块链下的新型共享经济?

    有业内人士认为 区块链技术天然适合大规模协作的一些应用场景 在共享经济当中 不仅涉及的参与主体多 环节复杂 而且要同时协调一个大规模数量的参与者 这是应用区块链技术的一片沃土 区块链对共享经济带来的颠覆性意义已经不言而喻 共享经济的所有参与
  • Android开发之单位详解(dp、sp、px、in、pt、mm)

    开发这么长时间 一直没关注过长度单位的用法 一直都是一根筋的使用者dp sp 后来才发现 除了这两个以外 Android还提供了pt px in mm 开发中看到有很多人不太理解dp sp和px的区别 现在这里介绍一下dp和sp dp也就是
  • golang 接口

    接口 一组method 签名的组合 通过interface 来定义对象的一组行为 interface 就是一组抽象方法的集合 interface 类型 interface 类型定义了一组方法 如果某个对象实现了某个接口中的方法 则此对象就实
  • Java读配置文件

    读取配置文件的方案 public String getProperty String name String k Properties prop new Properties String key null String val null
  • 华为OD机试 - 跳格子2(Java)

    题目描述 小明和朋友玩跳格子游戏 有 n 个连续格子组成的圆圈 每个格子有不同的分数 小朋友可以选择以任意格子起跳 但是不能跳连续的格子 不能回头跳 也不能超过一圈 给定一个代表每个格子得分的非负整数数组 计算能够得到的最高分数 输入描述
  • Android-Service的生命周期

    与Activity类似 Service也有自己的生命周期函数 在不同的时刻 系统会调用对应的Service生命周期函数 不过与Activity声明周期相比 Service的声明周期更加简单 我们通过官方给出的一张图片来体会一下 Servic
  • Low Elements--AT

    题目描述 Given is a permutation P1 PN of 1 N Find the number of integers i 1 i N that satisfy the following condition For an
  • Selenium3 - 当启动selenium时,跳过配置的chromedriver,使用内置低版本浏览器启动

    报错 今天我在运行selenium的时候 发现会直接弹出一个名为NW js的弹窗且其chromium 是68 我寻思我配的chromedriver已经是94 的了 虽然它也能正常启动但是用着怎么也不对劲 我搜索良久没有答案 就仔细检查了一下
  • 利用爬虫下载批量图片

    这是利用python爬取豆瓣Top250电影图片 并下载在本地的一个文件夹中的例子 用了urllib request urlretrieve 直接上代码了 注释说的很清楚哦 import urllib import urllib reque
  • CMD命令

    打开命令提示符 1 添加服务 输入 sc create 服务名称 binPath 目录的绝对路径 exe 2 删除服务 输入 sc delete 服务名称 3 修改服务描述 输入 sc description 服务名称 描述
  • 过拟合以及解决办法

    过拟合 先谈谈过拟合 所谓过拟合 指的是模型在训练集上表现的很好 但是在交叉验证集合测试集上表现一般 也就是说模型对未知样本的预测表现一般 泛化 generalization 能力较差 如图所示 图片来源 coursera 吴恩达机器学习公
  • D0822-API01

    Math类 工具类有 Math Objects Arrays LocalDateTime Period Duration DateTimeFormatter Math类中包含一些对数据进行数学运算的方法 而该类中的方法全都是静态的 像这样的
  • 函数的相关和卷积

    1 卷积的定义 卷积满足交换律 分配律 结合律 也具有位移不变性以及缩放性质 2 互相关的定义 变量替换后有 上述两式完全等价 性质 1 互相关是两个函数间存在相似性的量度 2 由上述 2 式可得 3 相关运算和卷积运算的区别 对相关来说
  • 【STM32】DHT11温湿度模块传感器详解&代码

    一 DHT11产品介绍 DHT11是数字温湿度传感器 测量范围 湿度20 95 温度0 50 广泛应用于加湿器 温湿度计 空调 汽车等领域 二 典型应用电路 如上图DATA引脚用于MCU与DHT11之间的通讯和同步 采用单总线数据格式 一次
  • Swing:使用顶层容器

    介绍Swing顶层容器 翻译Using Top Level Containers url http java sun com docs books tutorial uiswing components toplevel html url