------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
GUI(图形用户界面)
GUI
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI
Command line User Interface (命令行用户接口)
就是常见的Dos命令行操作。
需要记忆一些常用的命令,操作不直观。
举例:
比如:创建文件夹,或者删除文件夹等
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
awt和swing包的概述
java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
GUI第一个案例
Container常用子类:Window Panel(面板,不能单独存在。)
Window常用子类:Frame Dialog
简单的窗体创建过程:
Frame f = new Frame(“my window”);
f.setLayout(new FlowLayout());
f.setSize(300,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
f.setVisible(true);
构造方法:
public Frame(String title) 构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
public void setBounds(int x, int y, int width, int height)移动组件并调整其大小。
由 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
案例:
public class FrameDemo2 {
public static void main(String[] args) {
//创建窗体
//设置标题
//Frame frame = new Frame();
//frame.setTitle("优化版本");
Frame frame = new Frame("优化版本");
//设置尺寸
//设置位置
//frame.setSize(400, 200);
//frame.setLocation(100, 100);
frame.setBounds(100, 100, 400, 200);
//显示窗体
frame.setVisible(true);
}
}
时间监听机制:
1:确定事件源(容器或组件)
2:通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
3:该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
4:一般用匿名内部类来表示。
在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
5:事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
事件源 : 被触发 事件的 对象 (银行)
事件 : 要激活的操作 (抢劫)
事件处理 : 对激活的事件进行处理(抓起来,枪毙)
事件监听器 : 监听事件源即将发生的事件(警察,监控器 )
人去银行案例:
事件源:
银行
事件:
interface 事件接口 {
void 抢劫();
void 取钱();
void 存钱();
}
事件处理:
class 事件处理 implements 事件接口 {
public void 抢劫(){
SOP( 抓起来,枪毙 );
}
public void 取钱(){
SOP( 放行 );
}
public void 存钱(){
SOP( 放行 );
}
}
事件监听器:
警察,监控器
-------------------------------------------------------
人去银行案例:
事件源:
银行
事件:
interface 事件接口 {
void 抢劫();
void 取钱();
void 存钱();
}
事件处理:
abstract class 事件处理 implements 事件接口 {
public void 抢劫(){
//SOP( 抓起来,枪毙 );
}
public void 取钱(){
//SOP( 放行 );
}
public void 存钱(){
//SOP( 放行 );
}
}
事件适配器类:
class 事件适配器类 extends 事件处理 {
public void 抢劫(){
SOP( 抓起来,送到警察局);
}
}
事件监听器:
警察,监控器
public class FrameDemo2 {
public static void main(String[] args) {
// 创建窗体
Frame frame = new Frame("事件适配器版本");
// 设置尺寸与位置
frame.setBounds(100, 100, 400, 200);
// 为窗口添加事件监听
// frame.addWindowListener(new MyWindowListener());
// frame.addWindowListener(new WindowListener)
// 适配器方式
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 退出Java虚拟机
System.exit(0);
}
});
// 显示
frame.setVisible(true);
}
}
适配器案例:
按钮点击事件:
public class ButtonDemo {
public static void main(String[] args) {
//创建窗体
Frame frame = new Frame("按钮点击");
frame.setBounds(200, 200, 200, 200);
//为窗体添加窗体监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//退出JVM
System.exit(0);
}
});
//--------------------------------
//创建按钮
Button btn = new Button("点我呀~");
//为按钮添加事件监听
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//点击按钮时触发该方法
System.out.println("哎呀,疼");
}
});
//把按钮添加到窗体中
frame.add(btn);
frame.setVisible(true);
}
}
把数据通过文本框转移到文本域:
/*
把数据通过文本框转移到文本域
方法:
setsetLayout( new FlowLayout()); //更该窗体布局方式
TextField:文本框
TextArea: 文本域
方法:
public String getText() 获取文本数据
public void setText(String str) 设置文本数据
public void append(String str) 在原有数据的基础上,添加新数据
*/
public class TextDemo {
public static void main(String[] args) {
Frame frame = new Frame("文本框转移到文本域");
frame.setBounds(200, 200, 400, 300);
//更改窗体布局
frame.setLayout(new FlowLayout());//流式布局
//---------------------------
//创建一个文本框
final TextField textField = new TextField(40);
//添加到窗体中
frame.add(textField);
//创建一个按钮
Button btn = new Button("转到");
//添加到窗体中
frame.add(btn);
//创建一个文本域(多行文本框)
final TextArea textArea = new TextArea(13, 45);
//添加到窗体中
frame.add(textArea);
//----------------------------
//添加按钮点击监听
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取文本框中的数据
String data = textField.getText();
//System.out.println(data);
//清空文本框中的原有数据
textField.setText("");
//把数据存放到 下面的文本域中
//textArea.setText(data);
textArea.append(data+"\n");
}
});
//添加窗体监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setVisible(true);
}
}
鼠标监听事件:
public class MouseDemo {
public static void main(String[] args) {
final Frame frame = new Frame("演示鼠标事件");
frame.setBounds(200, 200, 400, 300);
//改变窗体布局
//frame.setLayout(new FlowLayout());
frame.setLayout(null);//帧布局
//-----------------------
Button blueButton = new Button("蓝色");
blueButton.setBounds(100, 100, 50, 50);
frame.add(blueButton);
Button redButton = new Button("红色");
redButton.setBounds(200, 100, 50, 50);
frame.add(redButton);
//-----------------------
//为按钮添加鼠标监听
blueButton.addMouseListener(new MouseAdapter() {
//进入到某一个组件上时激活
@Override
public void mouseEntered(MouseEvent e) {
//窗体的背景蓝色
frame.setBackground(Color.BLUE);
}
//离开某一个组件时激活
@Override
public void mouseExited(MouseEvent e) {
//窗体的背景白色
frame.setBackground(Color.WHITE);
}
});
//为按钮添加点击监听
blueButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("蓝色");
}
});
redButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("红色");
}
});
//为窗体添加事件监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//退出JVM
System.exit(0);
}
});
frame.setVisible(true);
}
}
键盘事件:录入QQ号码,如果不是数字就不让录入
/*
*
* KeyListener: 接收键盘事件的接口
* KeyAdapter :接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
* public void keyPressed(KeyEvent e)按下某个键时调用此方法。
* 参数:KeyEvent 表示组件中发生键击的事件。
* KeyEvent类
* public char 返回与此事件中的键关联的字符
* public void consume()使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件。
* Label: 标签:
*/
public class KeyDemo {
public static void main(String[] args) {
//创建窗体
Frame frame = new Frame("录入QQ号码");
//设置尺寸与位置
frame.setBounds(200, 200, 400, 300);
//设置布局方式
frame.setLayout(null);//帧布局
//------------------------
//创建标签
Label label = new Label("录入QQ号码:");
label.setBounds(100, 100, 200, 30);
//添加到窗体中
frame.add(label);
//创建文本框
TextField textField = new TextField(40);
textField.setBounds(100, 130, 200, 30);
//添加到窗体中
frame.add(textField);
//------------------------
//为文本框添加键盘事件监听
textField.addKeyListener(new KeyAdapter() {
//按下某个键时调用此方法
@Override
public void keyPressed(KeyEvent e) {
//获取到键盘输入的字符
char ch = e.getKeyChar();
//System.out.println(ch);
//判断当前字符是否在'0'到'9'之间
if (ch >= '0' && ch <= '9') {
//正常显示
System.out.println(ch);
} else {
//不让字符在窗口中显示
System.out.println("被阻止显示:" + ch);
e.consume();//阻止
}
}
});
//为窗体添加事件监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//退出JVM
System.exit(0);
}
});
//显示
frame.setVisible(true);
}
}
菜单组件概述
MenuBar,Menu,MenuItem
先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
也可以菜单添加到菜单中,作为子菜单。
通过setMenuBar()方法,将菜单添加到Frame中。
public class MenuDemo2 {
public static void main(String[] args) {
final Frame frame = new Frame("多层菜单");
//获取窗口的标题
final String title = frame.getTitle();
frame.setBounds(100, 100, 400, 200);
//----------------------
//创建菜单栏
MenuBar menuBar = new MenuBar();
//创建菜单
Menu fileMenu = new Menu("文件");
Menu titleMenu = new Menu("更改标题");
//创建菜单项
final MenuItem mi1 = new MenuItem("好好学习");
final MenuItem mi2 = new MenuItem("天天向上");
final MenuItem mi3 = new MenuItem("恢复标题");
final MenuItem mi4 = new MenuItem("退出");
//组成完整菜单
titleMenu.add(mi1);
titleMenu.add(mi2);
titleMenu.add(mi3);
fileMenu.add(titleMenu);
fileMenu.add(mi4);
menuBar.add(fileMenu);
frame.setMenuBar(menuBar);
//---------------------
//为菜单项添加事件监听
//好好学习
mi1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setTitle(mi1.getLabel());
}
});
//天天向上
mi2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setTitle(mi2.getLabel());
}
});
//恢复标题
mi3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setTitle(title);
}
});
//退出
mi4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
//----------------------
frame.setVisible(true);
}
}