8.2 JFrame类
JFrame类是使用JRootPane并且实现了RootPaneContainer接口的Swing高层容器。另外,他使用WindowConstants接口来帮助管理相关操作。
8.2.1 创建JFrame
JFrame类提供了两个基本构造函数:一个用于不带标题的框架,而另一个用来创建带标题的框架。还有另外两个构造函数使用特定的GraphicsConfiguration来创建框架。
public JFrame()
JFrame frame = new JFrame();
public JFrame(String title)
JFrame frame = new JFrame("Title Bar");
public JFrame(GraphicsConfiguration config)
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gsd[] = ge.getScreenDevices();
GraphicsConfiguration gc[] = gsd[0].getConfigurations();
JFrame frame = new JFrame(gc[0]);
public JFrame(String title, GraphicsConfiguration config)
GraphicsConfiguration gc = ...;
JFrame frame = new JFrame("Title Bar", gc);
8.2.2 JFrame属性
表8-5显示了JFrame的九个属性。
JFrame属性
属性名
|
数据类型
|
访问性
|
accessibleContext
|
AccessibleContext
|
只读
|
contentPane
|
Container
|
读写
|
defaultCloseOperation
|
int
|
读写
|
glassPane
|
Component
|
读写
|
iconImage
|
Image
|
只写
|
jMenuBar
|
JMenuBar
|
读写
|
layeredPane
|
JLayeredPane
|
读写
|
layout
|
LayoutManager
|
只写
|
rootPane
|
JRootPane
|
只读
|
尽管大多数的属性都是实现RootPaneContainer接口的结果,但是有两个特殊的属性:defaultCloseOperation以及layout。(我们首先在第2章看到了defaultCloseOperation。)默认情况下,当用户关闭容器时,JFrame会隐藏自己。要修改这种设置,当设置默认关闭行为时我们可以表8-6中所列表出的常量来作为参数。第一个直接来自于JFrame;其他的则是WindowConstants接口的一部分。
aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
关闭操作常量
常量
|
描述
|
EXIT_ON_CLOSE
|
调用System.exit(0)
|
DISPOSE_ON_CLOSE
|
在窗体上调用dispose()
|
ON_NOTHING_ON_CLOSE
|
忽略请求
|
HIDE_ON_CLOSE
|
在窗体上调用setVisible(false);这是默认行为
|
layout属性是比较奇特的。默认情况下,设置JFrame的布局管理器会将调用传递给内容面板。我们不可以修改JFrame的默认布局管理器。
JFrame还有另外一个静态属性:defaultLookAndFeelDecorated。这个属性与JRootPane的windowDecorationStyle属性结合使用。当设置为true时,新创建的窗体会使用观感中的装饰而不是窗口管理中的装饰进行装饰。当然,只有当前的观感支持窗口装饰时才会发生这种情况。列表8-2显示了另一种创建与图8-2相同的屏幕的方法(通过使用Metal观感所提供的窗口装饰)。
package swingstudy.ch08;
import java.awt.EventQueue;
import javax.swing.JFrame;
public class AdornSample2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable runner = new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Adornment Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
8.2.3 向JFrame添加组件
因为JFrame实现了RootPaneContainer接口并且使用JRootPane,我们不能直接向JFrame添加组件。相反,我们将组件添加到JFrame所包含的JRootPane。在J2SE 5.0之前,我们需要使用下面的方法来添加组件:
JRootPane rootPane = aJFrame.getRootPane();
Container contentPane = rootPane.getContentPane();
contentPane.add(...);
这可以用下面的语句进行简化:
aJFrame.getContentPane().add(...);
如果我们尝试直接向JFrame添加组件,则会抛出运行时错误。
由于许多建议(或是抱怨?),Sun最终决定将add()方法修改为代理:
使用J2SE 5.0时,当我们向JFrame添加组件时,他们实际上被添加到了RootPaneContainer的内容面板。
8.2.4 处理JFrame事件
JFrame类支持11种不同的监听器的注册:
- ComponentListener:确定窗体何时移动或修改尺寸
- ContainerListener:通常并不添加到JFrame,因为我们将组件添加到其JRootPane的内容面板。
- FocusListener:确定窗体何时获得或是失去输入焦点。
- HierarchyBoundsListener:确定窗体何时移动或是修改尺寸。其作用与ComponentListener类似,因为窗体是组件的顶层容器。
- HierarchyListener:确定窗体何时显示或隐藏。
- InputMethodListener:用于国际化时与输入法结合使用。
- KeyListener:通常并不添加到JFrame。相反,我们为其内容面板注册一个键盘动作,如下所示:
JPanel content = (JPanel)frame.getContentPane();
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
content.registerKeyboardAction(actionListener, stroke,
JComponent.WHEN_IN_FOCUSED_WINDOW);
- MouseListener与MouseMotionListener:用于监听鼠标以及鼠标动作事件。
- PropertyChangeListener:用来监听绑定属性的改变。
- WindowListener:来确定窗口何时被图标化或是取消图标化或是用户正在尝试打开或关闭窗口。
通过defaultCloseOperation属性,我们通常并不需要添加WindowListener来帮助处理关闭窗体或是停止程序。
8.2.5 扩展JFrame
如果我们需要扩展JFrame,这个类有两个重要的protected方法:
protected void frameInit()
protected JRootPane createRootPane()
通过在子类中重写这些方法,我们可以自定义初始外观以及窗体或是其JRootPane的行为。例如,在列表8-3中所示的ExitableJFrame类的例子中,默认的关闭操作被初始化EXIT_ON_CLOSE状态。无需要为每一个创建的窗体调用setDefaultCloseOperation()方法,我们可以使用这个类进行替换。因为JFrame被继承,我们并不需要在其构造函数中添加frameInit()方法的调用。其父类自动调用这个方法。
package swingstudy.ch08;
import javax.swing.JFrame;
public class ExitableFrame extends JFrame {
public ExitableFrame() {
}
public ExitableFrame(String title) {
super(title);
}
protected void frameInit() {
super.frameInit();
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
注意:如果我们重写JFrame的frameInit()方法,记住首先调用super.frameInit()来初始化其默认行为。如果我们忘记了并没有自己重新实现所有的默认行为,我们的新窗体的外观与行为就会不同。
分享到:
相关推荐
分层介绍java Swing组件,详细说明rootPane,LayeredPane,rootPane,contentPane之间的关系
NavigationPane是软件开发中常见的一种界面元素,尤其在Windows应用和移动应用设计中,它扮演着导航和组织内容的关键角色。NavigationPane控件通常用于创建一个侧滑菜单,用户可以通过滑动屏幕或点击按钮来展示或...
【前端开源库-contacts-pane】是一个专为管理联系人而设计的开源项目,它提供了通讯簿、组和个人联系人的高效管理界面。这个库是前端开发中的一个重要工具,它旨在简化Web应用程序中的联系人数据处理,为用户提供...
"folder-pane"就是一个这样的开源库,专门用于实现文件夹窗格功能,为用户带来类似文件浏览器的交互体验。这个库尤其适用于需要处理大量文件数据、提供文件浏览和管理的Web应用。 首先,我们要理解什么是“文件夹...
【前端开源库-meeting-pane】是一款专为实现会议协作功能设计的前端库,它提供了实体兼容窗格,使得在各种设备上进行会议协同工作变得更加便捷和高效。在现代的在线会议场景中,用户需要能够在不同平台上顺畅地共享...
开发者可以克隆或下载这个仓库来集成到自己的项目中,或者对其进行二次开发和定制,以满足特定需求。在实际使用中,可能需要通过npm(Node Package Manager)进行安装,命令可能是`npm install source-pane-master`...
解决Vue对Element中的el-tab-pane添加@click事件无效
其中,导航窗格(Navigation Pane)是资源管理器的重要组成部分,它提供了快速访问电脑文件夹、库、控制面板等位置的方式。然而,系统默认的导航窗格项可能无法满足所有用户的个性化需求。为了解决这个问题,出现了...
在使用"pane-fixer-centos"之前,你需要先下载项目中的脚本文件到本地,然后通过终端运行该脚本,赋予其执行权限(如`chmod +x pane-fixer-centos`),最后执行该脚本(如`./pane-fixer-centos`)。执行过程中,脚本...
Atom-嘿pane是一款专为Atom文本编辑器设计的插件,其主要功能是放大当前活动的窗格,提升用户在编程或文本编辑过程中的聚焦能力。Atom作为一个由GitHub开发的开源文本编辑器,利用Web技术如HTML、CSS和JavaScript...
Property name for specifying skin to be used on the specific root pane. This property can only be installed on a JRootPane and will affect all the controls in that root pane. The value must be an ...
DotnetBar 8.1.0.6教程-NavigationPane 从官方网站下载的教程,是用VB演示的如何使用DotnetBar的,是英文版的。 在C#中用起来一样,但愿对大家有用。
4pane_5.0.orig.tar.gz 4pane_5.0-2.debian.tar.xz 4pane_5.0-2.dsc 4pane_5.0-2_amd64.deb 4pane_5.0-2_i386.deb 4pane_5.0-2_arm64.deb 4pane_5.0-2_mips64el.deb 需要国产服务器操作系统或者服务器操作系统的...
标题中的"pane-management-源码.rar"表明这是一个关于“pane管理”的源代码压缩包,可能是某个软件或系统组件的一部分,用于处理用户界面中的pane布局和管理。然而,由于没有具体的标签来指明这是哪种编程语言或者...
**FilePane使用教程** FilePane是一款专为Mac OS平台设计的高效工具,它极大地简化了用户在处理文本和图片时的复制、粘贴操作。通过FilePane,你可以无需复杂的键盘快捷键,只需简单的拖放动作就能完成文件和信息的...
Chat-pane 是一个专为前端开发设计的开源库,主要用于构建聊天窗口功能。它提供了一种高效、可定制的方式来实现各种类型的聊天界面,如实时通信、客户服务对话框或社交媒体的私信功能。作为一个开源项目,Chat-pane ...
Vue多分割窗格 基于Vue.js的组件。 提供无限的可调整大小的多窗格支持。 演示版 | | | 安装 npm i vue-multi-split-pane ... onPaneCollapsed ( paneIndex , paneClass , containerClass ) { console . log
【标题】"Cupertino Pane Master源码解析" 在IT行业中,源码是理解软件工作原理的关键,特别是对于开发者而言,深入研究源码有助于提升技能和解决问题。本篇将详细探讨"cupertino-pane-master"项目,这是一个与iOS...
Vue分割窗格使用Vue.js的可调拆分窗格安装# yarn (recommend)$ yarn add vue-split-pane# npm$ npm install vue-split-pane --save用法CDN < script src =" https://unpkg.com/vue-split-pane " > </ ...
在本文中,我们将深入探讨如何解决一个特定问题:当使用`el-tabs`配合`el-dialog`时,如何确保每次打开`el-dialog`时,对应的`el-tab-pane`内容能够正确更新。 首先,问题描述是这样的:在Vue项目中,开发者使用了`...