Java核心技术卷一第十章学习笔记(更新中~)

1.创建窗体

1.窗体的定义

在Java中,顶层窗口(没用包含在其他窗口中的窗口)被称为窗体

2.JFrame类

  • JFrame类是极少数几个不绘制在画布上的Swing组件之一,因此,窗体的修饰部件是由用户的窗口系统绘制,而不是Swing绘制
  • 注:绝大多数Swing组件都以字母“J”开头,如JFrame,JButton等。像Frame,Button在Java里面也有,但是这个属于AWT组件。因此,如果忘记在程序前面加上“J”,程序也可以编译通过。但是,将Swing和AWT组件混合使用将会导致视觉和行为的不一致
  • JFrame类本身只包含若干个改变窗体外观的方法,大多数用来处理窗体大小和位置的方法,都来自JFrame类的各个超类。其继承层次如下:
  • img

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.窗体大小

  • 要确定窗体大小,首先得确定屏幕大小。

  • 获取屏幕大小的方法调用:  

    1. Toolkit 类的静态方法 getDefault-Toolkit 得到一个 Toolkit 对象(Toolkit 类包含很多与本地窗口系统打交道的方法。)
    2. 调用 getScreenSize 方法,这个方法以 Dimension 对象的形式返回屏幕的大小。
    3. Dimension 对象同时 用公有实例变量 width 和 height 保存着屏幕的宽度和高度。
    4. 用屏幕大小的一个百分数指定窗体大小
  • 相关代码:

    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);
posted @ 2021-11-28 00:58  灰之魔女伊蕾娜  阅读(75)  评论(0)    收藏  举报