Java核心技术卷一第十章学习笔记(更新中~)
1.创建窗体
1.窗体的定义
在Java中,顶层窗口(没用包含在其他窗口中的窗口)被称为窗体
2.JFrame类
- JFrame类是极少数几个不绘制在画布上的Swing组件之一,因此,窗体的修饰部件是由用户的窗口系统绘制,而不是Swing绘制
- 注:绝大多数Swing组件都以字母“J”开头,如JFrame,JButton等。像Frame,Button在Java里面也有,但是这个属于AWT组件。因此,如果忘记在程序前面加上“J”,程序也可以编译通过。但是,将Swing和AWT组件混合使用将会导致视觉和行为的不一致。
- JFrame类本身只包含若干个改变窗体外观的方法,大多数用来处理窗体大小和位置的方法,都来自JFrame类的各个超类。其继承层次如下:
3. 事件分派线程
所有的Swing组件必须由事件分派线程配置,这是控制线程,它将鼠标点击和按键等事件传递给用户接口组件。其执行代码为:
EventQueue.invokeLater(()->{
statements
});
注:可以看到很多Swing程序并没有在事件分派线程初始化用户界面。原先完全可以接受在主线程中完成初始化,但是随着Swing组件越来越复杂,JDK开发人员无法保证这种方式的安全性,所以最好在事件分派线程中初始化用户界面,来确保安全性。
4. 关闭窗体
- 让程序简单的响应式退出的语句为
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- 在包含多个窗体的程序中, 不能在用户关闭其中的一个窗体时就让程序退出。在默认情 况下,用户关闭窗口时只是将窗体隐藏起来, 而程序并没有终止(在最后一个窗体不可见之 后,程序再终止,这样处理比较合适,而 Swing却不是这样工作的。)
- 仅仅只是构造窗体的话,窗体是不会自动地显示出来的, 窗体起初是不可见的。这就给程序员了一个 机会, 可以在窗体第一次显示之前往其中添加组件。为了显示窗体,main方法需要调用窗体的 setVisible 方法。
- 在初始化语句结束后,main方法退出。需要注意main方法退出并没有终止程序,终止的只不过是主线程。事件分派线程会保持程序处于激活的状态,直到关闭窗体或者调用System.exit方法终止程序。
完整的创建窗体的代码如下所示:
import java.awt.*;
import javax.swing.*;
public class SimpleFrameTest {
public static void main(String[] args) {
EventQueue.invokeLater(()->{
var frame=new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation();
frame.setVisible(true);
});
}
}
class SimpleFrame extends JFrame{
private static final int DEFAULT_WIDTH=300;
private static final int DEFAULT_HEIGHT=200;
public SimpleFrame(){
//setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
setSize();
}
public void setSize(){
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int screenWidth=screenSize.width;
int screenHeight=screenSize.height;
super.setSize(screenWidth/2,screenHeight/2);
}
public void setLocation() {
super.setLocation(300,200);
}
2.窗体属性
1.设置窗体属性的重要方法:
- setLocation 和 setBounds 方法用于设置窗体的位置。
- setlconlmage 用于告诉窗口系统在标题栏、任务切换窗口等位置显示哪个图标。
- setTitle 用于改变标题栏的文字。
- setResizable 利用一个 boolean 值确定窗体的大小是否允许用户改变
2.调整窗体属性
1.窗体定位
-
对 Component 类(是所有 GUI 对象的祖先) 和 Window 类 ( 是 Frame类的超类) 需要仔细地研究一下, 从中找到缩放和改变窗体的方法。
-
eg:在 Component 类中的 setLocation 方法是重定位组件的一个方法。如果调用
setLocation(x, y)
则窗口将放置在左上角水平 x 像素,垂直 y 像素的位置, 坐标( 0, 0 ) 位于屏幕的左上角。同样地, Component 中的 setBounds方法可以实现一步重定位组件(特别是 JFrame) 大小和 位置的操作, 例如:
setBounds(x, y, width, height)
2.属性
-
组件类的很多方法是以获取 / 设置方法对形式出现的,这样的一个获取 / 设置方法对被称为一种属性。eg:
public String getTitleO public void setTitle(String title)
-
属性包含属性名和类型。将 get 或 set 之后的 第一个字母改为小写字母就可以得到相应的属性名。
-
针对 get/set 约定有一个例外: 对于类型为 boolean 的属性, 获取方法由 is 开头。
3.窗体大小
-
要确定窗体大小,首先得确定屏幕大小。
-
获取屏幕大小的方法调用:
- Toolkit 类的静态方法 getDefault-Toolkit 得到一个 Toolkit 对象(Toolkit 类包含很多与本地窗口系统打交道的方法。)
- 调用 getScreenSize 方法,这个方法以 Dimension 对象的形式返回屏幕的大小。
- Dimension 对象同时 用公有实例变量 width 和 height 保存着屏幕的宽度和高度。
- 用屏幕大小的一个百分数指定窗体大小
-
相关代码:
Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize - kit,getScreenSizeQ; int screenWidth = screenSize.width; int screenHeight = screenSize.height; setSize(screenWidth / 2, screenHeight / 2);
4.设置窗体图标
Image img = new Inagelcon("icon.gif").getlmage();
setlconlnage(img);