第一讲.GUI概述
- GUI即Graphical User Interface(图形用户接口),方便直观。CLI即Command Line User Interface(命令行用户接口),像DOS命令行,需要记忆常用命令,不直观。
- Java为GUI提供的对象存储在:java.awt和javax.swing两个包中。
- awt:Abstact Window ToolKit(抽象窗口宫工具包),调用本地系统实现功能。重量级控件。
- swing:基于awt,提供更多组件,完全由Java编写。增强可移植性,轻量级控件。
- Java组件对象的继承关系图,Container可以添加组件
第二讲. 基本设置:Frame,Button,TextField,TextArea等基本组件的初始设置
- java中的布局分为:
FlowLayout:流式布局 | 从左到右顺序排列,panel默认布局 |
BorderLayout:边界布局 | 可指定“东南西北中”,填充式,frame默认布局 |
GridLayout: 网格布局 | 规则的矩阵 |
CardLayout: 卡片式布局 | 选项卡 |
GridBadLayout:网络包式布局 | 非规则的矩阵 |
//基本设置
frame = new Frame("My frame!");//默认是边界式布局
//frame.setSize(500,100);//设置大小,横坐标,纵坐标
//frame.setLocation(300,100);//顶点据边框的距离,左边距,上边距。
frame.setBounds(300,100,500,100);
frame.setLayout(new FlowLayout());//流式布局
//添加组件
button = new Button("I'm a button!");
tf = new TextField(20);
frame.add(button);
frame.add(tf);
3.通过setVisible(true)的方法显示Window类型的组件。除以上这些,其他具体设定只能详见JDK了。。。
第三讲.事件响应机制
- 事件响应机制如下图所示。Java的处理方式为:事件源即awt和swing包中定义的图形界面组件(Component);每一个事件源都有自己所特有的对应事件(XXXEvent)和共性事件;将可以触发某一事件的动作(不只一个动作)封装到监视器(XXXListener)中。
- 以下代码为一个实例:
- 通过创建一个实现Listener接口或者Adapter抽象类的匿名内部类方式,实现事件处理,简单方便。算得上是匿名内部类一大应用。
- Listener为接口,其中声明了多种事件,为方便起见,Java提供了适配器类Adapter实现Listener,但却只为其中方法做了空实现(这也体现了Java的严谨或者或死板吧。。。)。Adapter也因此成为了虽然所有方法都是实的(空实现)却被声明为抽象类(abstract)的奇葩存在。
- 可以通过对应的Event类获得状态信息,如可以通过KeyEvent过得按的是哪个键(getKeyCode()方法),或者是通过MouseEvent获得是双击(getClickCount(方法))或者是单击等等。
- 搞清楚规律后记忆起来还是挺容易的。。。
private void myEvent(){
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
//还有windowOpened及windowActived 等事件
});
//让按钮具备关闭程序的功能
//button没有适配器(适配器是为了方便创建事件对象)
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("action performed");
}
});
//鼠标事件
button.addMouseListener(new MouseAdapter(){
private int count = 1;
public void mouseEntered(MouseEvent e){
System.out.println("Mouse Entrered "+(count++));
}
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2)//通过Event对象,判断双击
System.out.println("Double Clicked"+(count++));
}
});
//键盘事件
button.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"..."+e.getKeyCode());
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.exit(0);
}
});
总结. 基本设计机构
import java.awt.*;
import java.awt.event.*;
class Demo
{
//声明组件
private Frame frame;...
Demo(){
init();
}
//初始化
public void init(){
//基本设置
frame.setBounds();
frame.setLayout();...
//添加组件
frame.add(button);...
//加载事件
myEvent();
//显示窗体
frame.setVisible(true);//设置为可见
}
//事件和图形化组件分离
private void myEvent(){
//事件
button.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//事件处理
}
});
...
}
public static void main(String[] args)
{
/***只要开启图形化界面,就会开启一个新线程**/
new Demo();
}
}
练习,笔记本的文件打开和保存功能:
package mymenu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuDemo
{
private Frame f;
private MenuBar mb;
private Menu m;
private MenuItem openitem,saveitem,closeitem;//菜单
private TextArea ta;
private FileDialog openDia,saveDia;//打开对话框,保存对话框
MyMenuDemo(){
init();
}
private void init(){
//基本设置
f = new Frame("Test");
f.setBounds(300,100,500,400);
//添加组件
mb = new MenuBar();
m = new Menu("文件");
closeitem = new MenuItem("退出");
saveitem = new MenuItem("保存");
openitem = new MenuItem("打开");
f.setMenuBar(mb);
mb.add(m);
m.add(openitem);
m.add(saveitem);
m.add(closeitem);
ta = new TextArea();
f.add(ta);
openDia = new FileDialog(f,"open",FileDialog.LOAD);//Java中自带的文件对话框
saveDia = new FileDialog(f,"save",FileDialog.SAVE);//new对话框通常要指定一个附属的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);
}
});//菜单中的退出
openitem.addActionListener(new ActionListener(){//用这个ActionListener更泛用一些
public void actionPerformed(ActionEvent e){//用KeyListener或MouseListener更具体一些
openDia.setVisible(true);
String dir = openDia.getDirectory();
String fileName = openDia.getFile();
if (dir == null||fileName == null)//文件对话框中点取消按钮的情况
return;
File file = new File(dir,fileName);
ta.setText("");
try
{
BufferedReader in = new BufferedReader(new FileReader(file));
String line;
while((line=in.readLine())!=null){
ta.append(line);
ta.append("\r\n");
}
in.close();//这里用不用finally语句
}
catch (IOException ex)
{
throw new RuntimeException("Open Failed!");
}
}
});//打开一个文件,将内容显示到文本区域ta中。
saveitem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
saveDia.setVisible(true);
String dir = saveDia.getDirectory();
String fileName = saveDia.getFile();
if (dir == null||fileName == null)//如果点取消的话
return;
File file = new File(dir,fileName);
byte[] data = ta.getText().getBytes();
byte[] buff = new byte[1024];int len;
ByteArrayInputStream in = new ByteArrayInputStream(data);//用了一个数组流
try
{
System.out.println(file);
OutputStream out = new FileOutputStream(file);
while((len = in.read(buff))!=-1)
out.write(buff,0,len);
out.close();
}
catch (IOException ex)
{
throw new RuntimeException("Save Failed!");
}
}
});//将文本区域ta中的数据保存到一个文件中
}
public static void main(String[] args)
{
new MyMenuDemo();
}
}
第四讲. .jar可执行文件的生成
- 先声明一个包。拿上面的简单记事本为例子:开头声明了 mymenu包
- 利用javac -d去指定一个路径存放编译出的包,例如:java -d D:\ mymenu
- 利用jar -cvfm 生成.jar可执行程序,例如:jar -cvfm my.jar 1.txt mymenu
- 1.txt 存储Main-Class: mymenu.MyMenuDemo回车。这是一个配置信息,表示主程序的位置。注意最后要有回车,键值之间有个空格。
- 这时在d盘下生成一个my.jar程序,双击即可运行~