GUI即时图形化界面图形化界面方便较命令行模式更加简单明了,易于操作。图形化界面提供的队形都在java.awt和javax.Swing中。Awt相对比较依赖于平台。
1.创建图形化界面的步骤:
1.创建Frame窗体
2.对窗体进行基本设置,比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中,
5.让窗体显示,通过SetVisible(true)
import java.awt.*;
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("my awt");//创建窗体
//会默认边界式布局,并且全部居中填充
f.setSize(500,400);//设置窗体的大小
f.setLocation(300,200); //设置窗体的位置
f.setLayout(new FlowLayout()); //设置布局管理
Button b=new Button("我是一个按钮");//创建按钮
f.add(b);
f.setVisible(true);
System.out.println("Hello word");
}
}
2.事件监听机制
特点:事件源,事件,监听器,事件处理,这些都已经在java中定义好了,直接获取对象就可以了
事件源:就是awt包或者swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以触发一个事件的动作都已经封装到了监听器中
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("my awt");//创建窗体
//会默认边界式布局,并且全部居中填充
f.setSize(500,400);//设置窗体的大小
f.setLocation(300,200); //设置窗体的位置
f.setLayout(new FlowLayout()); //设置布局管理
Button b=new Button("我是一个按钮");//创建按钮
f.add(b);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)//复写WindowListener的关闭方法
{
System.out.println("我被关了啦"+e.toString());
System.exit(0);
}
public void windowActivated(WindowEvent e)
{
System.out.println("我活了");//被前置
}
public void windowOpened(WindowEvent e)
{
System.out.println("我被打开了");
}
}
); //创建一个匿名内部类,此类是WindowListener的子类
f.setVisible(true); //通过ture值,使frame窗口可见
}
}
然后实现按钮的关闭功能
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
private Frame f;//声明私有成员变量窗体
private Button but;//声明私有成员变量按钮
FrameDemo()//构造函数
{
init();
}
public void init()
{
f=new Frame(); //创建窗体对象
//对窗体进行基本设置
f.setBounds(300,100,600,500);//坐标值和宽高
f.setLayout(new FlowLayout());//单独指定布局管理器,避免整个填充
but=new Button("my button");//创建按钮
f.add(but);//添加组件到窗体里
myEvent(); //加载窗体上的事件
f.setVisible(true);//显示窗体
}
public void myEvent()//将监听器单独封装成方法
{
f.addWindowListener(new WindowAdapter() //将监听器添加到窗体中,并引用匿名内部类,实例化监听器的各种方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//让按钮具备退出功能
but.addActionListener(new ActionListener()
//调用匿名内部类,复写按钮监听器中的actionPerformed方法,执行退出操作
{
public void actionPerformed(ActionEvent e)
{
System.out.println("退出,按钮执行");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new FrameDemo();
}
}
鼠标和键盘事件:
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
private Frame f; //声明私有成员变量窗体
private Button but; //声明私有成员变量按钮
private TextField tf; //声名变量文本框
MouseAndKeyEvent() //构造函数
{
init();
}
public void init()
{
f=new Frame(); //创建窗体对象
//对窗体进行基本设置
f.setBounds(300,100,600,500); //坐标值和宽高
f.setLayout(new FlowLayout()); //单独指定布局管理器,避免整个填充
tf=new TextField(20); //创建文本框,10是添加的列数
but=new Button("my button"); //创建按钮
f.add(but); //添加组件到窗体里
f.add(tf); //添加文本框到窗体中
myEvent(); //加载窗体上的事件
f.setVisible(true); //显示窗体
}
private void myEvent() //将监听器单独封装成方法
{
f.addWindowListener(new WindowAdapter() //将监听器添加到窗体中,并引用匿名内部类,实例化监听器的各种方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
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(code+"--是非法的");
e.consume(); //使用此事件,将会不再按照默认的方式处理。
//在这里,原本输入除了数字之外的字符也都会进入文本框,
//采用这个事件之后,除数字之外的字符不再进入文本框
}
}
});
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("action ok");
}
}); //发现鼠标点击会先于按钮活动按钮
but.addMouseListener(new MouseAdapter() //给button添加鼠标监听
//调用匿名内部类,复写按钮监听器中的mouseEntered方法,实现鼠标进入事件
{
private int count=1; //定义一个计数器
private int ck=1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入到该组件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2) //鼠标双击动作
System.out.println("双击动作"+ck++);
}
});
but.addKeyListener(new KeyAdapter() //给按钮添加键盘监听
{
public void keyPressed(KeyEvent e)
{
/*
if(e.getKeyCode()==KeyEvent.VK_ENTER) //如果按到enter键是退出
System.exit(0);
*/
//组合键操作
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("ctrl+enter 是运行了");
//获取键盘码和对应的键名
//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"--"+e.getKeyCode());
}
});
}
public static void main(String[] args)
{
new MouseAndKeyEvent();
}
}
练习:列出指定目录内容
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog d; //引用一个对话框成员变量
private Label lab; //引用一个标签
private Button okbu; //引用按钮变量,应用于对话框中
MyWindowDemo()
{
init();
}
public void init()
{
f=new Frame("my window"); //创建一个窗体
f.setBounds(300,100,600,400); //设置窗体的位置,宽高
f.setLayout(new FlowLayout()); //设置成流布局
tf=new TextField(30); //新建文本框,设置列数是30
but=new Button("转到"); //新建按钮
ta=new TextArea(10,40); //新建文本编辑区域,15行40列
d=new Dialog(f,"提示信息-self",true); //新建一个对话框,true值表示当前窗口不处理就无法处理后置窗口
d.setBounds(400,200,200,150); //设置对话框的位置和宽高
d.setLayout(new FlowLayout()); //设置对话框布局为流式布局
lab=new Label(); //创建标签
okbu=new Button("确定"); //创建对话框中的按钮
d.add(lab);
d.add(okbu);
f.add(tf);
f.add(but);
f.add(ta);
myEvent();
f.setVisible(true); //设置窗口可视
}
private void myEvent()
{
okbu.addActionListener(new ActionListener() //操作时调用
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false); //点击对话框的确认按钮事件就会不显示对话框了
}
});
d.addWindowListener(new WindowAdapter() //添加窗体关闭方法,复写关闭方法
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false); //点击对话框关闭按钮的时候就不显示对话框了
}
});
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
but.addActionListener(new ActionListener() //添加窗体监听器
{
public void actionPerformed(ActionEvent e) //操作时调用
{
showDir(); //在操作时调用目录转入文本区功能函数
}
});
f.addWindowListener(new WindowAdapter() //添加窗体关闭方法,复写关闭方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0); //退出窗体
}
});
}
private void showDir() //输入目录后转入文本区的功能封装成一个方法
{
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.setText(""); //将搜素的内容转到文本区域后,清空文本框
}
public static void main(String[] args)
{
new MyWindowDemo();
}
}
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
private Frame f; //引用窗体变量
private MenuBar mb; //引用菜单条变量
private Menu m; //引用菜单变量
private MenuItem closeItem,openItem,salveItem; //引用菜单项
MyMenuDemo() //构造函数初始化
{
init();
}
public void init()
{
f=new Frame("my window"); //初始化窗口
f.setBounds(300,100,500,600); //设置窗口的位置和宽高
f.setLayout(new FlowLayout()); //设置窗体的布局方式为流式布局
mb=new MenuBar(); //初始化菜单栏
m=new Menu("文件"); //初始化菜单
closeItem=new MenuItem("退出"); //初始化菜单项目
openItem=new MenuItem("打开");
salveItem=new MenuItem("保存");
mb.add(m); //将菜单添加到菜单栏中
m.add(openItem);
m.add(salveItem);
m.add(closeItem); //将关闭按钮添加到菜单中
f.setMenuBar(mb); //将菜单栏设置到窗体中
myEvent();
f.setVisible(true);
}
private void myEvent()
{
closeItem.addActionListener(new ActionListener() //关闭项目处理机制
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
f.addWindowListener(new WindowAdapter() //添加窗体关闭方法,复写关闭方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0); //退出窗体
}
});
}
public static void main(String[] args)
{
new MyMenuDemo();
}
}
然后具体实例化菜单中的打开和保存操作
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuTest
{
private Frame f; //引用窗体变量
private MenuBar bar; //引用菜单条变量
private TextArea ta;
private Menu fileMenu; //引用菜单变量
private MenuItem closeItem,openItem,saveItem; //引用菜单项
private FileDialog openDia,saveDia; //引用打开和保存对话框
private File file; //引用文件变量
MyMenuTest() //构造函数初始化
{
init();
}
public void init()
{
f=new Frame("my window"); //初始化窗口
f.setBounds(300,100,500,600); //设置窗口的位置和宽高
// f.setLayout(new FlowLayout()); //设置窗体的布局方式为流式布局
bar=new MenuBar(); //初始化菜单栏
ta=new TextArea();
fileMenu=new Menu("文件"); //初始化菜单
closeItem=new MenuItem("退出"); //初始化菜单项目
openItem=new MenuItem("打开");
saveItem=new MenuItem("保存");
bar.add(fileMenu); //将菜单添加到菜单栏中
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem); //将关闭按钮添加到菜单中
f.setMenuBar(bar); //将菜单栏设置到窗体中
openDia=new FileDialog(f,"打开了",FileDialog.LOAD); //初始化
saveDia=new FileDialog(f,"开始保存",FileDialog.SAVE);
myEvent();
f.add(ta);
f.setVisible(true);
}
private void myEvent()
{
saveItem.addActionListener(new ActionListener() //保存事件处理
{
public void actionPerformed(ActionEvent e)
{
if(file==null) //判断文件是否存在,如果不存在,则创建一个
{
saveDia.setVisible(true); //显示保存对话框
String dirPath=saveDia.getDirectory(); //获取目录地址
String fileName=saveDia.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 ioe)
{
throw new RuntimeException("写入失败");
}
}
});
openItem.addActionListener(new ActionListener() //创建打开事件监听机制
{
public void actionPerformed(ActionEvent e)
{
openDia.setVisible(true); //显示对话框
String dirPath=openDia.getDirectory(); //获取文件路径
String fileName=openDia.getFile(); //获取文件名
System.out.println(dirPath+"--"+fileName);
if(dirPath==null || fileName==null) //判断是否为空
return;
ta.setText(""); //打开新文件之前,清空之前的内容
file=new File(dirPath,fileName); //将文件路径和文件名封装成对象
try
{
BufferedReader bufr=new BufferedReader(new FileReader(file));
//创建读取流缓冲区,将file文件传入
String line=null;
while((line=bufr.readLine())!=null) //开始读取数据
{
ta.append(line+"\r\n"); //添加到文本区中
}
bufr.close();
}
catch(IOException ioe)
{
throw new RuntimeException("读取失败");
}
}
});
closeItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
f.addWindowListener(new WindowAdapter() //添加窗体关闭方法,复写关闭方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0); //退出窗体
}
});
}
public static void main(String[] args)
{
new MyMenuTest();
}
}
将打开的文件传到文本区中
在文本区写些数据,保存到桌面
练习:上述文件保存管理操作前提还是在DOS命令行下操作。接下来创建只用双击就可以执行的jar包
先在代码段中用包将其封装,javac -d .java 将相关的类都打包,装到一个文件夹中。然后返回包所在的目录,执行以下命令