一 概述
1.GUI
- Graphical User InterFace (图形用户接口)
- 用图形的方式,来显示计算机操作的界面,这样更方便、更直观。
2、CLI
- Command line User Interface(命令行用户接口)
- 就是常见的Dos命令行操作
- 需要记忆一些常用的命令,操作不直观
3.举例:比如,创建文件夹,或者删除文件夹等
4.Javs为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
5.Awt和Swing
java.Awt:Abstract Window Tookit(抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件
javax.Swing:在AWT的基础上,建立的一套图像界面系统,其中提供了更多的组件,而且完全由于Java实现,增强了移植性,属轻量级控件。
二 GUI布局
1.容器中的组件的排放方式,就是布局。
2.常见的布局管理器:
(1)Flow Layout(流式布局管理器)
- 从左到右的顺序排列
- Panel默认的布局管理器
(2)BorderLayout(边界布局管理器)
- 东、南、西、北、中(上下左右中)
- Frame默认的布局管理器
(3)GridLayout(网格布局管理器)
- 规则的矩阵
(4)CardLayout(卡片布局管理器)
- 选项卡
(5)GridBagLayout(网格包布局管理器)
- 非规则的布局
三 GUI_Frame
创建图形化界面步骤如下:
- 常见frame窗体
- 对窗体进行基本设置(比如大小、位置、布局等等)
- 定义组件
- 将组件通过窗体的add方法添加到窗体中
- 让窗体显示,通过setVisible(true)
示例代码:
import java.awt.*;
public class Demo {
public static void main(String[] args) throws Exception {
// 默认是边界布局
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);
sop("my awt");
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
上面的代码只是弄了个窗体显示,不会有任何反应。
四 事件监听机制
1.Container常用子类:Window Panel(面边,不能单独存在)
2.Window常用子类:Frame Dialog
3.简单的窗体创建过程:
Frame f = new Frame("my window");
f.setLayout(new FlowLayout());
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
f.setVisible(true);
4.事件监听机制组成
- 事件源(组件):就是awt或者swing包中的那些图形界面组件
- 事件(Event):每一个事件源,都有自己的特有的对应事件,和共性事件
- 监听器(Listener):将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中
- 事件处理方式(引发事件后处理方式)
5.组件、Event、Listener在Java中,都已经定义好了,直接获取其对象来用就可以了。我们要做的就是对产生的动作进行处理。
五 窗体事件
要使图形化窗口的按钮有反应,要了解下面这些方法:
void addWindowListener(WindowListener l):添加指定的窗口侦听器,以从此窗口接收窗口事件
1.WindowListener为接口,要想使用,必须先实现方法,很麻烦。他有一个实现类,子类,实现了接口,不过为空方法。
public abstract class WindowAdapter extends Object implements WindowListener, WindowStateListener, WindowFocusListener
接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
2.事件
void windowActivated(WindowEvent e): 激活窗口时调用
void windowClosed(WindowEvent e):当窗口已被关闭时调用
void windowClosing(WindowEvent e): 窗口正处在关闭过程中时调用
void windowDeactivated(WindowEvent e):停用窗口时调用
void windowDeiconified(WindowEvent e):取消图标化窗口时调用
void windowGainedFocus(WindowEvent e)
该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。
void windowIconified(WindowEvent e):图标化窗口时调用
void windowLostFocus(WindowEvent e)
该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。
void windowOpened(WindowEvent e)
已打开窗口时调用。
void windowStateChanged(WindowEvent e)
窗口状态改变时调用。
示例代码:
/*
创建图形化界面
1、常见frame窗体
2、对窗体进行基本设置
比如大小、位置、布局。
3、定义组件
4、将组件通过窗体的add方法添加到窗体中
5、让窗体显示,通过setvisible(true)
*/
import java.awt.*;
import java.awt.event.*;
public class Demo{
public static void main(String[] args) throws Exception{
//默认是边界布局
Frame f = new Frame("my awt");
//窗口的长宽
f.setSize(500,400);
//窗口距离显示器边距的距离
f.setLocation(300,200);
//默认是边界布局
f.setLayout(new FlowLayout());
//添加指定的窗口侦听器,以从此窗口接收窗口事件。
f.addWindowListener(new MyWin());
Button b = new Button("我是一个按钮");
f.add(b);
//设置可见
f.setVisible(true);
sop("my awt");
}
public static void sop(Object obj){
System.out.println(obj);
}
}
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
//并覆盖了其中的所有方法,那么我只要继承自WindowAdapter覆盖我需要的方法即可。
class MyWin extends WindowAdapter{
public void windowClosing(WindowEvent e){
Demo.sop("将要关闭");
System.exit(0);
}
public void windowOpened(WindowEvent e){
Demo.sop("我被打开");
}
public void windowActivated(WindowEvent e){
Demo.sop("激活");
}
}
六 Action事件
事件监听机制
- 确定事件源(容器或组件)
- 通过事件源对象的addXXXLIstener()方法将监听器注册到该事件源上
- 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdaper的子类对象
- 一般用匿名内部类来表示
- 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收
- 事件出发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponet()获取)
import java.awt.*;
import java.awt.event.*;
public class Demo{
//定义图形中所需的组件的引用
private Frame f;
private Button but;
Demo(){
init();
}
public static void main(String[] args) throws Exception{
new Demo();
}
public void init(){
f = new Frame("my frame");
//对frame进行基本设置
//f.setSize(500,400);
//void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。
f.setBounds(300,400,600,500);
f.setLayout(new FlowLayout());
but = new Button("退出");
//将组件添加到frame中
f.add(but);
//加载一下窗体上的事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
/*让按钮具备退出程序的功能
按钮就是事件源
那么选择哪个监听器呢?
通过关闭窗体示例了解到,想要知道那个组件具备什么样的特有监听器。
需要产看该组件对象的功能。
通过查阅button的描述,发现按钮支持一个特有监听,addActionListener
*/
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("按钮退出");
System.exit(0);
}
});
}
public static void sop(Object obj){
System.out.println(obj);
}
}
七 鼠标事件
import java.awt.*;
import java.awt.event.*;
public class Demo {
// 定义图形中所需的组件的引用
private Frame f;
private Button but;
Demo() {
init();
}
public static void main(String[] args) throws Exception {
new Demo();
}
public void init() {
f = new Frame("my frame");
// 对frame进行基本设置
// f.setSize(500,400);
// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。
f.setBounds(300, 400, 600, 500);
f.setLayout(new FlowLayout());
but = new Button("退出");
// 将组件添加到frame中
f.add(but);
// 加载一下窗体上的事件
myEvent();
// 显示窗体
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
/*
* 让按钮具备退出程序的功能 按钮就是事件源 那么选择哪个监听器呢? 通过关闭窗体示例了解到,想要知道那个组件具备什么样的特有监听器。
* 需要产看该组件对象的功能。 通过查阅button的描述,发现按钮支持一个特有监听,addActionListener
*/
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sop("鼠标活动");
}
});
but.addMouseListener(new MouseAdapter() {
private int count = 1;
private int clickCount = 1;
public void mouseEntered(MouseEvent e) {
sop("鼠标进入事件" + (count++));
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
sop("鼠标双击事件");
} else {
sop("鼠标点击事件" + (clickCount++));
}
}
});
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
八 键盘事件
import java.awt.*;
import java.awt.event.*;
public class Demo {
// 定义图形中所需的组件的引用
private Frame f;
private Button but;
private TextField tf;
Demo() {
init();
}
public static void main(String[] args) throws Exception {
new Demo();
}
public void init() {
f = new Frame("my frame");
// 对frame进行基本设置
// f.setSize(500,400);
// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。
f.setBounds(300, 400, 600, 500);
f.setLayout(new FlowLayout());
but = new Button("退出");
// 文本框
tf = new TextField(20);
// 将组件添加到frame中
f.add(tf);
f.add(but);
// 加载一下窗体上的事件
myEvent();
// 显示窗体
f.setVisible(true);
}
private void myEvent() {
but.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
System.exit(0);
}
if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {
sop("ctrl + enter");
}
sop(KeyEvent.getKeyText(e.getKeyChar()) + "...."
+ e.getKeyCode());
}
});
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {
sop(code + "是非法的");
// 屏蔽键
e.consume();
}
}
});
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
九 练习:列出指定目录内容
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class Demo {
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
Demo() {
init();
}
public static void main(String[] args) throws Exception {
new Demo();
}
public void init() {
f = new Frame("my window");
f.setLayout(new FlowLayout());
f.setBounds(300, 100, 600, 500);
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25, 70);
f.add(tf);
f.add(but);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowCloseing(WindowEvent e) {
System.exit(0);
}
});
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String dirPath = tf.getText();
tf.setText("");
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");
}
}
}
});
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
十 对话框Dialog
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class Demo {
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog dl;
private Label lab;
private Dialog d;
private Button okBut;
Demo() {
init();
}
public static void main(String[] args) throws Exception {
new Demo();
}
public void init() {
f = new Frame("my window");
f.setLayout(new FlowLayout());
f.setBounds(300, 100, 600, 500);
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25, 70);
f.add(tf);
f.add(but);
f.add(ta);
lab = new Label();
d = new Dialog(f, "提示信息-self", true);
okBut = new Button("确定");
d.setBounds(400, 200, 240, 150);
d.setLayout(new FlowLayout());
d.add(lab);
d.add(okBut);
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showDir();
}
});
d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
d.setVisible(false);
}
});
okBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
showDir();
}
}
});
}
public void showDir() {
String dirPath = tf.getText();
tf.setText("");
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);
}
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
十一 菜单
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class Demo {
private Frame f;
private MenuBar mb;
private Menu m, subMenu;
private MenuItem closeItem, subItem;
Demo() {
init();
}
public static void main(String[] args) throws Exception {
new Demo();
}
public void init() {
f = new Frame("my window");
f.setLayout(new FlowLayout());
f.setBounds(300, 100, 500, 600);
mb = new MenuBar();
subMenu = new Menu("子菜单");
m = new Menu("文件");
closeItem = new MenuItem("退出");
subItem = new MenuItem("子条目");
subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
myEvent();
f.setMenuBar(mb);
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
closeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
十二、十三 练习-打开、保存文件
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class Demo{
private Frame f;
private TextArea ta;
private MenuBar bar;
private Menu fileMenu;
private MenuItem openItem,saveItem,closeItem;
private FileDialog openDia,saveDia;
private File file;
Demo(){
init();
}
public static void main(String[] args) throws Exception{
new Demo();
}
public void init(){
f = new Frame("my window");
//f.setLayout(new FlowLayout());
f.setBounds(300,100,500,600);
ta = new TextArea();
bar = new MenuBar();
fileMenu = new Menu("文件");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
bar.add(fileMenu);
myEvent();
f.add(ta);
f.setMenuBar(bar);
openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);
saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
openItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
openDia.setVisible(true);
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();
if(dirPath==null||fileName==null)
return;
ta.setText("");
openFile(dirPath,fileName);
f.setTitle("文件:"+dirPath+fileName);
}
});
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;
saveFile(dirPath,fileName);
f.setTitle("文件:"+dirPath+fileName);
}else{
saveFile();
}
}
});
closeItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});
}
public void openFile(String dirPath,String fileName){
file = new File(dirPath,fileName);
try{
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line = null;
while((line = bufr.readLine())!=null){
ta.append(line+"\r\n");
}
}catch(IOException ioe){
throw new RuntimeException("读取失败");
}
}
public void saveFile(){
saveFile(null,null);
}
public void saveFile(String dirPath,String fileName){
if(file==null){
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("读取失败");
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
十四 jar包双击执行
jar -cvfm my.jar 1.txt mymenu
Main-class: mymenu.Demo //要有空格和回车