------- android培训、java培训、iOS培训、.Net培训期待与您交流! ----------
GUI:Graphical User Interface(图形用户接口)
用图形的方式来显示计算机操作的界面,这样更方便更直观
CLI:Command Line Interface(命令行用户接口)
就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观
JAVA为GUI提供的对象都存在java.Awt和javax.Swing两个包中
GUI布局:容器中的组件的排放方式
常见的布局管理器:
FlowLayout(流式布局管理器):从左到右的顺序排放,Panel默认的布局管理器
BorderLayout(边界布局管理器):东、南、西、北、中,Frame默认的布局管理器
GridLayout(网格布局管理器):规则的矩阵
CardLayout(卡片布局管理器):选项卡
GridBagLayout(网格包布局管理器):非规则的矩阵
创建图形化界面
1.创建Frame窗体
2.对窗体进行基本设置,比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示,通过setVisible(true)
import java.awt.*;
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("my awt");//构造一个最初不可见的,具有指定标题(my awt)的Frame对象
f.setSize(500,400);//设置长和宽,500长,400宽
f.setLocation(300,200);//设置Frame对象(窗口)弹出时所在位置
f.setLayout(new FlowLayout());//设置按钮的布局(流式布局)
Button b=new Button("我是一个按钮");//设置按钮
f.add(b);//把按钮添加到Frame对象中
f.setVisible(true);//根据参数值显示或隐藏此组件,true代表可见
}
}
事件监听机制组成:事件源(组件)、事件(Event)、监听器(Listener)、事件处理(引发事件后处理方式)
事件监听机制流程图
事件监听机制的特点
事件源:就是awt包或者swing包中的那些图形界面组件
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中
以上三者,在java中都已经定义好了,直接获取其对象来用就可以了。
我们要做的事情是,就是对产生的动作进行处理
窗体事件:
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
public static void main(String[] args)
{
Frame f=new Frame("my awt");//Frame窗体为事件源
f.setSize(500,400);
f.setLocation(300,200);
f.setLayout(new FlowLayout());
Button b=new Button("我是一个按钮");
f.add(b);
//f.addWindowListener(new MyWin());//添加窗体监听器
//可以写成匿名内部类
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.out.println("我关");
System.exit(0);
}
public void windowActivated(WindowEvent e)//窗体被激活(置于前端)
{
System.out.println("我活了");
}
public void windowOpened(WindowEvent e)//窗体被打开
{
System.out.println("我被打开了");
}
});
f.setVisible(true);
}
}
//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
//并覆盖了其中的所有方法。那么我只要继承自Windowadapter覆盖我需要的方法即可。
class MyWin extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
//System.out.println("window closing---"+e.toString());
System.exit(0);//事件处理方式
}
}
Action事件:
import java.awt.*;
import java.awt.event.*;
//把事件和图形化界面组件分离开来
class FrameDemo
{
//定义该图形中所需的组件的引用
private Frame f;
private Button but;
FrameDemo()
{
init();
}
public void init()//对图形化界面初始化
{
f=new Frame("my frame");
//对Frame进行基本设置
f.setBounds(300,100,600,500);//前两个为坐标(距左边、距上边),后两个为宽高,融合了setSize()和setLocation()
f.setLayout(new FlowLayout());
but=new Button("my 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() //活动监听没有Adapter
{
public void actionPerformed(ActionEvent e)
{
System.out.println("退出,按钮干的");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new FrameDemo();
}
}
鼠标事件:
but.addMouseListener(new MouseAdapter() //按钮鼠标监听器
{
private int count=1;
private int clickCount=1;
public void mouseEntered(MouseEvent e)//------------
{
System.out.println("鼠标进入到该组件"+count++);
}
public void mouseClicked(MouseEvent e)//----------------
{
//System.out.println("点击动作"+clickCount++);
//鼠标双击动作
if(e.getClickCount()==2)//点击次数可自己设置
System.out.println("双击动作"+clickCount++);
}
});
键盘事件:
but.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
//System.out.println(e.getKeyChar()+"..."+e.getKeyCode());//获取键盘字符和对应的ASCII码值
//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"..."+e.getKeyCode());//getKeyText()返回描述keyCode的String
//if(e.getKeyCode()==27)//ESC对应的Code为27
//记不住数字,如下表示也可以
//if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
// System.exit(0);
//组合键
if(e.isControlDown()&& e.getKeyCode()==KeyEvent.VK_ENTER)//e.isControlDown()判断ctrl键是否按下
System.out.println("ctrl+enter is run");
}
});
对话框Dialog:
import java.awt.*;
import java.awt.event.*;
import java.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();
}
public void init()
{
f=new Frame("my window");//my window 显示在Frame上的文字
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());//流式布局
tf=new TextField(60);//30列
but=new Button("转到");//转到 显示在按钮上的文字
ta=new TextArea(25,70);//文本区域,15行,40列
d=new Dialog(f,"提示信息-self",true);//f:对话框所有者(Frame,操作Frame弹出的对话框),标题和模式
//模式为true表示不操作弹出的对话框就不能操作别的
d.setBounds(400,200,240,150);//设置对话框
d.setLayout(new FlowLayout());//设置布局
lab=new Label();
okBut=new Button("确定");
d.add(lab);//d本身是一个窗体
d.add(okBut);
f.add(tf);//流式布局,注意添加顺序,先添加的在前面,后添加的往后填
f.add(but);
f.add(ta);
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);//关闭对话框
//System.exit(0);//此为整个Frame都退出,不合适
}
});
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();
}
});
}
private void showDir()
{
/*
String text=tf.getText();//获取文本
ta.setText(text);//把获取到的文本(text)填充到文本区域中
tf.setText("");
//System.out.println(text);
*/
String dirPath=tf.getText();
File dir=new File(dirPath);//封装成文件对象才能list
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();
}
}
菜单:
import java.awt.*;
import java.awt.event.*;
//条目MenuItem没有右箭头的,菜单Menu有
class MyMenuDemo
{
private Frame f;
private MenuBar mb;//菜单条
private Menu m,submenu; //菜单
private MenuItem closeItem,subItem;
MyMenuDemo()
{
init();
}
public void init()
{
f=new Frame("my window");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
mb=new MenuBar();//菜单条
m=new Menu("文件");//文件为菜单名
submenu=new Menu("子菜单");
closeItem=new MenuItem("退出");//菜单项
subItem=new MenuItem("子条目");
//菜单条里可以添加菜单,菜单里可以添加菜单项
submenu.add(subItem);
m.add(submenu);
//m.add(subItem);//添加的顺序与排放的顺序一致
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);//在Frame中设置菜单条
myEvent();
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 main(String[] args)
{
new MyMenuDemo();
}
}
如何制作可以双击执行的jar包呢?
1、将多个类封装到了一个包(package)中
2、定义一个jar包的配置信息。
定义一个文件a.txt 。文件内容内容为:Main-Class:(空格)包名.类名(回车)
3、打jar包。
jar -cvfm my.jar a.txt 包名
4、通过winrar程序进行验证,查看该jar的配置文件中是否有自定义的配置信息
5、通过工具--文件夹选项--文件类型--jar类型文件,通过高级,定义该jar类型文件的打开动作的关联程序。
jdk\bin\javaw.exe -jar
6、双击