(本文为博主JAVA课程学习总结)
GUI —— 图形化用户界面
JFC(Java Foundation Classed)是开发GUI的API集
JFC包括:AWT(Abstract Window Toolkit抽象窗口工具包)、Swing组件(建立在AWT上功能更强大的图形组件包)、JAVA 2D(实现高质量二维图形)
一.AWT框架
AWT的核心类是Component类。
Component类由基本组件和容器(Container)组件组成。
容器组件主要分为两部分:Window容器和Panel(面板)容器。
*Frame:Window容器的子类,带有标题和缩放角的窗口。
Frame容器被创建后是不可见的,所以我们需要人为设置可见性。
常用方法:
显示窗体方法 void setVisible(boolean b)(在Component类中)
设置背景色 setBackground(Color C)
设置尺寸 setSize(int a , int b)(a为长,b为宽,单位为像素)
限制位置和尺寸 setBound(int x,int y,int a,int b)(x,y为窗体横纵坐标)
Panel容器只能存在于其它的容器中,不能单独显示。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其它面板。
面板的默认布局管理器是FlowLayout布局管理器。
若需要要去掉panel指令的默认管理器,可初始化panel后调用方法panel.setLayout(null).
容器可以容纳容器和组件,故可以制作出复杂的布局。
二.布局管理器
布局管理器:决定组件的位置和大小。
五种布局管理器:
FlowLayout(流式布局管理器)
BorderLayout(边界布局管理器)
调用方法:
GridLayout(网格布局管理器)
CardLayout(卡片布局管理器)
它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,容器则充当卡片的堆栈。当容器第一次显示时,第一个添加到 CardLayout 对象的组件为可见组件。
GridBagLayout(网格包布局管理器)
每个Container都有默认的布局管理器,但是我们可以通过设置空布局管理器(setLayout(null))来控制组件的大小和位置。
设置空布局管理器后,必须对所有组件调用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.swing,javax.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);
}
}