------- android培训、java培训、期待与您交流! ----------
图形用户界面(GUI)
计算机有两种方式和用户进行交互:
命令行模式,以及窗口模式。
java有两个专门的包用于图形化界面的编程
Awt Swing Awt 跨平台性不高,比较依赖于平台,重量级组件
Swing则能够跨平台 。很多类都是基于Awt,轻量级组件
eclipse开发工具是Swt包开发的图形化界面工具。
Frame类
事件监听机制
1.事件源
2.事件
3.监听器
4.事件处理
事件源就是awt包或者swing包中的那些图形界面组件
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以触发某一事件的动作都已经封装到了监听器当中
以上三者在java中都已经定义好了
直接获取其对象来用就可以
我们要做的事情就是对要产生的动作进行处理
组件的布局方式:
FlowLayout(流式布局)
从左到右的顺序排列
BorderLayout(边界布局管理器)
东,南,西,北,中
Frame默认的布局管理器
GridLayout(网格式布局管理器)
规则的矩形
CardLayout(卡片式布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则矩阵
图形化界面是另外的线程控制的。
1.创建frame窗体。
2.对窗体进行基本设置
比如大小,位置,布局。
3.定义组件。
4.将组件通过窗体的add方法添加到窗体中。
5.让窗体显示,通过setVisible(true)
public class GUIdemo02 {
public static void main(String[] args) {
Frame f=new Frame("my awt");//具备一个默认的布局,叫做边界布局。
f.setLayout(new FlowLayout());//设置为一个流式布局。
f.setSize(500,500);//500是窗体的横坐标,100是纵坐标。
f.setLocation(300,200);//是设置该窗体出现的位置。
Button b=new Button("我是一个按钮");//创建一个按钮
f.add(b);//容器添加按钮。
f.addWindowListener(new WindowAdapter(){//WindowAdapter是一个实现了WindowListener接口的抽象类,
public void windowClosing(WindowEvent e){
System.out.println("我关");
System.exit(0);//此方法需要加参数,关闭窗口意味着退出java虚拟机就行
}
public void windowActivated(WindowEvent e){
System.out.println("我活了");
}//该方法是复写了窗口被前置时的动作,只要窗口被前置,就会被监听到,然后打印我活了
public void windowOpened(WindowEvent e){
System.out.println("我被打开了,哈哈哈哈哈");
}//该方法在窗口被建立时被监听然后打印我被打开了,哈哈哈哈哈
});//该方法接收一个监听器用于监听事件,其中需要复写的方法就是对应的处理动作,比如说
//关闭的方法就是退出java虚拟机,因为虚拟机一退出该窗体的线程就关闭了。方法的参数e是
//事件信息,可以打印出来。
f.setVisible(true);//创建一个窗体必须调用的方法。
//图形化界面是由另外一个线程控制的。
}
}
以下代码演示让按钮具备退出功能:
public class GUIdemo23 {
private Frame f;
private Button buf;
private TextField tf;
GUIdemo23(){
init();
}
public void init(){
f=new Frame();
buf=new Button("my button");
tf=new TextField(20);//文本框组件
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
f.add(buf);
f.add(tf);
MyEvent();
f.setVisible(true);
}
public void MyEvent(){
buf.addActionListener(new ActionListener(){
//add方法是添加监听器的方法,添加的监听器是一个接口,用匿名内部类的
//形式将这个接口实现
public void actionPerformed(ActionEvent e){
//实现该方法,里面的exit退出java虚拟机的方法
//参数是可以打印动作的名字,
//该方法会监听无论是鼠标还是键盘这样的事件都会起作用
System.out.println("按钮干的");
System.exit(0);
}
});//button的监听处理事件机制,
f.addWindowListener(new WindowAdapter(){//这个WindowAdapter类就是该接口的一个适配器,貌似实现了
//该接口,事实上是把该接口中的方法都复写为实例方法,但是方法体还是为空,就是说没有具体实现,我们在使用时
//还是需要创建该类的子类对象复写里面我们需要用的方法,而且这个WindowAdapter类是一个抽象类。
public void windowClosing(WindowEvent e){
System.out.println("是窗体关的");
System.exit(0);
}
});//窗体的监听事件
buf.addMouseListener(new MouseAdapter(){
private int count;
public void mouseClicked(MouseEvent e){
System.out.println("单击事件"+count++);//该事件会先于button自身的按钮事件先执行
}//鼠标事件被封装在MouseEvent,里面可以得到鼠标的一些事件
//比如说鼠标单击次数可以通过一个方法得到,
});
buf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
System.out.println(e.getKeyChar());//具体看一看KeyEvent类的方法。
}
});
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(!(e.getKeyCode()>=KeyEvent.VK_0&&e.getKeyCode()<=KeyEvent.VK_9)){
System.out.println("输入的数值非法");
e.consume();//该方法让满足条件的输入值无法添加进文本框。
}
}
});
}
public static void main(String[] args) {
new GUIdemo23();
}
}
菜单的制作:
public class GUIdemo06 {
private File file=null;
private Frame f;
private MenuBar mb;
private MenuItem closeItem,openItem,saveItem,subItem;
private Menu m,subM;
private FileDialog openDia,saveDia;//显示保存或者打开文件的windows窗口。
private TextArea ta;
GUIdemo06(){
init();
}//构造函数可以如此调用其他函数。不知道静态函数可不可以。
public void init(){
f=new Frame("my window");
f.setBounds(300,100,650,600);
//f.setLayout(new FlowLayout());
ta=new TextArea();
mb=new MenuBar();//菜单栏
m=new Menu("文件");
subM=new Menu("子菜单");
openItem=new MenuItem("打开");
saveItem=new MenuItem("保存");
closeItem=new MenuItem("退出");
m.add(openItem);
m.add(saveItem);
m.add(closeItem);
subItem=new MenuItem("子条目");//菜单中添加子条目。注意只有Menu才能添加子菜单或者子条目。
//条目不可以再添加。
subM.add(subItem);
m.add(subM);
mb.add(m);
openDia=new FileDialog(f,"我要打开",FileDialog.LOAD);//打开文件的模式,这里的我要
//打开是该窗口弹出时的标题。
saveDia=new FileDialog(f,"我要保存",FileDialog.SAVE);//保存文件的模式。
myEvent();
f.add(ta);
f.setMenuBar(mb);
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.close();
}catch(IOException es){throw new RuntimeException();}
}
});//保存文件。
openItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
openDia.setVisible(true);
String dirPath=openDia.getDirectory();
String fileName=openDia.getFile();
System.out.println("1");
if(dirPath==null||fileName==null)
return ;
ta.setText("");
System.out.println(dirPath+"...."+fileName);
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(Exception es){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 GUIdemo06();
}
}