---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、GUI概述
1、GUI与CLI
GUI:Graphical User Interface(图形用户界面)
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI:Command line User Interface(命令行用户界面)
就是常见的DOS命令行操作,需要记忆一些常用的命令,操作不直观。
2、AWT与Swing
java为GUI提供的对象都存在java.awt和javax.swing两个包中。
java.awt:Abstract Window Toolkit(抽象窗口工具包),需要调用本地系统方法实现功能,属于重量级控件。
javax.swing:在AWT的基础上建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量级控件。
3、组件关系图
二、GUI布局
布局管理器:
容器中的组件的排放方式,就是布局。
常见的布局管理器:
1、FlowLayout(流式布局管理器):从左到右的顺序排列,Panel默认的布局管理器。
2、BorderLayout(边界布局管理器):界面分为东、南、西、北、中,Frame默认的布局管理器。
3、GridLayout(网格布局管理器):规则的矩阵。
4、CardLayout(卡片布局管理器):选项卡。
5、GridBagLayout(网格包布局管理器):非规则的矩阵。
延伸阅读:java GUI设计和布局
我们先通过一个创建窗体的小例子,来简单了解下GUI编程
三、GUI-Frame
例1:创建图形化界面
/*
*例1:创建图形化界面
*1、创建Frame窗体;
*2、对窗体进行基本设置,比如大小、位置、布局等;
*3、定义组件,如button等;
*4、将组件通过窗体的add方法添加到窗体中;
*5、通过setVisible(true)让窗体显示。
*/
import java.awt.*;
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("my frame");
//f.setSize(500,400); //设置大小
//f.setLocation(300,200); //设置位置
f.setBounds(500,400,300,200); //设置大小与位置
f.setLayout(new FlowLayout());//设置布局方式
Button b=new Button("my button");//定义按钮组件
f.add(b); //将按钮组件添加到窗体中
f.setVisible(true);//让窗体显示
}
}
对上例中创建的窗体,点击关闭按钮以及自定义按钮等均无反应。这是因为我们尚未对这些按钮编写相应的处理事件代码。对此,我们要介绍事件监听机制。
四、事件监听机制
事件监听机制的组成部分:
1)事件源;2)事件;3)监听器;4)事件处理。
事件源:就是awt或者swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将事件所对应的处理方法封装到监听器中;
事件监听机制的运作流程:
下面将分别介绍窗体、鼠标及键盘的事件与相应的监听器
1、窗体事件:
我们想让窗体具备关闭功能
//因为WindowListener的子类WindowAdapter已经实现了WindowListener
//接口,并覆盖了其中的所有方法。因此,我们只需要继承WindowAdapter,
//并覆盖我们所需要的方法即可。
f.addWindowListener(new WindowAdapter() //以匿名内部类的形式实现事件监听器
{
public void windowClosing(WindowEvent e)
{
System.out.println("关闭窗体");
System.exit(0);
}
});
此时,例1中的窗体就可以关闭了。
2、按钮-Action事件
我们想让按钮具备退出程序的功能。
//按钮支持一个特有监听addActionListener()。
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("通过按钮退出程序!");
System.exit();
}
});
3、鼠标事件
给按钮添加一个鼠标监听。
//鼠标事件
b.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++)+"次");
}
});
4、键盘事件
给按钮添加一个键盘监听。
//键盘事件
b.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("ctrl+enter is run!");
}
});
5、对话框dialog
我们希望当地址输入错误时,会跳出对话框提醒用户操作错误。
例2:列出指定目录
/*
*例2:列出指定目录
*在tf中输入目录,在按下转到按钮(或回车键)后,
*ta中列出目录中所包含的文件及文件夹。当目录错误时,弹出对话框。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.File;
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("主窗体");
f.setBounds(500,400,300,200);
f.setLayout(new FlowLayout());
Button b=new Button("转到按钮");
final TextField tf=new TextField(60);
final TextArea ta=new TextArea(25,70);
final Dialog d=new Dialog(f,"提示信息",true);//对话框
final Label lab=new Label();
Button okButton=new Button("确定");
d.setBounds(500,200,300,150);
d.setLayout(new FlowLayout());
f.add(b);
f.add(tf);
f.add(ta);
d.add(lab);
d.add(okButton);
//窗体关闭
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//按下转到按钮显示目录
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
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);
}
}
});
//按下回车键也显示目录
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
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);
}
}
}
});
//按下okButton用于退出对话框
okButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
//对话框关闭
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
f.setVisible(true);
}
}
6、菜单
例4:给窗体增加菜单项,并添加打开和存储两个选项
/*
*例4:优化列出指定目录
*给窗体增加菜单项,并添加打开和存储两个选项
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class AwtDemo
{
public static void main(String[] args)
{
MyFrame mf=new MyFrame();
mf.initial();
mf.events();
mf.createFrame();
}
}
class MyFrame
{
private Frame f;
private Button b,okButton;
private TextField tf;
private TextArea ta;
private Dialog d;
private Label lab;
private FileDialog openDialog,saveDialog;
private File file;
private MenuBar mb; //菜单栏
private Menu m; //菜单
private MenuItem closeItem,openItem,saveItem;//菜单项
public void initial()
{
f=new Frame("主窗体");
b=new Button("转到按钮");
okButton=new Button("确定");
tf=new TextField(60);
ta=new TextArea(25,70);
d=new Dialog(f,"提示信息",true);
lab=new Label();
openDialog=new FileDialog(f,"打开文件",FileDialog.LOAD);
saveDialog=new FileDialog(f,"存储文件",FileDialog.SAVE);
mb=new MenuBar();
m=new Menu("文件");
closeItem=new MenuItem("退出");
openItem=new MenuItem("打开");
saveItem=new MenuItem("存储");
f.setBounds(500,400,300,200);
f.setLayout(new FlowLayout());
d.setBounds(500,200,300,150);
d.setLayout(new FlowLayout());
m.add(closeItem);
m.add(openItem);
m.add(saveItem);
mb.add(m);
f.setMenuBar(mb);
f.add(b);
f.add(tf);
f.add(ta);
d.add(lab);
d.add(okButton);
}
public void events()
{
//closeItem
closeItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//openItem
openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
openDialog.setVisible(true);
String dirPath=openDialog.getDirectory();
String fileName=openDialog.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 x)
{
throw new RuntimeException("打开文件失败");
}
}
});
//saveItem
saveItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(file==null)
{
saveDialog.setVisible(true);
String dirPath=saveDialog.getDirectory();
String fileName=saveDialog.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 x)
{
throw new RuntimeException("存储文件失败");
}
}
});
//窗体关闭
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//按下转到按钮显示目录
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
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);
}
}
});
//按下回车键也显示目录
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
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);
}
}
}
});
//按下okButton用于退出对话框
okButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
//对话框关闭
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
}
public void createFrame()
{
f.setVisible(true);
}
}
延伸阅读:
2、自定义事件监听:java事件机制;
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com