------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
一、概述
GUI(GraphicalUser Interface) ,图形用户界面,是计算机与用户交互的方式。计算机与用户交互有两种方式:GUI和CLI。对两种方式的特点进行介绍:
GUI:GraphicalUser Interface,图形用户接口,用图形方式,显示计算机操作界面,方便直观。
CLI:Command LineUser Interface,命令行用户接口,就是常见的Dos命令行操作,需要记住一些命令,操作不直观。
Java将GUI提供的对象,都存在于两个包中:java.Awt包和java.Swing包。
java Awt包:Abstract Window Toolkit,抽象窗口工具包。要调用本地系统方法实现功能,属重量级控件。
java Swing包:在Awt的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由Java实现,增强了移植性,属轻量 级控件
还有一个 Eclipse提供的Swt包。
通过下图了解java中各组件之间的继承关系。如图:
Container:容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
Container常用子类:Window Panel(面板,不能单独存在)
Window常用子类:Frame Dialog
二、布局管理器
布局就是容器的组件排列方式。
常见的布局管理器:
(1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器。
(2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame默认的管理器。窗体中只有一个组件时,覆盖整个窗体
(3)GridLayout:网格式布局管理器,规则的矩阵,如计算器。
(4)CardLayout:卡片式布局管理器,即选项卡。
(5)GridBayLayout:网格包布局管理器,非规则矩阵
如果存在多种布局方式,如何创建窗体界面呢?步骤:
(1)先将窗体Frame进行大区域的划分,设置其布局管理器,加入面板Panel
(2)将组件加入Panel,设置面板的布局管理器。
三、窗体的创建过程
步骤:1.创建Frame窗体 Frame f=new Frame(标题);2.对窗体进行基本设置,如大小、位置、布局等。
f.setSize(int wight,int hight) 设置窗体大小
f.setLocation(int x,int y) 设置窗体显示位置,x为横坐标
f.setBounds(int x,int y,int wight,int hight) 直接设置窗体的位置和大小
f.setLayout(Layout layout) 选择布局格式。
3.定义组件。如:Button b=new Button(按钮名);
4.将组件添加到窗体中。f.add(b);
5.显示窗体 f.setVisible(true);如果传入false窗体不显示。
下面通过一段代码展示整个过程:
public static void main(String[] args)
{
//创建窗体
Frame f=new Frame("我的窗体");
//对窗体进行基本设置
f.setBounds(400, 500, 400, 350);//设置窗体的位置和大小
f.setLayout(new FlowLayout());//设置流式布局
//定义组件
Button b=new Button("按钮");
//添加组件
f.add(b);
//显示窗体
f.setVisible(true);
}
四、事件的监听机制
首先通过事件的监听流程图,对事件的监听机制进行一下认识,如图:
组成部分:
事件源:awt或swing包中的图形界面组件。
事件(Event):每一个事件都有自己特有的对应事件和共性事件。
监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到监听器里。
事件处理:引发事件后的处理方式。
事件源、事件、监听器可以通过获取其对象来使用,最后的事件处理方式需要自己定义。
操作步骤:
1.确定事件源,作用在窗体 ,还是窗体的哪个组件上。
2.通过事件源对象的addXXXlistener()方法将监听器注册到该事件源上。 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类表示该对象。
3.覆盖方法,方法的参数一般是XXXEvent类型的变量。在事件触发后就会把事件打包成对象传递给这个变量。
下面通过具体的几个程序学习各种操作事件包括键盘事件、鼠标事件等的监听和处理过程。如下:
/**
创建一个窗体 ,并让窗体和按钮都能实现关闭窗体的功能
*/
class EventDemo
{
//定义组件引用
private Frame f;
private Button b;
EventDemo(){
init();
}
//创建窗体,实现功能
private void init(){
//创建窗体
f=new Frame("My Frame");
//对窗体进行基本设置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
//添加组件
b=new Button("My Button");
f.add(b);
//加载事件
myEvent();
//显示窗体
f.setVisible(true);
}
//注册事件
private void myEvent(){
//实现窗体的关闭功能
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//实现按钮的关闭功能
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void main(String[]args){
//运行窗体
new EventDemo();
}
}
从上面的程序可以得到几个知识点:1.当要添加的监听器内的方法很多时(一般超过2个),这时可以添加它的子类XXXAdapter来代替,XXXAdapter已经覆盖了对应的监听器的方法,添加时只需要覆盖需要的方法即可。2.查阅组件的功能,选择要添加的监听器。3.明确事件,并对事件处理。添加什么监听器,就需要添加什么事件。
/**
给按钮添加键盘、鼠标监听。
*/
class EventDemo
{
//定义组件引用
private Frame f;
private Button but;
EventDemo()
{
init();
}
private void init()
{
//创建窗体
f = new Frame("my frame");
//窗体设置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
//创建组件
but = new Button("my button");
//添加组件
f.add(but);
//加载事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//给按钮添加键盘监听。
but.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("enter is coming");
}
});
//给按钮添加鼠标监听
but.addMouseListener(new MouseAdapter()
{
private int count = 1;
private int clickCount = 1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入到该组件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("双击动作"+clickCount++);
}
});
}
public static void main(String[] args)
{
new EventDemo();
}
}
要注意的是一个组件上如果即添加了鼠标监听,又添加了活动监听,会先执行鼠标监听的处理动作。
/**
列出指定目录内容
*/
class EventDemo
{
//定义组件引用
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
EventDemo()
{
init();
}
//窗体创建,功能实现
private void init()
{
f = new Frame("My Frame");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25,70);
//添加组件
f.add(tf);
f.add(but);
f.add(ta);
//加载事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent()
{
//文本框添加键盘监听
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
//按钮添加活动监听
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showDir();
}
});
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
//定义显示目录内容的方法
private void showDir()
{
//获得录入的目录
String dirPath = tf.getText();
File dir = new File(dirPath);
//若目录存在,在文本区显示目录下的内容。
if(dir.exists() && dir.isDirectory())
{
ta.setText("");
String[] names = dir.list();
for(String name : names)
ta.append(name+"\r\n");
}
}
public static void main(String[] args)
{
new EventDemo();
}
}
注意的是这个窗体在运行时,用户有可能输入的不是一个目录,这时就需要对用户进行提醒,就需要另一个组件——对话框。下面就通过建立对话框,完善该程序的功能,在输入错误的信息时,就调用对话框,提醒用户。如下:
class EventDemo
{
//定义组件引用
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog d;
private Label lab;
private Button dBut;
EventDemo()
{
init();
}
//窗体创建,功能实现
private void init()
{
f = new Frame("My Frame");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25,70);
//将窗体、标题、模式传入
d = new Dialog(f,"提示信息",true);
d.setBounds(400,200,240,150);
d.setLayout(new FlowLayout());
lab = new Label();
dBut = new Button("确定");
//添加组件
d.add(lab);
d.add(dBut);
f.add(tf);
f.add(but);
f.add(ta);
//加载事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent()
{
//文本框添加键盘监听
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
//按钮添加活动监听
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showDir();
}
});
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//给对话框的按钮添加活动监听。
dBut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
//给对话框添加窗口监听
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
}
//定义显示目录内容的方法
private void showDir()
{
//获得录入的目录
String dirPath = tf.getText();
File dir = new File(dirPath);
//若目录存在,在文本区显示目录下的内容。
if(dir.exists() && dir.isDirectory())
{
ta.setText("");
String[] names = dir.list();
for(String name : names)
ta.append(name+"\r\n");
}
//目录不存在,让对话框可见,提醒用户。
else
{
String info = "您输入的信息:"+dirPath+"是错误的。请重输";
lab.setText(info);
d.setVisible(true);
}
}
public static void main(String[] args)
{
new EventDemo();
}
}
五、菜单
菜单栏(MenuBar):可添加菜单和菜单条目。要先创建菜单栏,再创建菜单。通过setMenuBar()方法,将菜单栏添加到窗体中
菜单(Menu):继承菜单项,可添加菜单和菜单项。
菜单项(MenuItem):最终的菜单项。
下面通过一个程序展示菜单的建立以及菜单功能的实现 ,如下:
/**
建立一个具有退出功能的菜单项
*/
class EventDemo
{
private Frame f;
private MenuBar mb;
private Menu m,subMenu;
private MenuItem closeItem,subItem;
EventDemo()
{
init();
}
public void init()
{
f = new Frame("My Frame");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
//创建菜单、菜单栏、菜单项对象
mb = new MenuBar();
m = new Menu("文件");
subMenu = new Menu("子菜单");
subItem = new MenuItem("子条目");
closeItem = new MenuItem("退出");
subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
//添加菜单栏
f.setMenuBar(mb);
//加载事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent()
{
//给菜单项添加监听
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 EventDemo();
}
}
通过对菜单项或菜单添加活动监听,可以进行对应的事件处理,实现功能。下面利用菜单制作一个简易的记事本程序,这时就需要另一个组件——FileDialog(文件对话框),具体程序如下:
public class EventDemo
{
//定义组件引用
private Frame f;
private MenuBar bar;
private TextArea ta;
private Menu fileMenu;
private MenuItem openItem,saveItem,closeItem;
private FileDialog openDia,saveDia;
private File file;
EventDemo()
{
init();
}
public void init()
{
f = new Frame("my window");
f.setBounds(300,100,650,600);
bar = new MenuBar();
ta = new TextArea();
fileMenu = new Menu("文件");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
bar.add(fileMenu);
f.setMenuBar(bar);
//建立文件对话框,传入窗体、标题、模式
openDia = new FileDialog(f,"打开",FileDialog.LOAD);
saveDia = new FileDialog(f,"保存",FileDialog.SAVE);
//在窗体上添加文本区
f.add(ta);
//加载事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent()
{
//给保存菜单项添加活动监听
saveItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//若文件为新建,利用文本对话框获取存入地址。
if(file==null)
{ //显示文件对话框
saveDia.setVisible(true);
String dirPath = saveDia.getDirectory();
String fileName = saveDia.getFile();
if(dirPath==null || fileName==null)
return ;
file = new File(dirPath,fileName);
}
//将内容写入文件中
try
{
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
String text = ta.getText();
bufw.write(text);
bufw.flush();
bufw.close();
}
catch (IOException ex)
{
throw new RuntimeException("保存失败");
}
}
});
//给打开菜单项添加活动监听
openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
openDia.setVisible(true);
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();
if(dirPath==null || fileName==null)
return ;
//清空文本区
ta.setText("");
file = new File(dirPath,fileName);
//读取打开的文件,写入文本区中
try
{
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line = null;
while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n");
}
bufr.close();
}
catch (IOException ex)
{
throw new RuntimeException("读取失败");
}
}
});
//给关闭菜单项添加活动监听
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 EventDemo();
}
}
-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------