GUI:图形用户接口
JAVA为GUI提供的对象都在java.Awt和javax.Swing两个包里。
java.Awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。
javax.Swing:在AWT的基础上,建立的一套图形界面系统。其中提供了很多的组件,完全由java实现。增强了移植性,属轻量级控件。
继承关系。
GUI布局
创建图形化界面的步骤:
1.创建Frame窗体
2.对窗体进行基本设置(大小,位置,颜色)
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.通过setVisible(true)让窗体可见。
Frame示例:
import java.awt.*;
class FrameDemo {
public static void main(String[]args)
{
Frame f=new Frame("my awt");
f.setSize(500,400);//设置窗口大小 (长,宽)
f.setLocation(400,300); 设置窗口位置 (距离左上角的x,距离左上角的y)
Button b=new Button("按钮");
f.add(b);
f.setVisible(true);//设置窗体可见
}
}
事件监听机制:
事件:一个状态的改变,或者一个活动的发生。例如单击。
事件源:能够产生事件的对象,例如文本框,按钮。
事件监听器:用来监听事件源。
1.将监听器注册到事件源
2.事件源上有事件发生。
3.产生事件对象传给监听器。
4.监听器用定义好的方法去处理。
窗体事件
//addWindowListener(WindowListener l) 方法可以添加窗体监听器。
//方法接受的是一个接口,如果想要实现这个接口,则需要覆写它的7个方法,太过麻烦
//该接口有个抽象子类WindowAdapter,只需要继承这个子类,然后覆写自己需要用到的方
//法即可
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
public static void main(String[]args)
{
Frame f=new Frame("AWT");
f.setSize(500,400);
f.setLocation(500,400);
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);
}
}
编程:按钮事件
import java.awt.*;
import java.awt.event.*;
class AwtTest
{
private Frame f;
private Button b;
AwtTest()
{
init();
}
public void init()//正式开发时用一个方法进行初始化
{
f=new Frame("Awt");
b=new Button("退出按钮");
f.setBounds(400,300,600,500);
f.setLayout(new FlowLayout());
f.add(b);
events();
f.setVisible(true);
}
public void events()//这个方法里写了所有的事件
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
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();
}
}
编程:鼠标事件:
import java.awt.*;
import java.awt.event.*;
class MouseEventDemo
{
private Frame f;
private Button b;
MouseEventDemo()
{
init();
}
public void init()
{
f=new Frame("Awt");
b=new Button("退出按钮");
f.setBounds(400,300,600,500);
f.setLayout(new FlowLayout());
f.add(b);
events();
f.setVisible(true);
}
public void events()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
b.addMouseListener(new MouseAdapter()//添加鼠标监听器
{
int count=1;
int clickcount=1;
int doubleclick=1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入组件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount()==2)//判断鼠标点击的次数
System.out.println("双击"+doubleclick++);
else
System.out.println("鼠标点击"+clickcount++);
}
}
);
}
public static void main(String[]args)
{
new MouseEventDemo();
}
}
键盘事件
import java.awt.*;
import java.awt.event.*;
class KeyEventDemo
{
private Frame f;
private Button b;
private TextField tf;//文本框
KeyEventDemo()
{
init();
}
public void init()
{
f=new Frame("Awt");
b=new Button("退出按钮");
tf=new TextField(20);
f.setBounds(400,300,600,500);
f.setLayout(new FlowLayout());
f.add(tf);
f.add(b);
events();
f.setVisible(true);
}
public void events()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
b.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.isShiftDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//判断组合键的方法
System.exit(0);
System.out.println(e.getKeyText(e.getKeyCode())+"------"+e.getKeyLocation());
}
}
);
tf.addKeyListener(new KeyAdapter()//文本框添加键盘监听器,只能输入数字,不能输入字母
{
public void keyPressed(KeyEvent e)
{
if (!((e.getKeyCode()>=KeyEvent.VK_0)&&(e.getKeyCode()<=KeyEvent.VK_9)))
{
System.out.println(e.getKeyCode()+"是非法的");
e.consume();//销毁对象。当输入的非数字,则销毁,不出现在文本框中
}
}
}
);
}
public static void main(String[]args)
{
new KeyEventDemo();
}
}
编程:在文本框输入目录,文本区域内显示文件目录的文件夹和文件。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class FileAwtDemo
{
private Frame f;
private Button b;
private TextField tf;
private TextArea ta;
private String s;
private File fl;
private Dialog dl;
private Label l;
private Button okb;
FileAwtDemo()
{
init();
}
public void init()
{
f=new Frame("FileAwt");
b=new Button("转到");
tf=new TextField(20);
ta=new TextArea();
dl=new Dialog(f,true);
l=new Label();
okb=new Button("确定");
f.setBounds(400,300,600,500);
f.setLayout(new FlowLayout());
dl.setBounds(500,400,250,150);
dl.setLayout(new FlowLayout());
dl.add(l);
dl.add(okb);
f.add(tf);
f.add(b);
f.add(ta);
events();
f.setVisible(true);
}
public void events()
{
b.addMouseListener(new MouseAdapter()//按钮事件监听器
{
public void mouseClicked(MouseEvent e)
{
fileToArea();
}
}
);
f.addWindowListener(new WindowAdapter()//窗体的事件监听器
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
tf.addKeyListener(new KeyAdapter()//文本框的监听器
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)//当按回车时和按按钮效果一样
{
fileToArea();
}
}
});
okb.addMouseListener(new MouseAdapter()//对话框的确定按钮事件监听器
{
public void mouseClicked(MouseEvent e)
{
dl.setVisible(false);
}
});
}
public void fileToArea()//遍历文件目录并取出名字
{
s=tf.getText();
fl=new File(s);
if(fl.exists()&&fl.isDirectory())
{
ta.setText(" ");
String [] str=fl.list();
for (int i=0;i<str.length;i++)
{
ta.append(str[i]);
ta.append("\r\n");
}
}
else
{
l.setText("您输入的"+fl+"是无效路径");
dl.setVisible(true);
}
}
public static void main(String[]args)
{
new FileAwtDemo();
}
}
GUI菜单
菜单栏里添加菜单
菜单里添加菜单或者菜单选项
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
private Frame f;
private Menu m,m1;//菜单
private MenuBar mb;//菜单栏
private MenuItem mi;//菜单选项
MyMenuDemo()
{
init();
}
public void init()
{
f=new Frame("my menu");
m=new Menu("文件");
mb=new MenuBar();
mi=new MenuItem("退出");
m1=new Menu("子菜单");
mb.add(m);
m.add(m1);
m.add(mi);
f.setBounds(400,300,600,500);
f.setMenuBar(mb);
f.setVisible(true);
}
public static void main(String[]args)
{
new MyMenuDemo();
}
}
编程:编写一个简单的记事本软件,具有打开文件和保存文件的功能
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuDemo
{
private Frame f;
private Menu filemenu;
private MenuBar mb;
private MenuItem openItem,saveItem,closeItem;//三个菜单选项
private FileDialog opendia,savedia;//两个文件对话框用于打开和保存
private TextArea ta;//文本区域
private File file;
MyMenuDemo()
{
init();
}
public void init()
{
f=new Frame("my menu");
filemenu=new Menu("文件");
mb=new MenuBar();
ta=new TextArea();
openItem=new MenuItem("打开");
saveItem=new MenuItem("保存");
closeItem=new MenuItem("退出");
opendia=new FileDialog(f,"打开文件",FileDialog.LOAD);//LOAD是打开文件模式
savedia=new FileDialog(f,"保存文件",FileDialog.SAVE);//SAVE是保存文件的模式
mb.add(filemenu);
filemenu.add(openItem);
filemenu.add(saveItem);
filemenu.add(closeItem);
f.setBounds(300,100,700,800);
f.setMenuBar(mb);
f.add(ta);
events();
f.setVisible(true);
}
public void events()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
openItem.addActionListener(new ActionListener()//打开文件的事件监听器
{
public void actionPerformed(ActionEvent e)
{
ta.setText("");
opendia.setVisible(true);
file=new File(opendia.getDirectory(),opendia.getFile());//获取文件的路径和名字
try{
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;
while ((line=br.readLine())!=null)
{
ta.append(line+"\r\n");//打印到文本区域中
}
br.close();
}catch(IOException ex)
{
System.out.println("打开失败");
}
}
}
);
saveItem.addActionListener(new ActionListener()//保存按钮的事件监听器
{
public void actionPerformed(ActionEvent e)
{
if (file==null)//判断文件是否存在,不存在就创建,否则不创建
{
savedia.setVisible(true);
file=new File(savedia.getDirectory(),savedia.getFile());
}
try{
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
String text=ta.getText();
bw.write(text);
bw.close();
}catch(IOException ex)
{
System.out.println("保存失败");
}
}
});
closeItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
public static void main(String[]args)
{
new MyMenuDemo();
}
}
让程序变成jar包双击执行
1.先把程序指定一个包,class文件放在包内(javac -d 包存放的目录 源文件名)
2.把包打包成jar包 (jar -cvf jar包名字 包名)
3.这时候程序不能运行,因为生成了很多个class文件,程序不知道哪个是主函数所在的文件。所以需要更改配置信息,设置主函数所在的class文件。方法为:随便创建一个文件,里面输入。Main-Class:(空格)包名.类名(回车)
然后再打包 (jar -cvfm jar包名字.jar 刚才创建的配置文件 包名) 就OK了