第一部分、概述
一、GUI
Graphical User Interface(图形用户接口)
用图形的形式,来显示计算机的操作界面,这样更方便直观。
二、CLI
Command Line User Interface(命令行用户接口)
Dos命令行,需要记忆一些常用的命令,操作不直观。
三、Awt与Swing
Java为GUI提供的对象都在java.Awt与java.swing包中。
1、java.awt
2、javax.swingAbstract Window Toolkit(抽象窗口工具包),需要调用本地系统方法来实现功能。属于重量级控件。依赖系统,跨平台性差。
在awt的基础上,建立一套图形界面系统,其中提供了更多的组件,而且完全由java实现。增强了移植性,属于轻量级控件,不依赖系统。
3、swt界面
eclipse使用的是swt界面,该外观包基于java.awt,是IBM的eclipse小组独立编写的图形化界面外观包。
四、继承关系流程图
注意:
Container(容器)是一个特殊的组件,该组件可以通过Add方法添加其他组件。
五、布局管理器
1、概念
容器中组件的排放方式就是布局。
2、常见的布局管理器
FlowLayout(流式布局,从左到右,Panel默认的布局)
BorderLayout(边界布局,东西南北中,未指定边界时,以最大面积填充,Frame默认布局)
GridLayout(网格布局,规则的矩阵)
GardLayout(卡片式布局,选项卡)
GridBagLayout(网格包式布局,非规则的矩阵)
图解:
注意:
1、当一个界面需要多种布局方式时,需要添加面板,在面板中设定不同的布局方式。
2、布局方式远不止以上几种,还有其他的未介绍。
六、创建图形化界面
1、基础方法
Frame类中:
Frame(String title) 构造一个新的最初不可见的,具有指定标题的Frame对象
void setMenuBar(MenuBar mb) 将此窗体的菜单栏设置为指定的菜单栏
Container类中:
void setLayout(LayoutManager mgr) 设置此容器的布局管理器
Component add(Component comp) 将指定组件追加到此容器的尾部
Component类中:
void setVisible(boolean b) 根据参数b的值显示或隐藏组件
void setLocation(int x,int y) 组件创建时在桌面的显示位置(横坐标、纵坐标)
void setSize(int width,int height) 设置组件的宽与高(横坐标、纵坐标)
void setBounds(int x, int y, int width, int height) 移动组件并调整其大小
2、基本步骤
创建图形化界面: 1、创建Frame窗体。 2、对窗体进行基本设置,如大小、位置、布局。 3、定义组件,并对组件进行基本设置。 4、将组件通过窗体的add方法添加到窗体中。 5、设置窗体显示,通过setVisible(true)。
示例代码:
package demo; import java.awt.*; /* * 需求:创建图形化界面 */ public class MyWindowDemo { public static void main(String[] args) { //1、创建Frame窗体 Frame f = new Frame("小小窗口"); //2、对窗体进行基本设置 f.setBounds(100,100,300,200); f.setLayout(new FlowLayout()); //3、定义组件 Button b = new Button("小按钮"); //4、将组件添加到窗体中 f.add(b); //5、设置窗体显示 f.setVisible(true); } }
运行结果:
注意:
创建图形化界面会开启一个新的线程。
第二部分、事件监听机制
一、概述
事件源(组件):就是awt包或者swing包中的那些图形界面组件
事件(Event):每一个事件源都有自己特有的对应事件和共性事件
监听器(Listener):将可以触发某一个事件的动作都已经封装到了监听器中
事件处理(引发事件后处理方式):程序员定义
事件源、事件、监听器在Java中都已经定义好了,直接获取其对象来用就可以了,程序员需要对产生的动作进行处理。
二、事件监听机制流程图
三、事件处理方式
事件包:java.awt.event(包括监听器、适配器及事件)
Window类中:
void addWindowListener(WindowListener l) 添加指定的窗口侦听器,以从此窗口接收窗口事件
WindowListener(接口,窗体监听,有适配器)常用方法:
void windowActivated(WindowEvent e) 将 Window 设置为活动(前置) Window 时调用
void windowClosing(WindowEvent e) 用户试图从窗口的系统菜单中关闭窗口时调用
void windowOpened(WindowEvent e) 窗口打开时调用(WindowEvent 窗体事件)
由于WindowListener接口中有7个方法,创建子类对象则需要覆盖所有的方法。为了方便操作,Java为其提供了适配器:abstract WindowAdapt,其覆盖了监听器中所有的方法,只是没有方法体。因此只要定义类继承WindowAdapt就可以监听指定的动作了。
一般当监听器方法超过3个(包括3个)就有适配器Adapt;添加事件监听器时一般采用匿名内部类的方式创建子类对象。
通过窗体的实例了解到,想要知道哪个组件具备什么样的特有监听器,需要查看该组件对象的功能(组件有哪些时间只有组件自己知道)。
Button类中:
void addActionListener(ActionListener l) 添加指定的动作侦听器,以接收发自此按钮的动作事件
ActionListener(接口,活动监听,无适配器)
void actionPerformed(ActionEvent e) 发生操作时调用
该监听器没有适配器,因其只有一个方法。活动监听键盘和鼠标都可以让其活动,因此,按钮尽量添加活动监听。
四、共性事件
鼠标事件与键盘事件几乎所有的组件都具备,因此存在于Component中:
void addKeyListener(KeyListener l) 添加指定的按键侦听器,以接收发自此组件的按键事件
void addMouseListener(MouseListener l) 添加指定的鼠标侦听器,以接收发自此组件的鼠标事件
MouseListener(接口,鼠标监听,有适配器)
void mouseClicked(MouseEvent e) 鼠标按键在组件上单击(按下并释放)时调用
void mouseEntered(MouseEvent e) 鼠标进入到组件上时调用
MouseEvent(鼠标事件)
int getClickCount() 返回与此事件关联的鼠标单击次数 (==2为双击)
KeyListener (接口,键盘监听,有适配器)
void keyPressed(KeyEvent e) 按下某个键时调用此方法
KeyEvent(键盘事件)
char getKeyChar() 返回与此事件中的键关联的字符
int getKeyCode() 返回与此事件中的键关联的整数 keyCode
static int VK_R R 键对应的值
static int VK_ENTER Enter键对应的值
例:
if(code>KeyEvent.VK_0 && code<=KeyEvent.VK_9)(判断是否为0-9)
InputEvent(输入事件,鼠标事件与键盘事件的父类)
void consume() 使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件
boolean isAltDown() 返回 Alt 修饰符在此事件上是否为 down
boolean isControlDown() 返回 Control 修饰符在此事件上是为 down
boolean isShiftDown() 返回 Shift 修饰符在此事件上是否为 down
示例代码:
package demo; /* 需求:演示事件监听机制并将将监听的事件从图形化界面中分离出来 */ import java.awt.*; import java.awt.event.*; public class AwtTest { //外部建立引用,使其在整个类中都有效 private Frame f; private Button b; AwtTest() { //对象一初始化就具备图形化界面及相应事件 this.init(); } //对图形化界面初始化 public void init() { f = new Frame("my frame"); b = new Button("my button"); f.setBounds(200,200,500,400); f.setLayout(new FlowLayout());//定义窗体的布局方式 ---- 流式布局 f.add(b);//将组件添加进窗口中 myEvent();//添加事件监听机制 f.setVisible(true);//设置显示窗体 } public void myEvent()//将监听事件从图形化界面中分离出来 { f.addWindowListener(new WindowAdapter()//添加一个窗口监听器(匿名内部类的方式) { public void windowClosing(WindowEvent e) { System.out.println("窗口关闭!--- 来自窗口监听器"); System.exit(0);//退出虚拟机 } }); //该按钮添加活动监听 b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("窗口关闭! -- 来自按钮"); System.exit(0); } }); } //主函数 public static void main(String[] args) { new AwtTest(); } }
第三部分:组件
一、文本组件(TextComponent)
1、TextField(文本框)
文本框只有一行。
TextField() 构造新文本字段。
TextField(int columns) 构造具有指定列数的新空文本字段
void setText(String t) 将此文本组件显示的文本设置为指定文本
2、TextArea(文本区域)
TextArea() 构造一个将空字符串作为文本的新文本区
TextArea(int rows, int columns)
构造一个新文本区,该文本区具有指定的行数和列数,并将空字符串作为文本
void append(String str) 将给定文本添加到当前文本的末尾处(不覆盖)3、TextComponent中常用方法
void setText(String t) 将此文本组件显示的文本设置为指定文本(会覆盖之前文本)
String getText() 返回此文本组件表示的文本二、对话框(Dialog)
1、基本使用
对话框的使用与Frame类型,只是其添加文本时需要用到Lable(标签),然后将标签通过add方法添加到对话框中即可。
Dialog(Frame owner, String title, boolean modal)
构造一个最初不可见的 Dialog,它带有指定的所有者 Frame、标题和模式。modal为true时在对话框隐藏前无法操作与其关联的Frame对象。可以通过setVisible(true)方法设置让其显示。
2、标签(Lable)
Label() 构造一个空标签
Label(String text) 使用指定的文本字符串构造一个新的标签,其文本对齐方式为左对齐
void setText(String text) 将此标签的文本设置为指定的文本
String getText() 获取此标签的文本示例代码:
运行结果:package demo; /* * 通过图形化界面列出指定目录下的文件及文件夹 */ import java.awt.*; import java.awt.event.*; import java.io.*; public class MyWindow { //外部建立引用 private Frame f; private Button b; private TextField tf;// private TextArea ta; MyWindow() { //对象初始化就具备图形化界面 init(); } public void init() { f = new Frame("文件列表"); b = new Button("转到"); tf = new TextField(49);//创建一个文本框 ta = new TextArea(20,56);//创建一个文本区域 --- 行与列 //对窗体进行基本设置 f.setBounds(200,200,450,400); f.setLayout(new FlowLayout());//布局 f.add(tf); f.add(b); f.add(ta); //添加事件 myEvent(); f.setVisible(true); } public void myEvent() { //在按钮事件源上添加活动监听 b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { method(); } }); //在文本框事件源上添加键盘监听 tf.addKeyListener(new KeyAdapter() { //按下Enter键,运行method方法 public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER) method(); } }); //在Frame窗体上添加窗体监听 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void method() { //每次对按钮进行操作前,都将文本区域清空 ta.setText(""); //获取文本框中输入的字符串(路径) String s = tf.getText(); //将文本框中的内容封装成File对象 File fi = new File(s); //若此File对象不是目录 if(!fi.isDirectory()) { //新建对话框属于f窗体,名称为 错误,模式为true(对话框消失前不可以操作Frame对象) Dialog dl = new Dialog(f,"错误",true); //对对话框进行基本设置 dl.setBounds(320,330,240,100); //给对话框添加按钮(Dialog是Container的子类) Button but = new Button("确认"); dl.setLayout(new FlowLayout()); //给对话框添加标签 Label lb = new Label("路径输入错误,请检查后输入!!!"); dl.add(lb); dl.add(but); //给对话框中的按钮添加活动监听 but.addActionListener(new ActionListener() { //关闭对话框(设置显示:false) public void actionPerformed(ActionEvent e) { dl.setVisible(false); } }); //给对话框添加窗体监听 dl.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dl.setVisible(false); } }); //给对话框添加键盘监听 but.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER) dl.setVisible(false); } }); dl.setVisible(true);//设置显示的要放在最后一行 } //是目录 else { //列出目录下的文件 String[] strs = fi.list(); for(String name:strs) { ta.append(name+"\r\n");//添加到文本区域中 且要换行 } } } //主函数 public static void main(String[] args) { new MyWindow(); } }
![]()
![]()
三、菜单(Menu)
1、MenuBar(菜单栏)
MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法,即:
Frame类中:
void setMenuBar(MenuBar mb) 将此窗体的菜单栏设置为指定的菜单栏
MenuBar类中:
MenuBar() 创建新的菜单栏
Menu add(Menu m) 将指定的菜单添加到菜单栏
2、MenuItem(菜单中的最终项)与Menu(菜单)
|--- MenuItem
|--- Menu
Menu类中:
Menu() 构造具有空标签的新菜单
Menu(String label) 构造具有指定标签的新菜单
Menu(String label, boolean tearOff) 构造具有指定标签的新菜单,指示该菜单是否可以分离
MenuItem add(MenuItem mi) 将指定的菜单项添加到此菜单
void add(String label) 将带有指定标签的项添加到此菜单
MenuItem类中:
MenuItem() 构造具有空标签且没有键盘快捷方式的新菜单项。
MenuItem(String label) 构造具有指定的标签且没有键盘快捷方式的新菜单项
void addActionListener(ActionListener l) 添加指定的动作侦听器,以从此菜单项接收动作事件
四、文件对话框(FileDialog)
1、概述
2、方法FileDialog extends Dialog,其设置方法与Dialog类似,当需要显示时,setVisible(true)
构造方法:
FileDialog(Frame parent, String title, int mode)
创建一个具有指定标题的文件对话框窗口,用于加载或保存文件(属于parent框架)
mode:
static int LOAD 此常量值指示文件对话框窗口的作用是查找要读取的文件
static int SAVE 此常量值指示文件对话框窗口的作用是查找要写入的文件
方法:
String getDirectory() 获取此文件对话框的目录
String getFile() 获取此文件对话框的选定文件
五、综合示例
运行结果:/* 需求:创建图形化界面打开文本文件。并将文本框修改后的数据保存 */ package demo; import java.awt.*; import java.awt.event.*; import java.io.*; public class MyWindow { //创建引用 private Frame f; private MenuBar mb; private Menu m; private MenuItem mi,m1,m2; private FileDialog fd,fs; private File file; private TextArea ta; MyWindow() { init(); } public void init() { //创建对象 f = new Frame("程序"); //文本区域,未设置大小,因为Frame默认为边界式布局,未指定边界,最大面积填充 ta = new TextArea(); f.setBounds(200,200,600,500); //菜单栏与菜单 mb = new MenuBar(); m = new Menu("文件"); mi = new MenuItem("退出"); m1 = new MenuItem("打开"); m2 = new MenuItem("保存"); mb.add(m); m.add(m1); m.add(m2); m.add(mi); //文件打开对话框 fd = new FileDialog(f,"OPEN -- 打开文件",FileDialog.LOAD); fd.setLocation(300,400); //文件保存对话框 fs = new FileDialog(f,"SAVE -- 保存",FileDialog.SAVE);//创建保存对话框并与 框架关联 fs.setLocation(300,400); f.setMenuBar(mb); f.add(ta); //添加事件 myEvent(); f.setVisible(true); } public void myEvent() { //保存菜单项添加活动监听(保存对话框显示需要条件) m2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { /*(打开一个文件并修改后点保存不弹出) 在第一次往文本框写完数据点保存的时候,此时是没有目录和文件名的-----弹出 而在保存完毕后如果继续在文本框中写入数据,此时目录和文件名都已经存在,不弹出 */ if(file==null)//只有当路径不存在的时候才弹出对话框 { //文件保存对话框显示,并获取对话框中的当前目录与选定文件名 fs.setVisible(true); String f = fs.getFile(); String dir = fs.getDirectory(); //未选择则返回null,避免发生空指针异常 if(f==null||dir==null) return ; file = new File(dir,f); } try//将对话框中的数据写入文件中 { BufferedWriter bufw = new BufferedWriter(new FileWriter(file)); //获取文本区域中的数据 String text = ta.getText(); bufw.write(text); bufw.flush(); bufw.close(); } catch (IOException e1) { throw new RuntimeException("保存文件错误"); } } }); //打开菜单项添加活动监听 m1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //显示打开文件对话框,并清空文本区域 fd.setVisible(true); ta.setText(""); try { String f = fd.getFile(); String dir = fd.getDirectory(); //未选中文件避免发生空指针异常 if(f==null||dir==null) return ; //将选定文件中的数据写到文本区域中 file = new File(dir,f); BufferedReader bufr = new BufferedReader(new FileReader(file)); String line = null; while((line=bufr.readLine())!=null) { //文本组件的添加方法 ta.append(line+"\r\n"); } } catch (IOException e1) { throw new RuntimeException("读取文件错误"); } } }); //退出菜单项添加活动监听 mi.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 MyWindow(); } }
第六部分:jar包双击执行
一、实现步骤
1、将类文件打包(Package)。
2、编译.java文件,生成一个文件夹(包),包中有类文件。
3、添加清单字段(jar包中主函数的类)至jar包中的配置信息中,告知主函数所在的类。配置信息格式如下:
注意:”:“后面有一个空格,类名结尾有一个Enter键。
4、采用jar打包工具将文件夹打包,DOS命令行格式如下:
jar -cvfm my.jar 1.txt demo -c 创建新档案 -v 在标准输出中生成详细输出 -f 指定档案文件名 -m 包含指定清单文件中的清单信息 my.jar 生成的jar文件名 1.txt 配置信息文件名 demo 类文件包名
jar文件:
jar包中的配置信息文件:
二、注意
1、jar包的运行程序(javaw.exe)
2、为避免出现无法创建虚拟机的情况,需要修改系统中的注册表。
开始→运行→regedit→HKEY_CLASSES_ROOT→Applications→javaw.exe→shell→open→command
将字符串的数值修改为: ”路径“ -jar "1%"(注意-jar前后的空格)