------- android培训、java培训、期待与您交流! ----------
java_GUI
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实现。增强了移植性,属轻量级控件。
继承关系图
Component
|--Container:可包含其他 AWT 组件的组件。
|--Window:窗口
|--Frame:框架
|--Dialog:对话框
|--FileDialog:文件对话框
|--Panel:面板
|--Button:按钮
|--Label:标签,作用是封装文字
|--Checkbox:复选框
|--TextComponent:文本组件
|--TextArea:文本框
|--TextField:文本区域
注意:
Component的子类区别:Container可以添加其他组件.而其他组件不行.
//-------------------------------------------------------------------
布局管理器
容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout(流式布局管理器)
从左到右的顺序排列。
Panel默认的布局管理器。
BorderLayout(边界布局管理器)
东,南,西,北,中
Frame默认的布局管理器。
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则的矩阵
//-----------------------------------------------------------------------
Component 类java.awt 包中:
component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的
按钮、复选框和滚动条都是组件示例。 Component 类是与菜单不相关的 Abstract Window Toolkit 组件的抽
象超类。还可以直接扩展类 Component 来创建一个轻量级组件。轻量级组件是与本机不透明窗口不相关的组件。
Component
|--Button:按钮
常用方法:
void | setBounds(int x, int y, int width, int height)
移动组件并调整其大小。
Button(String label)
构造一个带指定标签的按钮。
Component
|--Container类
常用方法:
Component | add(Component comp)
将指定组件追加到此容器的尾部。
void | setLayout(LayoutManager mgr)
设置此容器的布局管理器。
**********************************************
可包含其他 AWT 组件的组件。
Container:
|--Window:窗口的常见方法
void | setSize(int width, int height)
调整组件的大小,使其宽度为 width,高度为 height。
void | setVisible(boolean b)
根据参数 b 的值显示或隐藏此 Window。
**********************************************
Container:可包含其他 AWT 组件的组件。
|--Window:窗口
|--Frame:框架的方法:
Frame(String title)
构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
//----------------------------------------------------------
Container:为容器,是一个特殊的组件,该组件中可以通过add 方法添加其他组件进来。
创建图形化界面:
1,创建frame窗体。
2,对窗体进行基本设置。
比如大小,位置,布局。
3,定义组件。
4,将组件通过窗体的add方法添加到窗体中。
5,让窗体显示,通过setVisible(true)
简单示例:
import java.awt.*;//导入awt包来用里面的类和方法
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("百鑫制作");//创建一个Frame窗体.
f.setSize(500,400);//设置窗体的长宽
f.setLocation(300,200);//设置距离横向和纵向坐标
f.setLayout(new FlowLayout());//设置布局FlowLayout流式布局,从左到右的顺序排列。
Button b= new Button("按钮");//创建一个按钮
f.add(b);//将按钮添加到窗体中
f.setVisible(true);//显示窗体.
}
}
//-----------------------------------------------------------------------------
事件监听机制的特点:
1.事件源:就是awt包或者swing包中的那些图形界面组件。
2.事件:每一个事件源都有自己特有的对应事件和共性事件。
3.监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
(以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情是,就是对产
生的动作进行处理。)
4.事件处理。
窗口监听器:
Window类中
void addWindowListener(WindowListener l)
添加指定的窗口侦听器,以从此窗口接收窗口事件。
例如:用匿名内部类实现.
f.addWindowListener(new WindowAdapter()//事件源是f.也就是窗口
{
public void windowClosing(WindowEvent e)//窗口里面关闭的方法.
{
System.out.println("我关");
System.exit(0);//关闭窗口
}
});
ps:如果想让按钮具有关闭功能.就在按钮事件源上面找监听器.同样匿名内部类覆盖方法.
共性事件:
鼠标和键盘:
既然是共享.所有的组件都具备.
在 Component 中
void addKeyListener(KeyListener l)
添加指定的按键侦听器,以接收发自此组件的按键事件。
例如:
建立文本框只能输入1234567680.
tf.addKeyListener(new KeyAdapter()//tf.代表文本框.确定事件源是文本框
{
public void keyPressed(KeyEvent e) //键盘事件
{
//处理事件
int code=e.getKeyCode();//getKeyCode.键盘事件中KeyEvent的方法,键关联的整数 keyCode
if(!(code<=KeyEvent.VK_9 && code>=KeyEvent.VK_0))//判断是否是大于九还是小于零
{
System.out.println(code+"...是非法的");//如果大于9,小于零提示非法
e.consume();//提示非法之后还能打印.就用到了KeyEvent父类的方法consume() 不会按照默认方式处理此事件。
}
}
});
void addMouseListener(MouseListener l)
添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。
例如:
but.addMouseListener(new MouseAdapter()
{
int count1=0;
public void mouseEntered(MouseEvent e)//鼠标放在按钮上就打印
{
System.out.println(count1++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)//判断次数.getClickCount()在单机的方法里面详情参见API
System.out.println("双击机");
}
});
//-----------------------------------------------------------------------------
示例:
import java.awt.*;//导入包
import java.awt.event.*;
import java.io.*;//涉及到IO技术导入IO包
class MyWindowDemo
{
private Frame f;//建窗体
private TextField tf;//文本框
private Button but;//按钮
private TextArea ta;//文本区域
private Dialog d;//对话框
private Label lab;//标签.作用是封装文字的
private Button okBut;//对话框的按钮
MyWindowDemo()//构造函数,程序一运行就执行init()函数
{
init();
}
public void init()
{
f = new Frame("my window");//建立窗体
f.setBounds(300,100,600,500);//设置窗体的坐标,和距离左上屏幕的坐标
f.setLayout(new FlowLayout());//建立窗体的布局(流式布局)
tf = new TextField(60);//文本框,长度为六十
but = new Button("转到");//建立按钮
ta = new TextArea(25,70);//建立文本区域,竖着为25,横向70
d = new Dialog(f,"提示信息-self",true);//建立对话框,依赖于f窗体,true是对话框出现之后f不可以被操作了
d.setBounds(400,200,240,150);//设置对话的大小
d.setLayout(new FlowLayout());//建立对话框的布局(流式布局)
lab = new Label();//建立标签
okBut = new Button("确定");//建立标签的按钮
d.add(lab);//将标签添加到对话框中
d.add(okBut);//将按钮添加到对话框中
f.add(tf);//将文本框添加到窗体上
f.add(but);//将按钮添加到窗体上
f.add(ta);//将文本区域添加到窗体上
myEvent();//调用事件的函数
f.setVisible(true);//显示窗体
}
private void myEvent()
{
//事件源是对话框的按钮,事件是按钮发生操作时,处理时间是按钮发生操作对话框不显示
okBut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
//事件源是对话框,事件是对话框关闭.处理是点击X对话框不显示
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
//事件源是文本框,事件是键盘,处理是按回车,执行showDir()函数.
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
//判断是否是回车,getKeyCode在键盘事件的KeyAdapter里面
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
//事件源是窗体的按钮,时间是发生操作,处理时执行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);//用IO的File类,来判断路径
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);//并且提示,显示对话框
}
}
public static void main(String[] args)
{
new MyWindowDemo();
}
}
结论:
1.如果关闭窗口的做动作.就在窗口中找监听器,如果找不到就找父类.
2.监听器接收的是一个接口类型的参数.很多方法要要全覆盖,java为了方便
就建立类实现接口,一般名字都叫做XXXAdpter.
3.事件监听的类等都在包中.所以一般要导入import java.awt.event.*;和
import java.awt.*;两个包
//-----------------------------------------------------------------------------
GUI(菜单)
MenuComponent
|--MenuBar 类 java.awt包中
MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。
构造方法摘要
MenuBar() : 创建新的菜单栏。
方法:
Menu add(Menu m) : 将指定的菜单添加到菜单栏。
MenuComponent
|--Menu 类 java.awt包中.下拉式菜单组件。
构造方法摘要
Menu(String label) : 构造具有指定标签的新菜单。
方法:
MenuItem add(MenuItem mi) : 将指定的菜单项添加到此菜单。
MenuComponent
|--MenuItem 类 java.awt包中.也就是子条目
构造方法摘要
MenuItem(String label) : 构造具有指定的标签且没有键盘快捷方式的新菜单项。
方法:
void | addActionListener(ActionListener l)
添加指定的动作侦听器,以从此菜单项接收动作事件。
思路:
菜单条
|--子条目
|--子菜单(也是菜单)
|字菜单++
|子条目
//-----------------------------------------------------------------------------
文件的保存和打开
Component
|--Container
|--Window
|--Dialog
|--FileDialog
FileDialog 类显示一个对话框窗口,用户可以从中选择文件。
由于它是一个模式对话框,当应用程序调用其 show 方法来显示对话框时,它将阻塞其余应用程序,直到用户选择一个文件。
构造方法:
FileDialog(Frame parent, String title, int mode)
创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
static int LOAD
此常量值指示文件对话框窗口的作用是查找要读取的文件。
static int SAVE
此常量值指示文件对话框窗口的作用是查找要写入的文件。 .
方法:
String | getDirectory()
获取此文件对话框的目录。
String | getFile()
获取此文件对话框的选定文件。
示例:
/*
文件的保存和打开
*/
import java.awt.*;//导入包
import java.awt.event.*;
import java.io.*;
public class MyMenuTest
{
//建立设为私有
private Frame f;//窗体
private MenuBar bar;//菜单栏
private TextArea ta;//文本区域
private Menu fileMenu;//菜单
private MenuItem openItem,saveItem,closeItem;//字条目
private FileDialog openDia,saveDia;//文件打开和关闭
private File file;
MyMenuTest()//构造函数.初始化就执行init函数
{
init();
}
public void init()
{
f = new Frame("百鑫制作");//建立窗体
f.setBounds(300,100,650,600);设置窗体的坐标,和距离左上屏幕的坐标
bar = new MenuBar();//建立菜单栏
ta = new TextArea();//建立文本区域
fileMenu = new Menu("文件");//建立菜单
openItem = new MenuItem("打开");//子条目
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
fileMenu.add(openItem);//将条目添加到菜单中
fileMenu.add(saveItem);
fileMenu.add(closeItem);
bar.add(fileMenu);//将菜单添加到菜单栏文件中
f.setMenuBar(bar);//将菜单栏和窗体相关联
openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);//创建打开,LOAD代表打开
saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);//SAVE代码保存
f.add(ta);//将文本区域添加到窗体中
myEvent();
f.setVisible(true);
}
private void myEvent()
{
//事件源是子条目保存,事件是发生操作,处理是保存.
saveItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
BufferedWriter bufw =null;
if(file==null)
{
//判断file是否为空,如果是空的话提示对话框保存并,
saveDia.setVisible(true);
//获取目录和文件
String dirPath = saveDia.getDirectory();
String fileName = saveDia.getFile();
//点击对话框取消的时候,会发生异常,进行判断
//目录或者文件是空的话就返回
if(dirPath==null || fileName==null)
return ;
//创建文件.获取文件目录和文件的抽象信息
file = new File(dirPath,fileName);
}
try
{
//建立字输出符流容器.
bufw= new BufferedWriter(new FileWriter(file));
String text = ta.getText();//调用TextArea父类的getText()方法,获取文本组件表示的文本
bufw.write(text);//输出.
}
catch (IOException ex)
{
throw new RuntimeException("保存错误啦");
}
finally
{
try
{
if(bufw!=null)
bufw.close();//关闭流
}
catch (IOException ex)
{
throw new RuntimeException("字符输出流关闭失败");
}
}
}
});
//事件源是openItem打开.事件是发生操作时.处理时保存
openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
BufferedReader bufr =null;
//提示对话框打开,获取路径和文件
openDia.setVisible(true);
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();
//[判断是路径和文件否为空
if(dirPath==null || fileName==null)
return ;
//清空文本区域
ta.setText("");
//创建文件.获取文件目录和文件的抽象信息
file = new File(dirPath,fileName);
try
{
//建立字输出符流容器.
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("读取失败");
}
finally
{
try
{
if(bufr!=null)
bufr.close();//关闭流
}
catch (IOException ex)
{
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();
}
}
//-----------------------------------------------------------------------------
Jar包:
Javac –d –cvfmy.jar
自定义jar包中,添加属性,自动执行默认class文件。
如建立1.txt,内容为:
Main-Class: mymenu.MyMenuTest (分号后面有个空格,最后还要有个回车)
Javac –d –cvfm1.txt mymenu