GUI(概述)
1、GUI(图形用户界面)
l Graphical User Interface (图形用户接口)
l 用图形的方式来显示计算机操作界面,更方便于操作
2、CLI
l Command Line User Interface(命令行用户接口)
l 需要记住常用的命令
3、java为GUI提供的对象都存在于java.Awt和javax.Swing两个包中。
4、现在做外观,有Awt、Swing、Swt
5、Awt和Swing的区别:
l java.Awt: Abstract Window ToolKit (抽象窗口工具包),需要调用本地方法实现功能,是重量级的控件。(有点依赖于平台)
l javax.Swing:提供了更多的组件,由java实现,增强了移植性,轻量级控件(和平台的关系不大)
6、继承关系图:
Container 是一个特殊的组件,可以通过add方法添加其他的组件进来。
Component |
Container |
构件 |
容器 |
Window |
panel |
Fram |
Dialog |
FileDialog |
Button |
Label |
Chexbox |
TextComponent |
TextArea |
TextField |
7、布局管理器:
l 容器中的组件的排放方式,就是布局
l 常见的布局管理器:
FlowLayout(流式布局管理器)
² 从左到右的顺序排列
² Panel默认的布局管理器
l BorderLayout(边界布局管理器)
² 东、南、西、北、中
² Frame默认的布局管理器
l GridLayout(网格布局管理器)
² 规则的矩阵
l CardLayout(卡片布局管理器)
² 选项卡
l GridBagLayout(网格包布局管理器)
² 非规则的矩阵
GUI(Frame)
1、创建一个简单的图形化界面的步骤:
² 创建一个Frame窗体
² 对窗体进行进本的设置,包括大小、位置、布局
² 定义组件
² 将组件添加到窗体中
² 显示窗体。
例子:
import java.awt.*;
class Demo1
{
publicstatic void main(String[] args)
{
//创建一个Frame窗体
Framef = new Frame("my frame");
//设置窗体
f.setSize(300,100);
f.setLocation(300,100);
f.setLayout(newFlowLayout());
//创建组件
Buttonb = new Button("我是按钮啊");
//添加组件
f.add(b);
//显示
f.setVisible(true);
}
}
GUI(事件监听机制)
1、事件监听机制的流程图:
2,由监听器所监听的动作 作用在事件源上 |
事件源(组件) |
外部动作 |
监听器 监听器引发 事件的动作 (事件处理方式) |
1将事件监听器注册 到事件源 |
3产生事件对象 |
事件对象 |
4、将事件对象传递 给事件处理方式 |
2、事件监听的特点:
² 事件源
就是awt包或者swing包中的那些图形化界面的组件
² 事件监听器
将可以出发某一个事件的动作(不只是一个动作)都已经封装在了监听器中
² 事件
每一个事件源都有自己的特有的事件和共性的事件
² 事件处理方式
其实在java中事件源、事件监听器和事件都已经封装为对象。
我们要做的就是事件产生的动作进行处理。
GUI(窗体事件)
/**
窗体事件监听:
1,事件监听的导入包:importjava.awt.event.*;
2,WindowListener中的方法都是抽象的
3,WindowAdapter继承WindowListener接口并复写了里面所有
的方法,但是是一个抽象的类,目的就是不让创建对象。
4,窗口事件常用的方法有打开,激活,关闭。
*/
import java.awt.*;
import java.awt.event.*;
class Demo2
{
publicstatic void main(String[] args)
{
Framef = new Frame("窗体事件例子") ;
f.setSize(600,300);
f.setLocation(100,300);
f.setLayout(newFlowLayout());
Buttonb = new Button("我是按钮");
f.add(b);
f.addWindowListener(newWindowAdapter()
{
//关
publicvoid windowClosing(WindowEvent e)
{
System.out.println("我关");
System.exit(0);
}
//打开
publicvoid windowOpened(WindowEvent e)
{
System.out.println("打开");
}
//激活
publicvoid windowActivated(WindowEvent e)
{
System.out.println("激活");
}
});
f.setVisible(true);
}
}
GUI(Action事件)
/**
流程:
1,定义基本的组件的引用
2,定义init方法,初始化基本的组件和基本的事件
3,构造函数,将init传进来
4,定义事件监听的函数
*/
import java.awt.*;
import java.awt.event.*;
class Demo3
{
privateFrame frame=null;
privateButton but = null;
Demo3()
{
init();
}
//定义初始化的方法
publicvoid init()
{
frame=new Frame("窗体的世界");
//设置窗体的位置(前两个变量),大小
frame.setBounds(300,100,400,500);
frame.setLayout(newFlowLayout());
but=newButton("退出");
frame.add(but);
//事件监听
baseListener();
frame.setVisible(true);
}
//定义基本的事件
publicvoid baseListener()
{
frame.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.out.println("窗体退出");
System.exit(0);
}
});
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.out.println("按钮退出");
System.exit(0);
}
});
}
//调用
publicstatic void main(String[] args)
{
newDemo3();
}
}
GUI(鼠标事件)
/**
1,共性的动作就是操作鼠标和键盘
2,鼠标点击动作和action动作的区别:
1,鼠标点击比Action动作先执行
2,action动作不用鼠标操作也能发生。
3,鼠标多击的要先看看event
*/
import java.awt.*;
import java.awt.event.*;
class Demo4
{
privateFrame f = null;
privateButton but = null;
Demo4()
{
init();
}
publicvoid init()
{
f= new Frame("frame");
f.setBounds(400,200,500,600);
f.setLayout(newFlowLayout());
but=newButton("我是按钮");
f.add(but);
myMouseListener();
f.setVisible(true);
}
publicvoid myMouseListener()
{
//添加鼠标action事件
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.out.println("acitonok");
}
});
//添加鼠标点击事件
but.addMouseListener(newMouseAdapter()
{
publicvoid mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入");
}
publicvoid mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("鼠标双击");
}
});
}
publicstatic void main(String[] args)
{
newDemo4();
}
}
GUI(键盘事件)
import java.awt.*;
import java.awt.event.*;
class Demo5
{
//定义引用
privateFrame f =null;
privateButton but=null;
privateTextField tf=null;
publicvoid init()
{
f=newFrame("鼠标事件");
f.setBounds(200,100,500,600);
f.setLayout(newFlowLayout());
but=newButton("我是按钮");
f.add(but);
tf=newTextField(20); //20是列数
f.add(tf);
myListener();
f.setVisible(true);
}
Demo5()
{
init();
}
publicvoid myListener()
{
//System.out.println(but);
but.addKeyListener(newKeyAdapter()
{
publicvoid keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
System.exit(0);
//isControlDown是是否按下ctrl键
if(e.isControlDown()&& e.getKeyCode()==KeyEvent.VK_ENTER)
{
System.out.println("hello");
}
}
});
//System.out.println(tf);
tf.addKeyListener(newKeyAdapter()
{
publicvoid keyPressed(KeyEvent e)
{
intcode=e.getKeyCode();
if(!(code>=KeyEvent.VK_0&& code<=KeyEvent.VK_9))
{
System.out.println("输入错误");
e.consume();//有这个弄的结果就不会把不符合条件的 输入进来了。
}
}
});
}
publicstatic void main(String[] args)
{
newDemo5();
}
}
GUI(练习)
/**
需求:做一个如图所示的界,在文本框中输入目录,
单击”转到“按钮,将该目录中的文件与文件夹名称列
在下面的文本区域中。
分析界面:
1,一个frame 、一个 TextField、一个Button、一个TextArea(文本区域)
2,在文本框中输入目录
3,按钮触发事件,遍历目录中的文件和文件夹,将其显示在文本区域中。
几个常用的方法:
1,关闭窗体
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
2、鼠标事件
but.addActionListener(new ActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{}
}
3、
TextField:
setText();
getText();
TextArea:
将给定文本追加到文本区的当前文本。
public void append(String str){}
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class Demo6
{
//定义引用
privateFrame f =null;
privateTextField tf =null;
privateButton but =null;
privateTextArea ta =null;
//初始化界面和基本的事件
voidinit()
{
//创建对象
f=newFrame("练习");
tf=newTextField(50);//设置列数
but=newButton("转到");
ta=newTextArea(23,50);//设置行数和列数
//设置界面
f.setBounds(300,300,500,500);
f.setLayout(newFlowLayout());
f.add(tf);
f.add(but);
f.add(ta);
//监听
myEvent();
f.setVisible(true);
}
voidmyEvent()
{
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
//获取在文本框中输入的内容
StringdirName = tf.getText();
//将输入的目录名封装为对象
Filefile =new File(dirName);
//判断
if(file.exists()&& file.isDirectory())
{
tf.setText("");//清空
String[]names = file.list();
for(Stringname : names)
{
ta.append(name+"\r\n");
}
}
}
});
}
Demo6()
{
init();
}
publicstatic void main(String[] args)
{
newDemo6();
}
}
GUI(对话框Dialog)
/**
对话框的构造函数:
public Dialog(Frame f,String title,booleanmodal)
//modal是模式,当为true的时候,只要不关闭这个对话框,就不能够操作其他的窗体。
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class Demo7
{
//定义引用
privateFrame f =null;
privateTextField tf =null;
privateButton but =null;
privateTextArea ta =null;
private Dialog d =null;
privateLabel label = null;
privateButton okbut = null;
//初始化界面和基本的事件
voidinit()
{
//创建对象
f=newFrame("练习");
tf=newTextField(50);//设置列数
but=newButton("转到");
ta=newTextArea(23,50);//设置行数和列数
//设置界面
f.setBounds(300,300,500,500);
f.setLayout(newFlowLayout());
f.add(tf);
f.add(but);
f.add(ta);
//监听
myEvent();
f.setVisible(true);
}
voidmyEvent()
{
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
//获取在文本框中输入的内容
StringdirName = tf.getText();
//将输入的目录名封装为对象
Filefile =new File(dirName);
//判断
if(file.exists()&& file.isDirectory())
{
tf.setText("");//清空
String[]names = file.list();
for(Stringname : names)
{
ta.append(name+"\r\n");
}
}
else
{
d=new Dialog(f,"提示信息",true);
label= new Label();
okbut= new Button("确定");
d.setBounds(300,400,300,240);
d.setLayout(newFlowLayout());
d.add(label);
d.add(okbut);
label.setText("您输入的信息有误,请重新输入");
dialogEvent();
d.setVisible(true);
}
}
});
}
voiddialogEvent()
{
d.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
d.setVisible(false) ;
}
});
okbut.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
d.setVisible(false) ;
}
});
}
Demo7()
{
init();
}
publicstatic void main(String[] args)
{
newDemo7();
}
}
GUI(菜单)
/**
Menu extends MenuItem
Menu add(MenuItem)
Menu add(Menu)
*/
import java.awt.*;
import java.awt.event.*;
class Demo8
{
privateFrame f;
privateMenuBar mb;
privateMenu m,subMenu;
privateMenuItem closeItem,subItem;
Demo8()
{
init();
}
voidinit()
{
f= new Frame("菜单练习");
mb= new MenuBar();
m=newMenu("文件");
closeItem=newMenuItem("关闭");
subMenu=newMenu("子菜单");
subItem=newMenuItem("子条目");
f.setBounds(300,100,500,400);
f.setLayout(newFlowLayout());
f.setMenuBar(mb); //在窗体中加入menubar的方法就是setMenuBar
mb.add(m);
m.add(closeItem);
m.add(subMenu);
subMenu.add(subItem);
menuEvent();
f.setVisible(true);
}
privatevoid menuEvent()
{
closeItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
publicstatic void main(String[] args)
{
newDemo8();
}
}
简单的记事本
/**
模拟记事本
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class Demo9
{
//定义引用
privateFrame f;
privateMenuBar mbar;
privateMenu fileMenu;
privateMenuItem openItem,saveItem,exitItem;
privateTextArea ta;
privateFileDialog openDia,saveDia;
privateFile file;
//构造函数
Demo9()
{
init();
}
privatevoid init()
{
f=newFrame("我的记事本");
f.setBounds(100,200,550,600);
mbar=newMenuBar();
fileMenu= new Menu("文件");
openItem=newMenuItem("打开");
saveItem=new MenuItem("保存");
exitItem=newMenuItem("退出");
ta=newTextArea();
openDia=newFileDialog(f,"打开文件",FileDialog.LOAD);
saveDia=newFileDialog(f,"保存文件",FileDialog.SAVE );
f.setMenuBar(mbar);
f.add(ta);
mbar.add(fileMenu);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(exitItem);
myEvent();
f.setVisible(true);
}
privatevoid myEvent()
{
//窗体关闭
f.addWindowListener(newWindowAdapter()
{
publicvoid windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//退出
exitItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//打开
openItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
openDia.setVisible(true);
StringdirPath=openDia.getDirectory();
StringfileName=openDia.getFile();
//System.out.println(dirPath+"...."+fileName);
//按取消时候
if(dirPath==null|| fileName==null)
return;
ta.setText("");
file=newFile(dirPath,fileName);
try
{
BufferedReaderbufr= new BufferedReader(new FileReader(file) );
Stringline =null;
while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n");
}
}
catch(IOException ex)
{
thrownew RuntimeException();
}
}
});
//保存
saveItem.addActionListener(newActionListener()
{
publicvoid actionPerformed(ActionEvent e)
{
//如果文件不存在
if(file==null)
{
saveDia.setVisible(true);
StringdirPath=saveDia.getDirectory();
StringfileName=saveDia.getFile();
if(dirPath==null|| fileName==null)
return;
file=new File(dirPath,fileName);
}
try
{
BufferedWriterbufw= new BufferedWriter(new FileWriter(file));
Stringtext=ta.getText();
bufw.write(text);
bufw.close();
}
catch(IOException ex)
{
thrownew RuntimeException("保存文件失败");
}
}
});
}
publicstatic void main(String[] args)
{
newDemo9();
}
}
双击执行jar
1,文件夹类型中已经注册文件信息
2,多个类,定义包名
3,将源文件编译到指定的文件目录下
例如:javac –d F:\old 类名
4,将这个文件打成jar包
例如:jar cvfF:\old my.jar(jar文件名) mymenu(包名)
5,自己定义一个配置清单文件
例如:新建1.txt
Main-Class:mymenu.Demo9 (:后必有空格,结尾处必有回车)
6,打成自定义配置文件的jar
jar –cvfm F:\old my.jar 1.txt mymenu