1,GUI——Graphical User Interface(图形用户接口)。用图形的方式,来显示计算机操作的界面,这样更方便更直观。
GLI——Command line User Interface (命令行用户接口), 就是常见的Dos 命令行操作。 需要记忆一些常用的命令,操作不直观。 举例:创建文件夹,或者删除文件夹等。
Java 为GUI 提供的对象都存在java.Awt 和javax.Swing 两个包中。
Awt 与Swing
java.Awt——Abstract Window Toolkit( 抽象窗口工具包) ,需要调用本地系统方法实现功能,属于重量级控件。
javax.Swing:在Awt的基础上,建立一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量级控件。
Container :为容器。是一个特殊的组件,该组件可以通过add 方法添加其他组件进来。
2, 容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout (流式布局管理器): 从左到右的顺序排列, Panel 默认的布局管理器。
BorderLayout( 边界布局管理器 ): 东,南,西,北,中。 Frame 默认的布局管理器。
GridLayout( 网格布局管理器): 规则的矩阵。
CardLayout( 卡片布局管理器): 选项卡。
GridBagLayout( 网格包布局管理器): 非规则的矩阵。
3,创建图形化界面:
1)创建Frame窗体。
2)对窗体进行基本设置。比如,大小,位置,布局。
3)定义组件。
4)将组件通过窗体的add方法添加到窗体中。
5)让窗体显示,通过setVisible(true)。
事件监听机制的特点:
1)事件源。
2)事件。
3)监听器。
4)事件处理。
事件源:就是Awt包或者Swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作),都已经封装到了监听器中。
以上三者在java中都已经定义好了,直接获取其对象来用就可以了。
我们要做的事件是:对产生的动作进行处理。import java.awt.*; import java.awt.event.*;public static void main(String[] args){
class AwtDemo{
Frame f=new Frame("my awt");
f.setSize(500,400);
f.setLocation(300,200);
f.setLayout(new FlowLayout());
Button b=new Button("我是一个按钮");
f.add(b);
f.addWindowListener(new MyWin()); f.setVisible(true);
}
}
class MyWin implements WindowListener{
//覆盖7个方法。可是我只用到了关闭的动作,其他的动作都没有用到,可是却必须复写。
}
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
//并覆盖了其中的所有方法。那么我只要继承自WindowAdapter覆盖我需要的方法即可。
class MyWin extends WindowAdapter{
public void windowClosing(WindowEvent e){
//System.out.println ("window closing---"+e.toString());
System.exit(0);
}
public void windowActivated(WindowEvent e){
System.out.println("active");
}
public void windowOpened(WindowEvent e){
System.out.println("open");
}
}4,事件监听机制组成。事件源(组件),事件(Event),监听器(Listener),事件处理(引发事件后处理方式)。
我们写代码通常为了便于阅读把事件程序单独封装到一个方法中。监听器(或者适配器)用匿名内部类实现后作为参数添加到图形界面中。
public void myEvent(){
//让frame具备关闭的功能。
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//让按钮具备退出程序的功能。
按钮就是事件源。
选择哪个监听器呢? 通过关闭窗体实例了解到,想要知道哪个组件具备什么样的特有监听器, 需要查看该组件对象的功能。通过查阅button的描述,发现按钮支持一个特有监听 addActionListener。
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("按钮退出");
System.exit(0);
}
});
5, 鼠标和键盘的事件监听。
· import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent{
private Frame f;
private Button but;
private TextField tf;
MouseAndKeyEvent() {
init();
}
public void init(){
f=new Frame("my frame");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but=new Button("登陆");
tf=new TextField(20);
f.add(tf);
f.add(but);
myEvent();
f.setVisible(true);
}
public void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
tf.addKeyListener(new KeyAdapter (){
public void keyPressed(KeyEvent e){
int code=e.getKeyCode();
if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){
System.out.println(code+"...是非法的");
e.consume();
}
}
});
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//按下Ctrl+Enter则退出。
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.exit(0);
System.out.println(e.getKeyText(e.getKeyCode()));
}
});
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("按钮活动监听");
}
});
but.addMouseListener(new MouseAdapter(){
private int count=1;
private int clickcount=1;
private int doubleclickcount=1;
public void mouseClicked(MouseEvent e){
//一般交给活动事件监听
if(e.getClickCount()==1)
System.out.println("鼠标单击---"+clickcount++);
if(e.getClickCount()==2&&e.getButton()==MouseEvent.BUTTON1)
System.out.println("鼠标双击==="+doubleclickcount++);
}
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下"+clickcount);
}
public void mouseReleased(MouseEvent e){
System.out.println("鼠标释放"+clickcount);
}
});
}
public static void main(String[] args){
new MouseAndKeyEvent();
}
}
6,对话框Dialog。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
private void myEvent(){
okBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
d.setVisible(false);
}
});
//隐藏对话框。
daglog.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
daglog.setVisible(false);
}
});
//定义Enter快捷键。
okBut.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER)
d.setVisible(false);
}
});
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");
}
}else {
String info=null;
if(!(dirPath.equals("")))
info="警告:您输入的信息"+dirPath+"错误,请查询后点确定重新输入哈!";
else
info="警告:!!拜托哥们,输入的信息不能为空,点确定后重新输入!!";
lab.setText(info);
daglog.setVisible(true);
}
}
7,设置frame的菜单栏,菜单,菜单项。
public void init(){
//设置frame容器
f=new Frame("my window");
f.setBounds(300,100,600,400);
bar=new MenuBar();
ta=new TextArea();
//创建各种组件
fileMenu=new Menu("文件");
newMenu=new Menu("新建");
net=new MenuItem(".net文件");
java=new MenuItem("java文件");
html=new MenuItem("html文件");
openItem=new MenuItem("打开");
saveItem=new MenuItem("保存");
closeItem=new MenuItem("退出");
//将MenuItem添加到newMenu子菜单中。Menu继承于MenuItem。
newMenu.add(java);
newMenu.add(net);
newMenu.add(html);
//MenuItemadd(MenuItem mi)
将指定的菜单项添加到此菜单。其中newMenu还有子菜单。
fileMenu.add(newMenu);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
//往菜单栏里添加菜单。
bar.add(fileMenu);
//设置frame的菜单栏
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(){
//打开指定目录下的文件,并将其内容显示在文本区。
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");
}catch (IOException ie){
throw new RuntimeException("读取失败");
}
}
});
//保存文本区的内容到指定目录下。
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.close();
} catch (IOException oe){
throw new RuntimeException("写入失败");
}
}
});
}
注意:
1)设置菜单重点掌握菜单栏,菜单,子菜单,菜单项之间的嵌套和包含关系。菜单栏MenuBar只能添加菜单Menu。Menu类继承于MenuItem类,但MenuItem不具备添加add的功能。菜单Menu可以添加菜单项MenuItem,也可添加子菜单Menu。所以,子菜单必须定义为Menu才行。
2)监听器为接口,所有其所有的方法,在子类中必须全部复写,当所以方法的个数大于2个的,API为我们提供了对应的适配器抽象类,它用空方法复写了父类接口的所有抽象方法,这时,我们就可以直接继承适配器,在复写我们需要的方法即可。这样大大简化的代码。