JavaGUI图形化界面
GUI(图形用户界面)
概述:
GUI
Graphical User Interface(图形用户接口)
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI
Command Line User Interface(命令行用户接口)
就是常见的Dos命令行操作
需要记忆一些常用的命令,操作不直观
举例:
比如创建文件夹,或者删除文件夹等。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
Awt和Swing
Java.Awt:Abstract Window Toolkit(抽象窗口工具包),需要调用本地系统方法实现其功能,属于重量级控件。
Javax.Swing:在AWT的基础上,建立的一台图形界面系统,提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量级控件。
继承关系图:
布局管理器
在制作图形化界面时,要考虑该按照什么方式布局?
Java当中就给了我们布局管理器
容器中的组件的排放方式,就是布局。
常见的布局管理器:
1, FlowLayout(流式布局管理器)
从左到右的顺序排列
Panel默认的布局管理器
2, BorderLayout(边界布局管理器)
东,南,西,北,中
Frame默认的布局管理器
3,GridLayout(网格布局管理器)
规则的矩阵
4,CardLayout(卡片布局管理器)
选项卡
5,GridBagLayout(网格包布局管理器)
非规则的矩阵
GUI-Frame构建窗体
查询AIP文档,在java.awt包中Frame框架创建类,Frame 是带有标题和边框的顶层窗口
1, 创建Frame窗体,
Frame f = new Frame(“my Frame”);//创建一个新的具有指定标题的Frame对象
2,对窗体进行基本设置:对窗体大小,位置布局进行设置
f.setSize(500,400);//对窗体的大小即,长宽进行设置
f.setLocation(300,200);//对窗体所在位置进行横坐标和纵坐标设置
f.setLayout(new FlowLayout());//传入指定布局管理器对象
3,定义组件:
Button b = new Button(“我是一个按钮”);
4, 将组件通过窗体的add方法添加到窗体中
f.add(b);
5,让窗体显示,通过setVisible(true);注意: f.setVisible(boolean b);//通过设置参数是true还是false是否显示窗体
f,setVisible(true);
事件监听机制
组成:
事件源(组件):awt或者swing包中的那些图形界面组件
事件(Event):每一个事件源都有自己特有的对应事件和共性事件
监听器(Listener):将可触发某一时间的动作(不止一个动作),都封装到监听器中
事件处理(引发事后处理方式):引发事后处理方式。
以上三者,在java中都已经定义好了。直接获取对象来用就可以了。
我们要做的是,对产生的动作进行处理。
事件监听机制步骤:
1, 确定事件源(容器或者组件)
2, 通过事件源对象的addXXXListener()方法将监听器注册到改时间源上。
3, 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象
4, 一般用匿名内部类来标示
5, 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收
6, 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象,通过getSource()或者,getComponent()
窗口事件
WindowListener,用于接收窗口事件的侦听器接口。旨在处理窗口事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 WindowAdapter(仅重写所需的方法)。然后使用窗口的 addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。
void | windowActivated(WindowEvent e) |
void | windowClosed(WindowEvent e) |
void | windowClosing(WindowEvent e) |
void | windowDeactivated(WindowEvent e) |
void | windowDeiconified(WindowEvent e) |
void | windowIconified(WindowEvent e) |
void | windowOpened(WindowEvent e) |
因为是抽象,所以需要覆盖7个方法,但是只需用到其中某个方法怎么弄呢?
解决:
因为WindowListener的子类WindowAdapter已经实现了WindowListener接口,并覆盖了其中的所以方法,那么我只要继承自WindowAdapter覆盖其中的方法即可
示例:
import java.awt.*;
import java.awt.event.*;
class WindowEventDemo{
public static void main(String[] args) {
Frame f = new Frame("我的窗口");
//f.setSize(500,400);设置窗口大小
//f.setLocation(300,200);设置窗口的位置
f.setBounds(300,200,500,400);//将上面两个方法同一设置,移动组件并调整其大小。
f.setLayout(new FlowLayout());//传入指定布局管理器
Button b = new Button("我的按钮");//创建组件,将其对象传入构架中
f.add(b);
//添加窗口监听
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("关闭窗口");
System.exit(0);
}
public void windowOpened(WindowEvent e){
System.out.println("窗口可见");
}
public void windowActivated(WindowEvent e){
System.out.println("窗口前置");
}
});
f.setVisible(true);//让组建显示
}
}
Ation事件
让按钮具备退出程序的功能
示例:
import java.awt.*;
import java.awt.event.*;
class ActionEventDemo{
private Frame f;//定义图界面组件所需引用
private Button but;
ActionEventDemo(){
init();//构造函数初始化窗口的创建和功能实现
}
public void init(){
f = new Frame();
//基本设置
f.setBounds(300,200,500,400);
f.setLayout(new FlowLayout());
but = new Button("关闭按钮");//创建组件
myEvent();//加载窗口事件。
f.add(but);
f.setVisible(true);
}
public void myEvent()
{
f.addWindowListener(new WindowAdapter()//窗口监听
{
public void windowClosing(WindowEvent e)
{
System.out.println("关闭窗口");
System.exit(0);
}
});
/*
让按钮具备退出程序的功能
按钮就是事件源,那么选择什么监听器呢?
通过关闭窗口示例知道,想要知道那个组件具备特有的监听功能,
需要查看该组件对象的功能。
查询Button的描述,发现按钮支持一个特有的监听:addActionListener();
*/
but.addActionListener(new ActionListener()//按钮监听
{
public void actionPerformed(ActionEvent e)
{
System.out.println("关闭窗口,是按钮干的!");
System.exit(0);
}
});
}
public static void main(String[] args) {
new ActionEventDemo();//运行窗体程序代码
}
}
鼠标事件
鼠标监听MonseListener,抽象类,所以有其子类MouseAdapter实现
主要方法
void | mouseClicked(MouseEvent e) |
void | mouseDragged(MouseEvent e) |
void | mouseEntered(MouseEvent e) |
void | mouseExited(MouseEvent e) |
void | mouseMoved(MouseEvent e) |
void | mousePressed(MouseEvent e) |
void | mouseReleased(MouseEvent e) |
void | mouseWheelMoved(MouseWheelEvent e) |
在具体调用鼠标功能时的监听,
MouseEvent有如点击鼠标次数等特有操作方法
getClickCount()返回与此事件关联的鼠标单击次数。
键盘事件
KeyAdapter:接收键盘事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
主要方法
void | keyPressed(KeyEvent e) |
void | keyReleased(KeyEvent e) |
void | keyTyped(KeyEvent e) |
重点:
KeyEvent:标示组件中发生键击的事件
当按下、释放或键入某个键时,组件对象(如文本字段)将生成此低级别事件。
Char getKeyChar();//返回按下键盘关联的字符
Int getKeyCode();//返回键关联在整数
Static String getKeyText(int keycode)//因为在键与某整数想关联即键盘码,通过获取按下某个功能键Esc键会返回一个整数,getText(整数)通过整数返回你按下的是那个键。
组合键:
比如组合ctrl和enter关闭窗口,示例:
If(e.isControlDown()&&e.getKeyCode()==KetEvent.VK_ENTER)
解读:先判断ctrl键是否按下,在判断按的键是否是回车键
示例:
<span > </span>//给文本区添加键盘监听
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
if(!(key>=KeyEvent.VK_0&&key<=KeyEvent.VK_9)){
System.out.println("该字符非法");
e.consume();//当输入的是非法的就不再默认录入。
}
}
});
//给按钮添加鼠标监听
but.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if (e.getClickCount()==2)
System.out.println("鼠标监听双击关闭");
//System.exit(0);
}
public void Pressed(MouseEvent e){
System.out.println("鼠标监听单击示例");
}
});
//给按钮添加键盘监听
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//组合键,当ctrl键和某键组合==java中设定的常量值时,就关闭窗口
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("组合键关闭的");
//System.exit(0);
//根据键盘码获取按下的什么键
//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+""+e.getKeyCode());
//通过监听Esc来关闭程序。
if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.out.println("Esc键关闭的");
//System.exit(0);
}
}
});
对话框Dialog
概述:
Dialog 是一个带标题和边界的顶层窗口,边界一般用于从用户处获得某种形式的输入。
比如:当我们在文本区输入错误,会有对话框Dialog提示
何时需要产生对话框:
此对象时需要在调用时,才创建对象。如:当在误操作的时候,就需要出现提示错误信息的对话框,此时才创建的这个对象。
/*
练习:列出指定目录内容
当输入路径不对时,弹出对话框提示信息
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo{
//定义图形界面所需引用
private Frame f;
private Button but;
private Button okbut;
private TextField tf;
private TextArea ta;
private Dialog dia;
private Label lab;
//构造函数初始化功能组件
MyWindowDemo(){
init();
}
private void init(){
f = new Frame("我的窗口");
but = new Button("转到");
tf = new TextField(40);
ta = new TextArea(15,60);
f.setBounds(300,150,500,350);
f.setLayout(new FlowLayout());
f.add(tf);
f.add(but);
f.add(ta);
myEvent();//事件监听
f.setVisible(true);
}
public void myEvent(){
//给文本框注册键盘监听
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//当输如的不是路径弹出对话框Dialog{
dia = new Dialog(f,"异常提示",true);
//对对话框基本设置
dia.setBounds(500,300,400,150);
dia.setLayout(new FlowLayout());
okbut = new Button("确定");//对话框按钮
lab = new Label();//文本标签
dia.add(lab);
dia.add(okbut);
//对此对话框注册监听
dia.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
dia.setVisible(false);//将对话框隐藏
}
});
//对对话框按钮注册监听
okbut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dia.setVisible(false);//将对话框隐藏
}
});
String info = "您输入的路径:"+dirpath+"有误,请重新输入";
//把提示信息设置进去
lab.setText(info);
dia.setVisible(true);
}
}
public static void main(String[] args) {
new MyWindowDemo();
}
}程序显示如图:
菜单(Menu)
概述说明:
1,Menu:菜单,继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem
2,MenuBar:菜单栏,可添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。
3,MenuItem:菜单条目,也称菜单项,无右三角的图标存在,是最终的菜单项。
4,菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件处理。
5,通过setMenuBar()方法,将菜单添加到Frame中
/*
菜单示例
*/
import java.awt.*;
import java.awt.event.*;
class MenuDemo{
private Frame f;
//定义菜单所需引用
private MenuBar mb;
private Menu me,me1,me2,me3,me4;
private MenuItem mi,mi2,mi3,mi4;
//构造函数
MenuDemo(){
init();
}
//窗体实现和基本设置
private void init(){
f = new Frame("我的窗口");
f.setBounds(500,400,400,200);
f.setLayout(new FlowLayout());
//创建菜单栏
mb = new MenuBar();
//创建菜单
me = new Menu("文件");
me1= new Menu("标准文本");
me2 = new Menu("编辑");
me3 = new Menu("工具");
me4 = new Menu("帮助");
//创建子条目
mi = new MenuItem("新建");
mi2 = new MenuItem("打开");
mi3 = new MenuItem("关闭");
mi4 = new MenuItem("退出");
//菜单栏添加菜单组件
mb.add(me);
mb.add(me2);
mb.add(me3);
mb.add(me4);
//菜单添加子菜单
me.add(me1);
//菜单添加子条目组件
me1.add(mi);
me.add(mi2);
me.add(mi3);
me.add(mi4);
//添加菜单栏组件
f.setMenuBar(mb);
//窗体事件
myEvent();
//窗体显示
f.setVisible(true);
}
private void myEvent(){
//注册关闭窗口监听
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//给退出注册关闭监听
mi4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
}
public static void main(String[] args) {
new MenuDemo();
}
}运行结果如图:
练习:打开文件
分析:
打开文件关联到FileDialog,根据里面提供的获取文件路径和文件名的方法,我们可以封装成File对象,对File对象里的内容通过BfferedReader缓冲取出,并添加到指定文本区中。
/*
练习:打开文件,增删修改文件并保存文件
*/
import java.io.*;
import java.awt.*;
import java.awt.event.*;
class OpenFileDemo
{//定义所需组件
private Frame f;
private TextArea area;
private MenuBar mb;
private Menu fileM;
private MenuItem openMI,saveMI,endMI;
private File file;
private FileDialog open,save;
//构造函数
OpenFileDemo(){
init();
}
//窗体实现和基本设置
private void init(){
f = new Frame("My Wdionw");
f.setBounds(400,300,500,500);
area = new TextArea();
//菜单实现和基本设置
mb = new MenuBar();
fileM = new Menu("文件");
openMI = new MenuItem("打开");
saveMI = new MenuItem("保存");
endMI = new MenuItem("退出");
//创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
open = new FileDialog(f,"打开文件",FileDialog.LOAD);
save = new FileDialog(f,"保存文件",FileDialog.SAVE);
mb.add(fileM);菜单栏添加菜单
fileM.add(openMI);菜单添加子条目
fileM.add(saveMI);
fileM.add(endMI);
f.setMenuBar(mb);窗口添加菜单栏
f.add(area);添加文本区
myEvent();//事件监听
f.setVisible(true);//显示窗体
}
private void myEvent(){
//注册关闭窗口监听
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//给endMI注册活动监听
endMI.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
//给open注册活动监听
openMI.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
/*想要打开某个文件就需要先知道这个文件的路径,
在FileDialog类中就有
getFile():获取此文件对话框的选定文件。
getDirectory():获取此文件对话框的目录。*/
open.setVisible(true);
String path = open.getDirectory();
String name = open.getFile();
//判断路径文件名是否为null
if(path==null || name==null)
return;
area.setText("");//将之前文本区的数据清空
file = new File(path,name);
try{
BufferedReader buf = new BufferedReader(new FileReader(file));
String line = null;
while ((line = buf.readLine())!=null){
area.append(line+"\r\n");//读一个就往文本区写一个
}
buf.close();
}
catch (Exception e1){
throw new RuntimeException("文件打开失败");
}
}
});
//注册save活动监听
saveMI.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (file == null){//判断文件有没有被保存过时
save.setVisible(true);
String path = save.getDirectory();
String name = save.getFile();
file = new File(path,name);
}
try{//通过文本区获取将新修改过的文本数据,将之传入缓冲区,并刷新保存
BufferedWriter buw =
new BufferedWriter(new FileWriter(file));
String text = area.getText();
buw.write(text);
buw.close();
}
catch (IOException ee){
throw new RuntimeException("保存异常");
}
}
});
}
public static void main(String[] args) {
new OpenFileDemo();//主函数调用程序。
}
}
GUI(jar包双击执行)
在图形界面化后,理所当然也需要通过图形来开始执行程序,而不是通过控制台。
那怎么做呢?
这就需要将程序的class文件打成jar包,就可以双击执行了。
步骤:
1, 首先在java文件中导入一个包,没有则需要创建一个包,如package mamenu;
2, 生成包:通过控制台:javac –d c:\myclass OpenFileDemo.java回车,则会在c盘myclass文件夹下生成所有的.Class文件
3, 在此目录下再新建一个文件,为jar包配置清单属性信息。如1.txt或者其他名称其他扩展名的文件都可以,然后再其中编辑固定格式为:Main-Class:(空格)包名.类名(回车)
Main-Class: mymenu.OpenFileDemo
4, 控制台编译:jar –cvfm my.jar 1.txt mymenu。若想添加其他信息,则直接编译jar即可得出相应的命令。
5, 双击执行jar包。
注意:
有些问题可能导致jar包双击不能执行
如在为jar包配置清单属性信息时:
1, 如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。
2,如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行
说明:
Jar文件必须在系统中注册了才能运行
Xp系统的注册方法:
1.打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项
2.选择新建--->扩展名,将扩展名设置为jar,确定
3.选择高级,可更改图标,然后点击新建,命名为open,
4.在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。
Window7注册方法:
1, 改变打开方式,右击jar文件点击属性,选择打开方式更改,找到jdk安装包bin目录下javaw.exe选择它为打开方式
2, 彻底方法修改注册表:打开doc命令行,输入regedit,弹出注册表对话框,进入HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command,修改默认的键值为 "D:\Program Files\Java\jre\bin\javaw.exe" -jar "%1" 。
如图: