---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
GUI(图形用户界面)
Graphical User Interface(图形用户接口)CLI(命令行用户接口)
Command line Interface
Java为GUI提供的对象都存在java.awt和javax.swing两个包中
Awt与Swing
java.awt:abstract windows toolkit(抽象窗口工具包),需要调用本地系统方法实现功能,属重量级控件。
javax.swing:在awt的基础上,建立的一套图形界面系统,其中提供了更多的组建,而且完全由java实现,增强了移植性,属轻量级控件
布局管理器
容器中组件的排放方式,就是布局
常见的布局管理器:
FlowLayout(流式布局管理)
从左到右的顺序排列,Panel默认的布局管理器
BorderLayout(边界布局管理器)
东南西北中,Frame默认的布局管理器
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则的矩阵
Frame 窗体
创建图形画界面:
1.创建窗体
2.对窗体进行基本设置,比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示,通过setVisible(true)
Frame(){} //通过这样建立窗体对象没有标题
Frame(String title){} //构造函数中写入窗体标题
Frame f = new Frame("my awt");
setSize(int width, int height); //设置窗体尺寸,x为横向,y为纵向
setVisible(boolean b); //true则窗体可以见,false则窗体隐藏
setBounds(int x, int y, int width, int height) //setSize(),setLocation()两个方法可以通过这一个方法实现
setLocation(int x, int y) //设置窗体在屏幕上的位置,x为距左边边界,y为距顶部边界
设置布局:
setLayout(new FlowLayout()); //使用流式布局
创建按钮:
Button b = new Button("我是一个按钮");
将按钮加到窗体中:
f.add(b);
事件监听机制的特点:
1.事件源:awt包或者swing包中的那些图形界面组件
2.事件:每一个事件源都有自己特有的对应事件和共性事件
3.监听器:将可以触发某一个事件的动作(N个动作,N>=1)都已经封装到了监听器中
以上三者,在java中都已经定义好了,直接获取其对象来用就可以了。
我们要做的事情,就是第四个:对产生的动作进行处理
4.事件处理(引发事件后处理方式)
添加监听器:
addWindowListener(WindowListener w)
implements WindowListener
使用该接口需要覆盖7个方法,而它的子类WindowAdapter已经实现了WindowListener接口,并覆盖了其中的所有方法,所以只要继承自WindowAdapter覆盖我们需要的方法即可
添加监听器示例:
Frame f = new Frame("窗口");
f.addWindowListener(new MyWin()); //加监听器
class MyWin extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.out.println("window closing"+e.toString());
System.exit(0);//对处程序
}
}
通过匿名内部类:
Frame f = new Frame("窗口");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
//监听激活方法
public void windowActivated(WindowEvent e)
{
System.out.println("我被激活了");
}
//监听打开方法
public void windowOpened(WindowEvent e)
{
System.out.println("我被打开了");
}
});
建议:在写代码的时候,把监听事件和组件分两个方法写,然后在组件方法上调用监听事件,这样做是为了代码优化
Action事件
//让按钮具备退出程序的功能
按钮是事件源,那么就通过按钮组建到API下查阅按钮的特有监听器,发现Button组件下有一个特有监听addActionListener(ActionListener a)
ActionListener接口下就一个方法actionPerformed(ActionEvent e)
代码示例:
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("通过按钮退出了程序");
System.exit(0);
}
});
共性事件:鼠标键盘事件
addKeyListener(KeyListener k)
addMouseListener(MouseListener m)
KeyListener接口有相应的子类: KeyAdapter
MouseListener接口有相应的子类: MouseAdapter
监听的具体动作调用什么方法查看API文档
鼠标的例子:
Button but = new Button("这是一个按钮");
but.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++);
}
});
键盘监听示例:
char getKeyChar() 返回与此事件中的键相关联的字符
int getKeyCode() 返回键关联的整数(ASCII值)
static String getKeyText(int keyCode) 返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。
but.addKeyListener(new KeyAdapter()
{
//按键盘动作
public void keyPressed(KeyEvent e)
{
System.out.println(e.getKeyChar()+"~~"e.getKeyCode()+"~~"+KeyEvent.getKeyText(e.getKeyCode()));
//若按了Ctrl+ESC,则退出
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ESCAPE)
System.exit(0);
}
});
键盘监听示例:只允许输入数字
TextField tf = new TextField(20); //20是列数
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.consume();//不使用默认方法 这里的默认方法是把字符输入进去
}
}
});
练习题:
列出指定目录内容
组件:文本框,文本区,按钮
要求,在文本框中输入Path,通过按钮或者回车后,文本区中显示Path下的目录和文件列表,若输入的Path不存在,则通过Dialog跳出错误提示,Dialog中需要有确定按钮,提示错误信息(在窗体上加文字需要用Label组件)
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
/*
练习题:
列出指定目录内容
组件:文本框,文本区,按钮
要求,在文本框中输入Path,通过按钮或者回车后,文本区中显示Path下的目录和文件列表,若输入的Path不存在,
则通过Dialog跳出错误提示,Dialog中需要有确定按钮,提示错误信息(在窗体上加文字需要用Label组件)
*/
public class AwtTest {
private Frame f;
private Button but;
private TextField tf;
private TextArea ta;
private Dialog errorDia;
private Button diaBut;
public void init()
{
f = new Frame("文件列表");
f.setBounds(500,200,400,500);
f.setLayout(new FlowLayout());
but = new Button("转到");
tf = new TextField(41);
ta = new TextArea(29,45);
errorDia = new Dialog(f,"错误提示",true);
diaBut = new Button("确定");
errorDia.add(diaBut);
errorDia.setLayout(new FlowLayout());
errorDia.setBounds(520,400,180,80);
f.add(tf);
f.add(but);
f.add(ta);
MyEvent();
f.setVisible(true);
}
private void MyEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String dirPath = tf.getText();
File file = new File(dirPath);
if(file.exists() && file.isDirectory())
{
ta.setText("");
String[] files = file.list();
for(String f:files)
{
ta.append(f+"\r\n");
}
}
else
{
Label info = new Label("您输入的地址:"+dirPath+"有误");
errorDia.add(info);
errorDia.add(diaBut);
errorDia.setLayout(new FlowLayout());
errorDia.setBounds(520,400,180,80);
errorDia.setVisible(true);
}
}
});
errorDia.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
errorDia.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent ke)
{
if(ke.getKeyCode()==KeyEvent.VK_ENTER)
{
String dirPath = tf.getText();
File file = new File(dirPath);
if(file.exists() && file.isDirectory())
{
ta.setText("");
String[] files = file.list();
for(String f:files)
{
ta.append(f+"\r\n");
}
}
else
{
Label info = new Label("您输入的地址:"+dirPath+"有误");
errorDia.add(info);
errorDia.setVisible(true);
}
}
}
});
diaBut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
errorDia.setVisible(false);
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
AwtTest awt = new AwtTest();
awt.init();
}
}
打开保存文本编辑器例子:
package editool;
/*
* 练习题:
* 制作一个图形画界面的编辑器,包含打开、保存功能,再通过包封装,
* 并用jar打包,且jar包需要具备双击运行的功能
*/
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class Edit {
private Frame f;
private MenuBar mb;
private Menu m;
private MenuItem openItem;
private MenuItem saveItem;
private FileDialog openDia;
private FileDialog saveDia;
private MenuItem exitItem;
private TextArea ta;
private File file;
public void init()
{
f = new Frame("简易编辑器");
f.setBounds(500,200,400,512);
f.setLayout(new FlowLayout());
mb = new MenuBar();
m = new Menu("菜单");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
exitItem = new MenuItem("退出");
mb.add(m);
m.add(openItem);
m.add(saveItem);
m.add(exitItem);
ta = new TextArea(29,45);
f.setMenuBar(mb);
f.add(ta);
MyEvent();
f.setVisible(true);
}
private void MyEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
exitItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
System.exit(0);
}
});
openItem.addActionListener(new ActionListener()
{
BufferedReader bfr;
public void actionPerformed(ActionEvent ae)
{
openDia = new FileDialog(f,"OPEN",FileDialog.LOAD);
openDia.setVisible(true);
String dir = openDia.getDirectory();
String filename = openDia.getFile();
if(dir == null || filename ==null) //if(dir == null || filename ==null) Ubuntu下有“最近使用的”dir会为null
return ;
file = new File(dir,filename);
String filePath = file.getAbsolutePath(); //需要考虑该文件是否有权限读取
try
{
bfr = new BufferedReader(new FileReader(filePath));
String len = null;
ta.setText("");
while((len=bfr.readLine())!=null)
{
ta.append(len+"\r\n");
}
}
catch (IOException e)
{
throw new RuntimeException("文件读取失败");
}
finally
{
try
{
if(bfr!=null);
bfr.close();
}
catch (IOException io)
{
throw new RuntimeException("文件关闭失败");
}
}
}
});
saveItem.addActionListener(new ActionListener()
{
BufferedWriter bfw;
public void actionPerformed(ActionEvent ae)
{
if(file==null)
{
saveDia = new FileDialog(f,"保存",FileDialog.SAVE);
saveDia.setVisible(true);
String dir = saveDia.getDirectory();
String filename = saveDia.getFile();
if(dir==null||filename==null)
return;
file = new File(dir,filename);
saveText();
}
else
{
saveText();
}
}
public void saveText()
{
try
{
bfw = new BufferedWriter(new FileWriter(file));
bfw.write(ta.getText());
bfw.flush();
}
catch (IOException e)
{
throw new RuntimeException("文件保存失败");
}
finally
{
try
{
if(bfw!=null)
bfw.close();
}
catch(IOException e)
{
throw new RuntimeException("文件关闭失败");
}
}
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Edit awt =new Edit();
awt.init();
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net