一、GUI——图形化界面,人与计算机交流的桥梁。java.awt:重量级控件,需要调用本地系统方法实现。javax.swing:轻量级控件,完全由java实现,增强可移植性。
二、布局管理器:容器中组件的排放方式。
- 流式布局(FlowLayout):从左到右布局;
- 边界式布局(BorderLayout):上北下南左西右东,不指定方位,填充整个区域,是默认的布局方式。
- 网格式布局(GridLayout):比如计算器式布局;
- 网格包式布局(GridBagLayout):组件占多个格子;
卡片式布局(CardLayout):比如属性布局。
注:当一个窗体涉及多个布局方式时,需先将窗体用面板(Panel)划分,再添加组件。
三、GUI的制作步骤:1、创建Frame窗体;
&emso;2、对Frame窗体做基本设置,比如:大小、位置、布局等;
3、创建组件;
4、用Frame的add功能将组件添加到Frame窗体中;
5、添加监听器;
6、让窗体显示,f.setVisiable(true);
四、事件监听机制:先确定事件源,确定事件,确定添加哪种监听器,做出何种处理。
1、WindowListener:窗体事件监听器,比如关闭窗体;
2、ActionListener:活动监听器,活动事件;
3、MouseListener:鼠标监听器,点击(双击)、滑过、移出、按下时、释放时;
4、KeyListener:键盘监听器:键入、按下时、释放时。
五、练习
1、读取目录
/*
读取目录:
步骤:
1、先做出图形界面;
2、再添加监听器;
3、容错处理;
4、添加键盘回车事件。
其他说明:1、ta.setText():添加新内容时,之前的内容会被覆盖;
ta.append():将内容追加到后面
2、TextField:创建时可以指定列数;
3、TextArea:创建时,参数列表:行数、列数;
4、Dialog:参数列表:所属窗体,对话框名称,状态模式;
注:监听器一个一个添加,添加一个测试一个,全部添加再测试问题不好找。
我添加的顺序:窗体关闭监听器、添加按钮监听器、对话框监听器、文本框监听器。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class GuiTest
{
//基本的Frame窗体,及组件
private Frame f;
private TextField tf;
private Button b;
private TextArea ta;
//弹出对话框及里面的组件
private Dialog d;
private Button okB;
private Label l;
GuiTest()
{
init();
}
public void init()
{
//创建Frame窗体
try
{
f = new Frame("my frame");
//对Frame窗体进行基本的设置
f.setBounds(300,200,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(54);
b = new Button("转到");
ta = new TextArea(26,60);
//将组件添加到Frame窗体中
f.add(tf);
f.add(b);
f.add(ta);
//给窗体绑定事件
myEvent();
//显示窗体
f.setVisible(true);
}
catch (Exception e)
{
throw new RuntimeException("窗体建立失败");
}
}
//事件函数
public void myEvent()
{
//添加窗体关闭事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//添加按钮事件
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
buttonEvent();
}
});
//添加文本框事件
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
buttonEvent();
}
}
});
}
//按钮、回车键触发的事件相同,所以提取出来
public void buttonEvent()
{
//获取文本框内容,并将封装成File对象
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
{
try
{
//建立对话框及组件
d = new Dialog(f,"提示",true);
okB = new Button("确定");
l = new Label();
//对对话框做基本设置
d.setBounds(500,300,200,100);
d.setLayout(new FlowLayout());
//想对话框中添加组件
d.add(l);
d.add(okB);
//想标签里添加文字
l.setText("目录不存在,请重新输入!");
//给对话框添加关闭对话框事件
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
//给确定按钮对象添加关闭对话框的事件
okB.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
d.setVisible(true);
}
catch (Exception ie)
{
throw new RuntimeException("对话框添加失败!");
}
}
}
public static void main(String[] args)
{
new GuiTest();
}
}
2、简单的文本编辑器
/*
文本编辑器:
步骤:1、做好界面;
2、添加监听器;
3、容错处理;
其他说明:文本打开对话框和文本保存对话框都是用FileDialog创建的,文本打开对话框用:FileDialog.LOAD模式;
而文本保存对话框用:FileDialog.SAVE模式。弹出文本保存对话框之前,需要判断文本是否已经存在,
若存在不弹文本保存对话框,直接保存,若不存在,则弹文本保存对话框。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenu
{
//创立窗体及组件
private Frame f;
private TextArea ta;
//菜单栏及菜单
private MenuBar bar;
private Menu filem;
private MenuItem openm;
private MenuItem savem;
private MenuItem exitm;
//打开文本、保存文本框
private FileDialog openfd,savefd;
//用于将文件的目录封装成File对象
private File dir;
MyMenu()
{
init();
}
public void init()
{
//创建窗体,并对其做基本设置
f = new Frame("我的文本编辑器");
f.setBounds(300,200,600,500);
//创建窗体组件
ta = new TextArea();
bar = new MenuBar();
//添加窗体组件
f.setMenuBar(bar);
f.add(ta);
//创建菜单
filem = new Menu("文件");
openm = new MenuItem("打开");
savem = new MenuItem("保存");
exitm = new MenuItem("退出");
//将菜单添加到菜单栏
bar.add(filem);
filem.add(openm);
filem.add(savem);
filem.add(exitm);
//创建保存、打开文本框
openfd = new FileDialog(f,"打开",FileDialog.LOAD);
savefd = new FileDialog(f,"保存",FileDialog.SAVE);
//绑定窗体事件
myEvent();
//显示窗体
f.setVisible(true);
}
public void myEvent()
{
//添加关闭窗体事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//添加退出事件
exitm.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//添加打开事件
openm.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//点击“打开”,弹出打开文本对话框
openfd.setVisible(true);
//获取文本存储路径及名字
String path = openfd.getDirectory();
String name = openfd.getFile();
//System.out.println(name+path);
//容错处理
if(path == null || name == null)
return;
//打开新的文本之前,先清空文本区域
ta.setText("");
//将文本存放路径封装成File对象
dir = new File(path,name);
try
{
//建立读取流,并与指定文本相关联
BufferedReader bufr = new BufferedReader(new FileReader(dir));
String line = null;
//从硬盘读取文本并书写到文本区域
while((line = bufr.readLine()) != null)
{
ta.append(line+"\r\n");
}
//关闭读取流
bufr.close();
}
catch (IOException ie)
{
throw new RuntimeException("读取文件失败!");
}
}
});
//添加保存事件
savem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//打开文本保存对话框之前,先判断该文本是否存在,
if(dir == null)
{
//若不存在弹出文本保存对话框
savefd.setVisible(true);
//获取文本保存路径及名字
String path = savefd.getDirectory();
String name = savefd.getFile();
//容错处理
if(path == null || name == null)
return;
//将路径及文本名称封装成File对象
dir = new File(path,name);
try
{
//建立写流,将文本区域的文本写到指定硬盘里
BufferedWriter bufw = new BufferedWriter(new FileWriter(dir));
String text = ta.getText();
//System.out.println(text);
bufw.write(text);
//关闭写流
bufw.close();
}
catch (IOException ie)
{
throw new RuntimeException("文件保存失败");
}
}
//如果文本存在,不弹文本保存对话框
else
{
try
{
//建立写流,将文本区域的内容,写到硬盘中
BufferedWriter bufw = new BufferedWriter(new FileWriter(dir));
String text = ta.getText();
bufw.write(text);
bufw.close();
}
catch(IOException ie)
{}
}
}
});
}
public static void main(String[] args)
{
new MyMenu();
}
}