java--GUI(图形用户接口)

转载请申明出处: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就是用他开发界面

、体系继承关系:

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
void
windowClosing(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
void
keyPressed(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
void
keyPressed(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.LOADFileDialog.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("存储文件失败");

}

}

});

上一篇:Spring aop 实现异常拦截


下一篇:Entity Framework学习笔记(一)