---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
通过图形用户界面(GUI),用户和程序之间可以方便的进行交互。Java的抽象窗口工具包(AWT)中包含了许多类来支持GUI设计。AWT由Java的java.awt包提供,该包中有许多用来设计GUI的组件类,如按钮、菜单、列表、文本框等组件类,同时还包含窗口、面板等容器类。在学习GUI编程时,必须很好地理解两个概念:容器类(Container)和组件类(Component)。Java.awt包中的一部分层次关系如图:
- Button、Lable、Checkbox、TextComponent、TextArea、TextField类是Java.awt包中的类,并且是Java.awt包中的Component(组件)的子类。Java把Component类的子类或间接子类创建的对象称为一个组件。
- Java把Container的子类或间接子类创建的对象称为一个容器。
- 可以向容器内添加组件。Component类提供了一个public方法:add(),一个容器可以调用此方法想容器内添加组件。
- 容器调用removeAll()方法可以移掉容器中的全部组件,调用remove(Component c)方法可以移掉容器中参数指定的组件。
- 每当容器中添加新的组件或是移除组件时,应当调用validate()方法,以保证容器中的组件能正确显示出来。
- 注意到容器本身也是一个组件,因此一个容器可以使用add方法添加另一个容器,实现容器的嵌套,被添加的容器称为该容器的内嵌容器。
一、Java窗口
Frame类是Container类的间接子类,当需要一个窗口时,可使用Frame或其子类创建一个对象。窗口也是一个容器,可以向窗口添加组件。需要注意的是,窗口默认地被系统添加到显示屏上,因此,不可以将一个窗口添加到另一个容器中。
Frame中的常用方法:
- Frame(): 该构造方法可以创建一个无标题的窗口,窗口默认布局为BorderLayout布局。
- Frame(String s) :该构造方法可以创建一个标题为s的窗口,窗口默认的是BorderLayout布局。
- public void setBounds(int a,itn b,int width,int height) :窗口调用该方法可以设置出现在屏幕上时的初始位置(a,b),窗口的宽是width,高是height。
- pubic void setSize(int width,itn height) :设置窗口的大小,窗口在屏幕出现的默认位置是(0,0)。
- public void setVisible(boolean b) :设置窗口可见还是不可见,默认是不可见的。
- public void setResizable(boolean b) :设置窗口是否可以调整大小,默认是可以调整的。
MenuBar:Java.awt包中的MenuBar类负责创建菜单条的,即MenuBar的一个实例就是一个菜单条。
Menu :Java.awt包中的Menu类是负责创建菜单的。即Menu的一个实例就是一个菜单。
MenuItem:Java.awt包的MenuItem类负责创建菜单项,即MenuItem的一个实例就是一个菜单 项。
创建图形化界面的步骤:
1、创建Frame窗口。
2、对窗口大小进行设置
比如大小,位置,布局
3、定义组件
4、将组件通过窗体的add方法添加到窗体中
5、让窗体显示,通过setVisible(true);
/*
制作菜单
*/
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo6 {
private Menu m,m2;
private MenuBar mb;
private Frame f;
private MenuItem m1;
MyMenuDemo6() {
init();
}
public void init() {
f=new Frame("My Frame");
f.setBounds(300,300,500,300);
f.setLayout(new FlowLayout());
m=new Menu("文件");
m2=new Menu("新建");
mb=new MenuBar();
m1=new MenuItem("java");
//m2=new MenuItem("MenuItem2");
m2.add(m1);
m.add(m2);
mb.add(m);
f.setMenuBar(mb);
f.setVisible(true);
}
public static void main(String[] args) {
MyMenuDemo6 m=new MyMenuDemo6();
}
}
结果是:
但是当我点击关闭键时并没有反应,那么该怎么让窗口具备我们常见的关闭功能呢?下面我们来讲事件监听机制:
时间监听机制流程图:
事件监听机制的特点:
1、事件源
2、事件
3、监听器
4、事件处理
事件源:就是awt包或者swing包中的那些图形界面组件
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:可以出发某一个事件的动作(不止一个动作)都已经封装到了监听器中
以上三者:在java中都已经定义好了。直接获取其对象来用就可以了,我们要做的事情就是对产生的动作进行处理。
下面我们来让窗口具备关闭功能。
import java.awt.*;
import java.awt.event.*;
class FrameDemo3 {
private Frame f;
private Button b;
FrameDemo3() {
init();
}
public void init() {
f=new Frame("My Frame");
//设置窗口位置,大小
f.setBounds(300,200,500,400);
//设置布局
f.setLayout(new FlowLayout());
//设置按钮
b=new Button("Button");
f.add(b);
myEvent();
//设置窗口可见
f.setVisible(true);
}
public void myEvent() {
//点击关闭窗口
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
FrameDemo3 f=new FrameDemo3();
}
}
现在我再点击关闭按钮时便可成功关闭窗口了!
例:需求:制作一个菜单,具备新建,打开,保存,退出功能,在文本框中输入内容时,点击 保存可以按照指定的目录保存。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuDemo7 {
private Menu m,m2;
private MenuBar mb;
private TextArea ta;
private Frame f;
private MenuItem m1,m3,m4,m5;
private FileDialog openFile,saveFile;
private File file;
MyMenuDemo7() {
init();
}
public void init() {
f=new Frame("My Frame");
ta=new TextArea();
f.setBounds(300,300,500,300);
//f.setLayout(new FlowLayout());
f.add(ta);
m=new Menu("文件");
m2=new Menu("新建");
m3=new MenuItem("打开");
m4=new MenuItem("保存");
m5=new MenuItem("退出");
mb=new MenuBar();
m1=new MenuItem("java");
//m2=new MenuItem("MenuItem2");
m2.add(m1);
m.add(m2);
m.add(m3);
m.add(m4);
m.add(m5);
mb.add(m);
f.setMenuBar(mb);
openFile=new FileDialog(f,"我要打开",FileDialog.LOAD);
saveFile=new FileDialog(f,"我要保存",FileDialog.SAVE);
myEvent();
f.setVisible(true);
}
public void myEvent() {
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
m5.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
m3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
openFile.setVisible(true);
String dirPath=openFile.getDirectory();
String filename=openFile.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 ex) {
throw new RuntimeException("文件读取失败");
}
}
});
m4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(file==null){
saveFile.setVisible(true);
String dirPath=saveFile.getDirectory();
String filename=saveFile.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 ex) {
throw new RuntimeException("文件保存失败");
}
}
});
}
public static void main(String[] args) {
MyMenuDemo7 m=new MyMenuDemo7();
}
}
结果:
但我点击关闭按钮时,会退出程序。
点击打开,弹出:
点击保存,弹出:
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------