转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9795435
day22
01-GUI(概述)
GUI(图形用户界面)
1、 GUI(Griphical User Interface)图形用户接口
用图形的方式来显示计算机操作的界面,这样方便更直观。
2、 CLI(Command line User Interface)命令行用户接口
就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观。
举例:比如:创建文件夹,或者删除文件夹等
JAVA为GUI提供的对象都存在于java.Awt和javax.Swing两个包中
3、Awt与Swing
java . Awt:Abstract Window ToolKit(抽象窗口工具包)。需要调用本地系统方法实现功能。属于重量级控件。
java .Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现。强了移植性,属于轻量级控件
还有swt包,eclipse就是用他开发界面
4、体系继承关系:
Component 组件
Container--| |-- Button
Panel--| |-- Lable
Window --| |-- Checkbox
Frame--| 框架 |-- TextComponent
Dialog --| |--TextArea
FileDialog--| |-- TextField
Container:是容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来
02-GUI(布局)
1、布局管理器:容器中的组件的排列方式,就是布局。
2、常见的布局管理器:
FlowLayout(流式布局管理器) 从左到右的顺序排列。Panel默认的布局管理器。
BorderLayout(边界布局管理器) 东南西北中。Frame默认的布局管理器。
GridLayout(网格布局管理器) 计算器中的键 ; 规则的矩形。
CardLayout(卡片布局管理器) 选择卡。
GridBagLayout(网格包布局管理器)非规则的矩阵。
03-GUI(Frame) 一个简单窗体
建立一个简单的窗体:
Container常用子类:Window Panel(面板不能单独存在)
Window常用子类:Frame Dialog
简单的窗体创建过程:
import java.awt.*;
/*
* 创建图形化界面:
* 1,创建frame窗体
* 2,对窗体进行基本设置,比如大小,位置,布局
* 3,定义组件,让组件通过窗体的add方法添加到窗体中
* 4,让窗体显示,通过setVisible(true)
*/
public class AwtDemo
{
public static void main(String[]args)
{
Framef = new Frame("myawt");
f.setSize(500,400); //设置窗体大小
f.setLocation(300,200); //设置窗体出现在屏幕上的位置
f.setLayout(newFlowLayout()); //为窗体设置流式布局管理器
Buttonb = new Button("我是按钮");
f.add(b); //添加按钮
f.setVisible(true); //设置窗体可见
}
}
04-GUI(事件监听机制)
1、事件监听机制组成:
事件源(组件) 相当于c#中控件 (按钮) btn_myBtn
事件(Event) 相当于按钮的点击事件(Click)
监听器(Listener)
相当于c#中委托 this.btn_myBtn.Click += new System.EventHandler(this.btn_myBtn_Click);
事件处理(引发事件后处理方式)相当于点击后的方法 btn_myBtn_Click()
2、事件源:就是awt包或者swing包中的那些图形界面组件;
事件:每个事件源都有自己特有的对应事件和共性事件;
监听器:将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中;
以上三者在java中都定义好了。直接获取其对象来用就可以了。我们要做的事情就是对产生的动作进行处理。
理解:其实就是 事件源。Add监听器(new 监听器 {处理动作(事件 e){动作}});
事件源调用自己的方法添加监听器对象;监听器中封装了很多动作(方法),这些方法的参数是一个事件对象;当事件发生时,监听器对象中的方法会接受事件对象,并产生相应的动作,也就是处理动作(监听器类中的方法)
05-GUI(窗体事件)、
1、在java.awt.event包中封装了很多事件类和监听器类。当窗体添加了监听器的实例,监听器就可以监听窗体的很多事件,因为监听器中有很多相对应的方法,这些方法可以接受事件对象作为参数,当某事件产生就会调用相对应的方法,这样实现监听。
2、比如:
WindowListener用于接收窗口事件的监听器接口,里面封装了7个方法(敞口打开,关闭,活动等)。处理窗口事件的类要实现此接口并覆盖里面7个方法才能创建监听器对象,这是很不方便的。
WindowAdapter实现了此接口,并复写了7个方法,但是方法体都为空
Public voidwindowClosed(WindowEvent e){};创建它的对象也没有意义,所以干脆加上abstract,让它成为抽象类不能创建对象。处理窗口事件的类继承此抽象类后就可创建监听器对象。并且不用全部复写七种方法,需要哪个就覆盖那个。
3、窗口添加事件监听示例:
第一种方式:自定义外部监听器类继承WindowAdapter,
class MyWin extends WindowAdapter
{
public voidwindowClosing(WindowEvent e)
{
System.out.println(e.toString());
//java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null
//,oldState=0,newState=0] on frame0
System.exit(0);
}
}
f.addWindowListener(new MyWin()); //外部监听类对象
第二种方式:创建WindowAdapter子类匿名对象,复写其方法
f.addWindowListener(newWindowAdapter() //匿名类监听器对象
{
//关闭事件发生时调用
publicvoidwindowClosing(WindowEvent e)
{
System.exit(0);
}
}
06-GUI(Action事件)
1、如果想要让按钮具备退出程序的功能:
按钮就是事件源。那么选择哪个监听器呢?
通过关闭窗口示例了解到,想要知道那个组件具备什么样的特有监听器,需要查看该组件对象的功能。通过查阅Button的描述,发现按钮支持一个特有监听addActionListener。
but.addActionListener(new ActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
System.out.println("退出,按钮干的");
System.exit(0);
}
});
2、发现ActionListener接口没有适配器ActionAdapter,因为此接口中只有一个抽象方法。适配器的作用是方便创建监听器对象,所以实现接口复写方法。其实没有适配器的监 听器接口是很少的,一般有3个以上方法的监听器都有对应适配器。
07-GUI(鼠标事件)
几乎所有组件都可添加鼠标和键盘监听器,所以,这两个监听器的添加方法在Component中活动监听器
but.addActionListener(new ActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
System.out.println("Actionok");
}
});
鼠标监听器
but.addMouseListener(new MouseAdapter()
{
privateint count = 1;
privateint clickCount=1;
//鼠标进入到组件上时调用
publicvoidmouseEntered(MouseEvent e)
{
System.out.println("鼠标进入到该组件"+count++);
}
//鼠标按键在组件上单击(按下并释放)时调用
publicvoidmouseClicked(MouseEvent e)
{
if(e.getClickCount()==2) //点击事件对象的方法,获取点击次数
System.out.println("双击"+clickCount++);
}
});
08-GUI(键盘事件)
1、按钮添加键盘监听器:
but.addKeyListener(new KeyAdapter()
{//键盘按下事件
public voidkeyPressed(KeyEvent e)
{
if(e.isControlDown()&& e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("Ctrl +enter is pressed");
//静态方法getKeyText(int keyCode)获取一个键的文本
//getKeyCode() 获取一个键关联的整数 System.out.println(KeyEvent.getKeyText(e.getKeyCode())+""+e.getKeyCode());
}
});
2、文本框添加键盘监听事件(屏蔽键)
在KeyEvent事件类的父类InputEvent中有一个方法consume();
调用此方法以便不会按照默认的方式处理此事件
//文本框添加键盘监听器
tf.addKeyListener(new KeyAdapter()
{
public voidkeyPressed(KeyEvent e)
{
int code =e.getKeyCode(); //获取键关联的整数
//文本框中只能输入数字(屏蔽键)
if(!(code>=KeyEvent.VK_0 &&code<=KeyEvent.VK_9))
{
System.out.println(e.getKeyText(code)+code+"……非法");
//使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件。
e.consume(); //默认是将按下的键添加到文本框中。注意这里不是将监听器删掉
}
}
});
09-GUI(练习-列出指定目录内容) MyWindowDemo
需求:列出指定目录内容
分析:1、文本框TextField 按钮Button 文本区TextArea
2、当点击按钮时,获取文本框中路径封装成对象,
然后用Field类list方法列出路径中所有文件名,遍历追加到文本区
but.addActionListener(new ActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
StringdirPath = tf.getText();
Filedir = new File(dirPath); //将路径封装成抽象路径对象
if(dir.exists()&& dir.isDirectory()) //路径存在而且是目录
{
ta.setText(""); //如果存在且是目录,先清空文本区
String[]names = dir.list(); //列出目录下所有文件名
for(String name :names)
{
//将文本追加到文本区后面,而不是setText()
ta.append(name+"\r\n");
}
} }
}
});
10-GUI(对话框Dialog)
1、Dialog是Window的子类,modal
- 指定在显示的时候是否阻止用户将内容输入到其他顶级窗口中(false , true)
他还有子类FileDialog(文件对话框)
2
、FileDialog
类显示一个对话框窗口,用户可以从中选择文件;mode
- 对话框的模式,FileDialog.LOAD
或FileDialog.SAVE(
打开和保存)
示例: FileDialog openDia = newFileDialog(f,“打开”,FileDialog.LOAD);
//对话框(依照的窗体,对话框头名,模式),对话框也是窗体
//模式设置为true后,不处理对话框不能操作窗体f
d = new Dialog(f,"提示信息-self",true);
d.setBounds(400,200, 240, 150);
d.setLayout(new FlowLayout());
lab = new Label();
okBut = new Button("确定");
d.add(lab);
d.add(okBut);
//对话框添加事件监听
d.addWindowListener(new WindowAdapter()
{
publicvoidwindowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
在上面例子中,当输入路径不存在时,弹出对话框:
else
{
lab.setText("输入的"+dirPath+"不存在,请重新输入");
d.setVisible(true); //对话框可见
}
11-GUI(菜单)、 MyMenuDemo
MenuComponent
|-- MenuBar 菜单栏
|-- MenuItem 菜单项
|-- Menu 菜单
Menu是MenuItem子类,Menu中的add(MenuItem im)方法可以添加父类(菜单项)也可添加菜单,多态。可以理解:菜单项可以是个菜单(子菜单)
public void init()
{
f = new Frame("菜单");
f.setBounds(300,100, 500, 600);
f.setLayout(new FlowLayout());
mb = new MenuBar(); //菜单栏
m = new Menu("文件"); //菜单 文件
subMenu = new Menu("子菜单"); 子菜单> 子条目
ssubItem = new MenuItem("子条目"); 条目
subItem = new MenuItem("条目"); 退出
closeItem = new MenuItem("退出");
f.setMenuBar(mb); //窗体设置菜单栏
mb.add(m); //菜单栏中添加菜单
m.add(subMenu); //菜单中添加子菜单
subMenu.add(ssubItem); //子菜单中添加菜单项
m.add(subItem); //菜单中添加菜单项
m.add(closeItem); //菜单中添加菜单项
myEvent();
f.setVisible(true);
}
点退出就结束程序:MenuItem可以添加ActionListener事件监听,Menu继承。让closeItem.addActionListener(new ActionListener(){ });
12-GUI(练习-打开文件,,保存文件)、
需求:用TextArea FileDialog Menu组件等完成一个打开和保存文件的小程序
//点打开时弹出打开文件对话框,并实现对文本文件的打开
openItem.addActionListener(new ActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
openDia.setVisible(true); //打开文件 对话框可视
//获取 获取此文件对话框的目录
StringdirPath = openDia.getDirectory();
// 获取此文件对话框的选定文件。
StringfileName = openDia.getFile();
// System.out.println(dirPath+" "+fileName);
if(dirPath==null || fileName ==null)
return; //不写这句话,当点取消时会出异常,没有选文件
ta.setText("");
Filefile = new File(dirPath, fileName);
try
{
BufferedReaderbufr =new BufferedReader(new FileReader(file));
Stringline = null;
while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n");
}
bufr.close();
}
catch(IOException ex)
{
thrownew RuntimeException("读取失败");
}
}
});
//点保存时当文件名不存在弹出保存文件对话框,并实现对文本文件的保存
//文件名存在时直接保存,这里存在指的是第一次存储后没有关闭程序,再去存储,file全局变量
saveItem.addActionListener(new ActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
if(file==null)
{
saveDia.setVisible(true);
//获取要存储的文件对象
StringdirPath = saveDia.getDirectory(); //获取存储文件目录
StringfileName = saveDia.getFile(); //获取要存储的文件名
//当叉掉对话框或点取消时,没有获取到,下面创建文件对象就会出异常
if(dirPath==null || fileName ==null)
return;
file =newFile(dirPath,fileName);
}
try
{
BufferedWriterbufw = new BufferedWriter(new FileWriter(file));
Stringtext = ta.getText();
bufw.write(text);
bufw.close();
}
catch(IOException ex)
{
thrownew RuntimeException("存储文件失败");
}
}
});