AWT与Swing
java.awt需要调用本地系统方法实现,属于重量级控件,由于他调用本地系统方法,所以最终界面风格依赖于使用的操作系统,windows2000下就会是2000的风格。
-
javax.swing:在awt的基础上建立的一套图形界面系统,提供了更多的组件,完全由java实现,增强了移植性,属于 轻量级控件。
图形用户界面系统有一系列的类继承层次关系。
-
组件布局
常见的布局管理器
- Flow Layout(流式布局管理器) 放入第一个组件的时候默认格式是居中的,放入第二个以后会自动让两个组件的组合形成居中。
- Border Layout (边界布局管理器)
- Grid Layout(网格布局管理)
- Card Layout(卡片布局)
- GridBag Layout(网格包布局管理器)
创建图形化界面步骤
- 创建frame窗体
- 对窗体进行基本设置(大小、位置、布局)
- 定义组件
- 将组件通过窗体的add方法添加到窗体中
- 让窗体显示,通过setVisible(true)方法
事件监听机制
外部动作->有监听器监听的动作作于事件源之上->事件源->产生事件对象->将事件对象传给事件处理方式->监听器引发引发事件的动作->将监听器注册到事件源
监听器监听的不止一个事件。
监听器可以监听键盘事件、鼠标事件等。
想要知道什么组件具备什么样的监听器需要查阅该组件对象的功能。
监听机制的特点:
- 事件源:就是图形界面的组件
- 事件: 每一个事件源都有自己特有的对应事件和共性事件
- 监听器:将可以触发某一事件的动作都已经封装到了监听器中
上述三者在监听器中已经定义好了,直接获取其对象来使用就可以了,我们要做的事情就是对产生的时间进行处理。
package GUI;
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.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.text.TabableView;
public class GuiDemo3 {
private Frame frame;
private TextField textField;
private TextArea textArea;
private Button button;
private Dialog dialog;
private Label label;
private Button okButton;
public GuiDemo3() {
init();
// TODO Auto-generated constructor stub
}
public void init()
{
frame=new Frame();
frame.setBounds(300, 100, 500, 600);
frame.setLayout(new FlowLayout());
textField=new TextField(60);
button=new Button("转到");
textArea=new TextArea(25, 70);
dialog=new Dialog(dialog,"警告框",true);
dialog.setBounds(100, 50, 200, 300);
dialog.setLayout(new FlowLayout());
label=new Label();
okButton=new Button("确定");
dialog.add(label);
dialog.add(okButton);
frame.add(textField);
frame.add(button);
frame.add(textArea);
myEvent();
frame.setVisible(true);
}
public void myEvent()
{
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
dialog.setVisible(false);
}
});
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
dialog.setVisible(false);
}
});
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String filePath=textField.getText();
File file=new File(filePath);
if (file.isDirectory()&&file.exists()) {
textArea.setText("");
String[] files=file.list();
for(String file1:files)
{
textArea.append(file1+"\r\n");
}
}
else {
label.setText("您的输入有误,请重新输入");
dialog.setVisible(true);
}
//textArea.setText(text);
//System.out.println(text);
}
});
}
public static void main(String[] args) {
new GuiDemo3();
}
}
上述程序实现类似于磁盘搜索功能,在上方输入路径,在指定路径上搜索所有的文件夹,如果存在文件夹就全部罗列出来,如果路径名不存在,则弹出一个对话框提示路径名不存在。对话框和窗体的关闭功能需要自己实现,默认的窗体构造出来以后没有关闭功能。
-
运行效果如下
需要说明的一点是,弹出的警告提示框在单击关闭或者点击确定按钮以后的消失是一种假象,在此我们做的处理是让对话框的setVisible方法为false,即让该窗体不可见,造成了弹出的对话框消失误以为是对话框已经被关闭的假象。
在对话框窗体中,该窗体由一个按钮还有一个label标签共同组成。需要将其添加到对话框窗体中。
菜单窗体实例
package GUI;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyMenuDemo {
private Frame frame;
private MenuBar menuBar;
private Menu menu,submenu;
private MenuItem menuItem,subMenuItem;
MyMenuDemo()
{
init();
}
public void init()
{
frame=new Frame("菜单窗口练习");
frame.setBounds(200, 400, 500, 600);
frame.setLayout(new FlowLayout());
menuBar=new MenuBar();
menu=new Menu("文件");
submenu=new Menu("子菜单");
menuBar.add(menu);
menuItem=new MenuItem("退出");
subMenuItem=new MenuItem("子菜单项");
menu.add(menuItem);
menu.add(submenu);
submenu.add(subMenuItem);
frame.setMenuBar(menuBar);//在窗体中添加菜单栏使用的是setMenuBar()方法
myEvent();
frame.setVisible(true);
}
public void myEvent() {
//实现点击窗体的关闭按钮来关闭窗体
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
//点击菜单中的退出功能退出应用程序
//后期可以添加一个确认退出的对话框
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}
- 在菜单窗口中,先要有一个MenuBar,MenuBar就是一个菜单栏,要想在一个窗体中添加菜单栏,用到的方法是frame.setMenuBar().
接下来应该为菜单栏添加菜单。菜单中可以添加子菜单或者菜单项,菜单中的子菜单是可以有下一级目录的,在右边会有个小箭头。 - 为菜单项添加动作事件的时候是用的
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
以下示例是实现了菜单窗体实现了文件的打开和保存操作
package GUI;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MyMenuDemo {
private Frame frame;
private MenuBar menuBar;
private Menu menu,submenu;
private MenuItem menuItem,subMenuItem,openItem,saveMenuItem;
private TextArea textArea;
private FileDialog fileDialog,saveDialog;
private File file;
MyMenuDemo()
{
init();
}
public void init()
{
frame=new Frame("菜单窗口练习");
frame.setBounds(200, 400, 500, 600);
textArea=new TextArea();
menuBar=new MenuBar();
menu=new Menu("文件");
submenu=new Menu("子菜单");
menuBar.add(menu);
menuItem=new MenuItem("退出");
openItem=new MenuItem("打开");
subMenuItem=new MenuItem("子菜单项");
saveMenuItem=new MenuItem("保存");
fileDialog=new FileDialog(frame, "打开文件", FileDialog.LOAD);
saveDialog=new FileDialog(frame, "保存文件", FileDialog.SAVE);
menu.add(menuItem);
menu.add(submenu);
menu.add(openItem);
menu.add(saveMenuItem);
submenu.add(subMenuItem);
frame.add(textArea);
frame.setMenuBar(menuBar);//在窗体中添加菜单栏使用的是setMenuBar()方法
myEvent();
frame.setVisible(true);
}
public void myEvent() {
//点击保存,实现保存文件
saveMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (file==null) {
saveDialog.setVisible(true);
String filePath=saveDialog.getDirectory();
String fileName=saveDialog.getFile();
if (filePath==null||fileName==null) {
return;
}
file=new File(filePath, fileName);
}
else {
try {
BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));
bufferedWriter.write(textArea.getText());
bufferedWriter.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
//点击打开,打开一个文本文件,并将文本文件的内容读取到textArea中
openItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
fileDialog.setVisible(true);
String fileDirectory=fileDialog.getDirectory();
String fileName=fileDialog.getFile();
File file=new File(fileDirectory, fileName);
try {
BufferedReader bufferedReader=new BufferedReader(new FileReader(file));
String line=null;
while ((line=bufferedReader.readLine())!=null) {
textArea.append(line+"\r\n");
}
bufferedReader.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//实现点击窗体的关闭按钮来关闭窗体
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
//点击菜单中的退出功能退出应用程序
//后期可以添加一个确认退出的对话框
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}
注意
在以上的示例中出现了一些问题,总结如下
- 对于文件的IO操作一定记得刷新和关闭流
- 在对文件中进行的异常处理时,要明确try块中哪些内容要在里面,哪些内容不在里面,只要在里面,那么就只在该块中有效果
- 在弹出的保存或者打开文件对话框中,需要进行判断如果文件路径或者文件名为空,则直接return,该条是为了方便取消的操作。
- 在上述保存操作中,进行了判断,如果文件已经存在,则不需要再进行新建文件,直接把内容保存即可,如果还不存在当前的文件,需要先新建一个文件,再将内容保存。