——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、GUI概述
1、 GUI:Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机的操作图形界面。方便、直观。
CLI:Command line User Interface(命令行用户接口),就是DOS 命令行操作,不直观。
2、 Java 为GUI 提供的对象,都存在java.Awt 和javax.Swing 两个包中。
Awt 与Swing:
java.Awt : (Abstract Window Toolkit,抽象窗口工具集),需要调用本地系统方法实现功能。属重量级控件。跨平台性较弱。
javax.Swing :在AWT 基础上,建立一套图形界面系统,其中提供了更多组件,而且完全由Java 实现。增强了可移植性,属轻量级控件。
开发时,制作图形化界面时,一般需要导入两个包:import java.awt.; 和import java.awt.event.;
3、 GUI继承关系图:
二、布局管理器
1、布局:容器中组件的排放方式。
2、 常见的布局管理器:
FlowLayout(流式布局管理器):从左到右的顺序排列。Panel 默认的布局管理器。
BorderLayout(边界布局管理器):东南西北中。Frame 默认的布局管理器。
GridLayout(网络布局管理器):规则的矩阵。
GardLayout(卡片布局管理器):选项卡。
GridBagLayout(网格包布局管理器):非规矩的矩阵。
三、Component
1、 Component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。
2、 常用子类:Window、Panel(面板,不能单独存在)
Window 常用子类:Frame、Dialog
Frame 类:是带有标题和边框的顶层窗口。若显示窗体,必须设置setVisible 显示。设置Frame 时,有一个默认的管理器是边界式布局(BorderLayout)。
3、 方法
add() //添加组件(含参数)
setVisible(Boolean b) //根据参数的值来显示或隐藏组件
setSize() //设置窗体大小,参数为窗口的横坐标和纵坐标
setLocation() //设置窗体在本地位置,参数为横、纵坐标
setLayout() //设置布局管理器(参数可以是相应布局管理器的对象)
setBounds() //移动组件并调整其大小,参数是4 个坐标(左边距、右边距、宽、高)
addMouseListener() //添加指定的鼠标监听器
addKeyListener() //添加键盘监听事件
4、 创建图形化界面的步骤:
1)创建frame 窗体。
2)对窗体进行基本设置。比如大小,位置,布局。
3)定义组件。
4)将组件通过窗体的add 方法添加到窗体中。
5)让窗体显示,通过setVisible(true)
代码示例:
package demo.awt;
import java.awt.*;
import java.awt.event.*;
public class FrameDemo {
private Frame f;
private Button but;
FrameDemo(){
init();
}
public void init(){
f=new Frame("my frame");//新建Frame,标题为my frame
f.setBounds(300,100,600,500);//设置边界
f.setLayout(new FlowLayout());//设置模式
f.setVisible(true);//设置为可见
}
public static void main(String[] args) {
new FrameDemo();
}
}
四、事件监听机制
1、 事件监听机制组成:事件源、事件(Event)、监听器(Listener)、事件处理(引发事件后处理方式)。
(1)事件源(组件):awt或swing包中的那些图形界面组件
(2)事件(Event):每一个事件源都有自己特有的对应事件和共性事件
(3)监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到侦听器中。
(4)事件处理:引发事件后的处理方式。
2、 事件监听机制流程图
3、 使用说明
组成的前三个在java中都已将定义好了,直接获取其对象来用即可,我们需要做的就是对产生的动作进行处理。
步骤:
(1)确定事件源(容器或组件)。通过事件源对象的addXXXListener()方法将监听器注册到该事件源上。该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
(2)一般用匿名内部类来表示。在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
代码示例:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class AwtDemo {
public static void main(String[] args) {
Frame f=new Frame("my awt");
f.setSize(500, 100);//设置大小
f.setLocation(300, 200);//设置位置
f.setLayout(new FlowLayout());//设置布局模式
Button b=new Button("我是一个按钮");
f.add(b);
f.addWindowListener(new MyWin());//添加监听器
f.setVisible(true);
}
}
class MyWin extends WindowAdapter{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
五、Window(窗体)
1、 监听:addWindowListener():添加窗口事件监听器
2、 WindowListener接口,复写方法,实例化对象,才能使用。但它有一个已复写全部方法的子类WindowAdapter。
3、WindowAdapter:接收窗口事件的抽象适配器类。此类中的方法为空。它是一个没有抽象方法的抽象类,目的是不能创建对象。此类存在的意思是方便创建监听器对象。使用:因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。并覆盖了其中的所有方法,那么只要继承WindowAdapter,覆盖需要的方法即可。
方法:
windowActivated():激活窗口时调用。
windowClosed():当窗口已被关闭时调用。
windowClosing():窗口正处在关闭过程中时调用。
windowDeactivated():后置窗口时调用。
windowDeiconified():取消图标化窗口时调用。
windowGainedFocus():该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。
windowIconified():窗口最小化时调用。
windowLostFocus():该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。
windowOpened():打开窗口时调用。
windowStateChanged():窗口状态改变时调用。
代码示例:
package demo.awt;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class MyWindowDemo {
private Frame f;
private TextField tf;
private Button bt;
private TextArea ta;
private Dialog d;
private Label lab;
private Button okbt;
MyWindowDemo(){
init();
}
public void init(){//初始化窗口
f=new Frame("my window");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf=new TextField(60);
bt=new Button("转到");
ta=new TextArea(25,70);
d=new Dialog(f, "提示信息-self",true);
lab=new Label();
okbt=new Button("确定");
d.add(lab);
d.add(okbt);
d.setBounds(400,200,240,150);
d.setLayout(new FlowLayout());
f.add(tf);
f.add(bt);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent() {//事件监听函数
okbt.addActionListener(new ActionListener() {//按钮事件监听器
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
d.setVisible(false);
}
});
bt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String path=tf.getText();
File file=new File(path);
if(file.exists()&&file.isDirectory()){
String[] dir=file.list();
for(String s:dir){
ta.append(s+"\n");
}
}
else{
String info="找不到"+path;
lab.setText(info);
d.setVisible(true);
}
}
});
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new MyWindowDemo();
}
}
六、Button(按钮)
1、监听:addActionListener():添加指定的动作监听器
2、 ActionListener 接口:用于接收操作事件的监听器接口。是少数没有适配器接口的其中一个。
其中只有一个方法actionPerformed(),作用:发生操作时调用。
3、 代码示例:
bt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
七、鼠标事件和键盘事件
7.1 鼠标事件
1、 MouseListener: 用于接收组件上“感兴趣的”鼠标事件(eg:按下、释放、单击、进入或离开)的监听器接口。有适配器。
2、 方法:
mouseClicked(MouseEvent e) //鼠标单击(按下并释放)
mouseEntered(MouseEvent e) //鼠标进入组件
mouseExited(MouseEvent e) //鼠标离开组件
mousePressed(MouseEvent e) //鼠标按下时
mouseReleased(MouseEvent e) //鼠标释放时
3、 MouseEvent: (适配器)
成员变量:static int mouse_clicked
方法:int getClickCount() //返回鼠标单击次数
7.2 键盘事件
1、 keyListener: 接收键盘事件的监听器接口。有适配器。
2、 方法:
keyPressed(keyEvent e) //按下某个键时调用此方法
keyReleased(keyEvent e) //释放某个键时调用此方法
keyTyped(keyEvent e) //键入某个键时调用此方法
3、 keyEvent: (适配器)
char getkeyChar() //返回与此事件中的键相关联的字符
int getkeyCode() //获取键盘对应的码
static String getKeyText(int keyCode) //通过码获取对应的键盘字符
InputEvent 类中isControlDown() //判断ctrl 键是否被按下
InputEvent 类中consume() //以非默认方式处理事件,屏蔽键
代码示例:
package demo.awt;
import java.awt.*;
import java.awt.event.*;
public class MouseAndKeyEvent {
private Frame f;
private Button but;
MouseAndKeyEvent(){
init();
}
public void init(){//初始化
f=new Frame("my frame");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Button b=new Button("按钮");
f.add(b);
b.addMouseListener(new MouseAdapter() {//鼠标监听
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标进入该组件");
}
});
b.addKeyListener(new KeyAdapter() {//键盘监听
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==e.VK_A)
System.out.println("yiyang");
}
});
f.setVisible(true);
}
public static void main(String[] args) {
new MouseAndKeyEvent();
}
}
八、MenuBar(菜单栏)
1、 MenuBar 类: 封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与Frame 对象关联,可以调用该框架的setMenuBar 方法。
2、 主要方法:
add() //添加菜单栏
3、 关联类:
MenuItem 类:菜单项
MenuMenuMenuMenu类:菜单条
add() //将指定菜单项或者标签添加到菜单栏。
MenuBar包括Menu,Menu包括MenuItem、Menu(带箭头)。
代码示例:
package demo.awt;
import java.awt.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyMenuDemo {
private Frame f;
private MenuBar mb;
private Menu m;
private MenuItem closeItem,openItem,saveItem;
MyMenuDemo(){
init();
}
private void init() {
f=new Frame("my window");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
//添加菜单栏
mb=new MenuBar();
m=new Menu("文件");
closeItem=new MenuItem("退出");
openItem=new MenuItem("打开");
saveItem=new MenuItem("保存");
m.add(openItem);
m.add(saveItem);
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent() {//菜单点击事件
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new FileDialog(f,"打开文件",FileDialog.LOAD).setVisible(true);
}
});
saveItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new FileDialog(f,"保存文件",FileDialog.SAVE).setVisible(true);
}
});
closeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}
九、Jar包双击执行
既然是图形化界面,就需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,那么如何通过双击程序就执行程序呢?这就需要将程序的class文件打包。
步骤如下:
1、首先要在java文件中导入一个包,没有则需创建一个包,如package mymenu;
2、生成包:通过编译javac -d c:\myclass MyMenu.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件
3、在此目录下新建一个文件,如1.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class: mymenu.MenuDemo”,只写引号中的内容。需要需要在冒号后有一个空格,在文件末尾要回车。
4、编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令
5、此时双击即可执行。