Java之GUI

(本文为博主JAVA课程学习总结)

GUI —— 图形化用户界面

JFCJava Foundation Classed)是开发GUIAPI

JFC包括:AWTAbstract Window Toolkit抽象窗口工具包)、Swing组件(建立在AWT上功能更强大的图形组件包)、JAVA 2D(实现高质量二维图形)

一.AWT框架

AWT的核心类是Component类。

Component类由基本组件和容器(Container)组件组成。

容器组件主要分为两部分:Window容器和Panel(面板)容器。

*FrameWindow容器的子类,带有标题和缩放角的窗口

Frame容器被创建后是不可见的,所以我们需要人为设置可见性。

常用方法:

显示窗体方法      void setVisibleboolean b)(在Component类中)

设置背景色        setBackground(Color C)

设置尺寸        setSizeint a , int b(a为长,b为宽,单位为像素)

限制位置和尺寸  setBoundint x,int y,int a,int b(x,y为窗体横纵座标)

Panel容器只能存在于其它的容器中,不能单独显示。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其它面板。

面板的默认布局管理器是FlowLayout布局管理器。

若需要要去掉panel指令的默认管理器,可初始化panel后调用方法panel.setLayout(null).

容器可以容纳容器和组件,故可以制作出复杂的布局。

二.布局管理器

布局管理器:决定组件的位置和大小。

五种布局管理器:

FlowLayout(流式布局管理器)  

 

BorderLayout(边界布局管理器)

 

调用方法:

 

GridLayout(网格布局管理器)

 

CardLayout(卡片布局管理器)

它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,容器则充当卡片的堆栈。当容器第一次显示时,第一个添加到 CardLayout 对象的组件为可见组件。

GridBagLayout(网格包布局管理器)

每个Container都有默认的布局管理器,但是我们可以通过设置空布局管理器(setLayoutnull))来控制组件的大小和位置。

设置空布局管理器后,必须对所有组件调用setLocation()setSize()setBound()进行一个重定位。

 

二.AWT事件处理

AWT事件处理主要针对下述三类对象:

Event(事件):用户对组件的一个操作

Event Source(事件源):事件发生的场所,如Button1

Event Monitor(事件监听器):监听事件是否被处理。

 

引自海同网校

 

(一)AWT事件

AWT相关事件继承于java.awt.AWTEvent类。

这些事件分为两大类:低级事件和高级事件。

1.低级事件:基于组件的事件,如:

ComponentEvent         组建事件:组件尺寸与位置变化

ContainerEvent          容器事件:组件增加、移动

WindowEvent           窗口事件:关闭窗口、窗口闭合、图标化

FocusEvent             焦点事件:焦点的获得和丢失

KeyEvent               键盘事件

MouseEvent  鼠标事件

 

2.高级事件:基于语义的事件,如:

ActionEvent            动作事件:当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件。

AdjustmentEvent       调节事件:滚动条的滑动影响数目的改变等

ItemEvent             项目事件:选定或取消选定语义事件

TextEvent              文本事件:对文本对象的改变

 

(二)事件监听器

事件监听器通常是指一个类,通过该类必须实现与该事件类型相对应的接口。

注:事件监听器接口类名称与事件名称相对应。如:MouseEvent —— MouseListener

(三)事件适配器类

某些事件监听接口有对应的事件适配器类。通过事件适配器类,我们可以更简单地实现事件监听,从而缩短程序代码。

java.awt.event中定义的事件适配器类包括以下七个:

MouseAdapter(鼠标适配器)、MouseMotionAdapter(鼠标运动适配器)、KeyAdapter(键盘适配器)、WindowAdapter(窗口适配器)、ComponentAdapter(组件适配器)、ContainerAdapter(容器适配器)、FocusAdapter(焦点适配器)

(四)观察者模式

定义对象间的一对多依赖关系,当一方的对象改变状态时所有的依赖着都会得到通知并自动更新。

观察者模式中任意数目的观察者不必知道彼此的存在。这种状态使代码具有较好的可重用性。

1. Subject(主题)

提供注册和注销观察者的接口

2. Observer(观察者)

为需要在主题变化时获得通知的对象定义一个更新接口

3. ConcreteSubject(具体主题)

主题接口的一个实现类

4. ConcreteObserver(具体观察者)

观察者接口的实现类

 

三.Swing

Swing:用于开发Java应用程序用户界面的开发工具包

Swing控件可跨平台运行。

独立于本地平台的Swing控件称为轻量级控件,依赖于本地平台的AWT控件称为重量级控件。

工具包中所有的包都是以swing作为名称的,如:

javax.swingjavax.swing.event

swing组件的层次框架图:

 

(图片源自海通网校)

创建图形界面的主要步骤:

1.导入Swing

2.设置顶层容器

3.设置按钮和标签等Swing组件

4.将组件添加至容器中

5.处理事件

例:

 

(图片源自海同网校)

 

具体操作方法参照记事本实例。

 

 

代码如下:

package com.iotek.swing;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * Created by asus on 2017/2/15.
 * 记事本实例
 */
public class NotePadDemo {
    public static void main(String [] args){
        new MyFrame("记事本");
    }
}

class MyFrame extends JFrame {


    private JTextArea tv_area = null;
    private JScrollPane s_pane = null;//带滚动条的面板
    private
JMenuBar mb = null;//菜单栏
    private
JMenu m_file = null;//文件菜单
    private
JMenu m_help = null;//帮助菜单
    private
JMenuItem f_item_new = null;//文件菜单的菜单项(子菜单):新建
    private
JMenuItem f_item_open = null;//文件菜单的菜单项(子菜单):打开
    private
JMenuItem f_item_exit = null;//文件菜单的菜单项(子菜单):退出
    private
JMenuItem f_item_about = null;//文件菜单的菜单项(子菜单):关于
    public
MyFrame(String title) {
        super(title);
        init();
        registerListener();
    }
    //初始化相关的组件
    private void
init() {
        tv_area = new JTextArea();
        s_pane = new JScrollPane(tv_area);
        //在需要时出现水平滚动条
        s_pane
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        Container cpane = this.getContentPane();
        cpane.add(s_pane, BorderLayout.CENTER);
        this.setSize(500, 500);//设置窗体大小
        //初始化菜单
        mb
= new JMenuBar();//新建菜单
        m_file
= new JMenu("文件");//新建文件菜单和其菜单项
        f_item_new
= new JMenuItem("新建");
        f_item_open = new JMenuItem("打开");
        f_item_exit = new JMenuItem("退出");
        m_file.add(f_item_new);
        m_file.add(f_item_open);
        m_file.add(f_item_exit);
        m_help = new JMenu("帮助");//新建帮助菜单和其菜单项
        f_item_about
= new JMenuItem("关于");
        m_help.add(f_item_about);
        mb.add(m_file);//将文件菜单与帮助菜单添加到菜单栏上
        mb
.add(m_help);
        //把菜单栏添加到窗体中
        this
.setJMenuBar(mb);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口的时候退出应用程序
        //设置窗口在屏幕当中居中显示
        //定义一个工具包
        
Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();//获得屏幕尺寸信息
        int
screenWidth = screenSize.width;//获得当前屏幕宽度
        int
screenHeight = screenSize.height;//获得当前屏幕度
        int
windowWidth = this.getWidth();//获得当前窗体宽度
        int
windowHeight = this.getHeight();//获得当前窗体高度
        this
.setLocation((screenWidth - windowWidth) / 2, (screenHeight - windowHeight) / 2);//使屏幕居中
        this
.setVisible(true);//显示窗体

    
}

    //给相关组件设置事件监听器
    private void
registerListener() {
        f_item_new.addActionListener(e -> newFile());
        f_item_open.addActionListener(e->openFile());
        f_item_exit.addActionListener(e->exitFile());
        f_item_about.addActionListener(e->aboutFile());
    }
    private void newFile() {
        if (!tv_area.getText().equals("")) {
            int res = JOptionPane.showConfirmDialog(null, "是否保存?", this.getTitle(), JOptionPane.YES_NO_CANCEL_OPTION);
            if (res == JOptionPane.YES_OPTION) {
                //弹出文件保存对话框
                
FileDialog fd = new FileDialog(this, "保存文件", FileDialog.SAVE);
                fd.setVisible(true);
            } else {
                tv_area.setText("");//清空记事本中内容
            
}
        }
    }
    //打开记事本格式文件
    private void
openFile(){
        FileDialog of = new FileDialog(this,"打开文件",FileDialog.LOAD);
        of.setVisible(true);
    }

    //退出
    private void
exitFile(){
        if (!tv_area.getText().equals("")) {
            int res = JOptionPane.showConfirmDialog(null, "是否保存?", this.getTitle(), JOptionPane.YES_NO_CANCEL_OPTION);
            if (res == JOptionPane.YES_OPTION) {
                //弹出文件保存对话框
                
FileDialog fd = new FileDialog(this, "保存文件", FileDialog.SAVE);
                fd.setVisible(true);
            } else {
                tv_area.setText("");//清空记事本中内容
            
}
        }
        //退出程序
        
System.exit(0);
    }

    //关于
    private void
aboutFile(){
        AboutDialog aboutDialog = new AboutDialog(this,"about",true);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章