第七讲
AWT && Swing
知识点:
GUI
什么是
GUI
:图形界面的编程,就是做
C/S
环境下的编程,什么是
C/S
呢?客户端需要安装软件,而且当软件升级的时候,也需要修改客户端
布局管理器:
就是用于安排组件在容器中的位置的类
/**
*
知识点:
* GUI(Frame,Button)
*
程序目标:
*
创建个窗体,里面显示两个按纽
*/
package MY.module08.GUI;
import java.awt.*;
public class FirstAwt {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("frame");
Button b1=new Button("Hello world");
Button b2=new Button("welcome");
f.add(b1);
f.add(b2);
f.setSize(300,300);
f.setVisible(true);
}
}
上面这个程序我们只能看到一个按纽,这是因为布局管理器设置的问题,我们可以通过更改布局管理器解决这个问题
/**
*
知识点:
*
东西南北中布局
*
程序目标:
*
测试东西南北中布局
*/
package MY.module08.GUI;
import java.awt.*;
public class TestBorderLayout {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("windows");
Button b1=new Button("north");
Button b2=new Button("south");
Button b3=new Button("west");
Button b4=new Button("east");
Button b5=new Button("center");
f.setLayout(new BorderLayout());
f.add(b1,BorderLayout.NORTH);
f.add(b2,BorderLayout.SOUTH);
f.add(b3,BorderLayout.WEST);
f.add(b4,BorderLayout.EAST);
f.add(b5,BorderLayout.CENTER);
f.setSize(300,300);
f.setVisible(true);
}
}
/**
*
知识点:
*
流式布局
*
程序目标:
*
测试流式布局管理器
*/
package MY.module08.GUI;
import java.awt.*;
public class TestFlowLayout {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame();
Button b1=new Button("b1");
Button b2=new Button("b2");
Button b3=new Button("b3");
Button b4=new Button("b4");
Button b5=new Button("b5");
f.setLayout(new FlowLayout());
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.setSize(300,300);
f.setVisible(true);
}
}
/**
*
知识点:
*
网格布局
*
程序目标:
*
测试网格布局
*/
package MY.module08.GUI;
import java.awt.*;
public class TestGridLayout {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("window");
Button b1=new Button("1");
Button b2=new Button("2");
Button b3=new Button("3");
Button b4=new Button("4");
Button b5=new Button("5");
Button b6=new Button("6");
GridLayout g=new GridLayout(3,2);
f.setLayout(g);
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.setSize(300,300);
f.setVisible(true);
}
}
package module08.teacher.gui;
import java.awt.*;
public class TestPanel {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f = new Frame("panel");
Button b1 = new Button("b1");
Button b2 = new Button("b2");
//
分组
Panel p1 = new Panel();
GridLayout layout_p1 = new GridLayout(1,2);
p1.setLayout(layout_p1);
p1.add(b1);
p1.add(b2);
Button b3 = new Button("b3");
Button b4 = new Button("b4");
Button b5 = new Button("b5");
Panel p2 = new Panel();
GridLayout layout_p2 = new GridLayout(1,3);
p2.setLayout(layout_p2);
p2.add(b3);
p2.add(b4);
p2.add(b5);
Button b6 = new Button("b6");
Panel p3 = new Panel();
GridLayout layout_p3 = new GridLayout();
p3.setLayout(layout_p3);
p3.add(b6);
GridLayout layout = new GridLayout(3,1);
f.setLayout(layout);
f.add(p1);
f.add(p3);
f.add(p2);
f.setSize(400,400);
f.setVisible(true);
}
}
/**
*
知识点:
* java GUI
组件
:TextField Label TextArea List Choice CheckboxGroup
*
程序目标:
*
测试
GUI
组件
*/
package MY.module08.GUI;
import java.awt.*;
public class TestGUI {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("GUI");
f.setLayout(new FlowLayout());
Label l=new Label("input username:");
f.add(l);
TextField tf=new TextField(10);
f.add(tf);
TextArea ta=new TextArea("please input resume:",5,10);
f.add(ta);
List list=new List();
list.add("ljaksf");
list.add("china");
list.add("japenese");
f.add(list);
Choice c=new Choice();
c.add("1");
c.add("2");
c.add("3");
f.add(c);
Checkbox cb=new Checkbox("asp");
Checkbox cb2=new Checkbox("java");
f.add(cb);
f.add(cb2);
CheckboxGroup cbg=new CheckboxGroup();
Checkbox cb3=new Checkbox("nan",cbg,true);
Checkbox cb4=new Checkbox("nv",cbg,false);
f.add(cb3);
f.add(cb4);
f.setSize(300,300);
f.setVisible(true);
}
}
/**
*
知识点:
* Panel
,
BorderLayout,GridLayout
*
程序目标:
*
测试
Panel
*/
package MY.module08.GUI;
import java.awt.*;;
public class TestPanel2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("Panel");
f.setLayout(new BorderLayout());
Button b1=new Button("b1");
Button b2=new Button("b2");
Button b3=new Button("b3");
Button b4=new Button("b4");
Button b5=new Button("b5");
Button b6=new Button("b6");
Panel p1=new Panel();
Panel p2=new Panel();
Panel p3=new Panel();
p1.add(b1);
p1.add(b2);
p2.setLayout(new GridLayout(2,1,10,10));
p2.add(b3);
p2.add(b4);
p3.setLayout(new GridLayout(1,2));
p3.add(b5);
p3.add(b6);
f.setLayout(new BorderLayout());
f.add(p1,BorderLayout.NORTH);
f.add(p2,BorderLayout.WEST);
f.add(p3,BorderLayout.SOUTH);
f.setSize(300,300);
f.setVisible(true);
}
}
知识点:观察者模式
什么是观察者模式?
比如说一个案子:
911
事件(行为)
-------------
这个事件是谁触发的(嫌疑人(有可能触发这个事件的人))
拉登,张三,李四
我们需要调查嫌疑人,最后捕获他们
步骤:
1
为可能发生事件的事件源注册监听器
2
当发生事件的后,监听器判断是谁触发了这个事件
3
找到触发这个事件源后,进行事件的处理
进行事件的处理,需要导入:
java.awt.event
包
重要的方法:
getsource()
得到谁触发的事件对象,得到抛出事件的对象,也就是组件返回类型为
Object
模拟事件处理模式:
/**
* java
文件说明:
* BoyA.java:
男孩
A
类,实现了
Observer
接口,有一个方法行为,当喜欢的女孩
*
伤心的时候,会调用这个方法来安慰女孩
* BoyB.java:
男孩
B
类,实现了
Observer
接口,有一个方法行为,当喜欢的女孩
*
伤心的时候,会调用这个方法来安慰女孩
* Observer.java:
一个有安慰女孩方法的接口
* Girl.java:
有个描述心情的方法,有个可以加入朋友的方法,当伤心的时候
*
会找自己的朋友,让朋友来安慰她
*/
package MY.module08.observer;
import java.util.*;
public class Girl {
private String zhuangtai;
private Vector friends=new Vector();
public Girl(String zhuangtai) {
super();
// TODO Auto-generated constructor stub
this.zhuangtai = zhuangtai;
}
public void register(Observer obj){
friends.add(obj);
}
public void remove(Observer obj){
friends.remove(obj);
}
public void call(){
if(zhuangtai.equals("bu gao xing")){
Iterator it=friends.iterator();
while(it.hasNext()){
Observer obj=(Observer)it.next();
obj.update();
}
}
}
public static void main(String[] args){
Girl girl=new Girl("bu gao xing");
BoyA boya=new BoyA();
BoyB boyb=new BoyB();
girl.register(boya);
girl.register(boyb);
girl.remove(boya);
girl.call();
}
}
package MY.module08.observer;
public interface Observer {
void update();
}
package MY.module08.observer;
public class BoyA implements Observer{
public void update() {
// TODO Auto-generated method stub
System.out.println("BoyA's");
}
}
package MY.module08.observer;
public class BoyB implements Observer{
public void update() {
// TODO Auto-generated method stub
System.out.println("BoyB's");
}
}
事件处理:
/**
*
知识点:
*
事件处理:按纽点击事件
*
程序目标:
*
当点击一个按纽的时候,输出一句
hello world
*/
package MY.module08.event;
import java.awt.*;
import java.awt.event.*;
public class TestAction {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("window");
Button b=new Button("
显示
");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("hello world");
}
});
f.setLayout(new FlowLayout());
f.add(b);
f.setSize(300,300);
f.setVisible(true);
}
}
/**
*
知识点:
*
菜单,点击退出事件
*
程序目标:
*
创建一个菜单,一个是文件菜单,一个是编辑菜单,每个菜单项设置
*
几个子菜单项,其中有一个能点击后退出
*/
package MY.module08.event;
import java.awt.*;
import java.awt.event.*;
public class TestMenu {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("windows");
MenuBar mb=new MenuBar();
Menu m1=new Menu("file");
Menu m2=new Menu("edit");
MenuItem ml1=new MenuItem("new");
MenuItem ml2=new MenuItem("open file");
MenuItem ml3=new MenuItem("exit");
ml3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.exit(0);
}
});
m1.add(ml1);
m1.add(ml2);
m1.add(ml3);
mb.add(m1);
MenuItem ml4=new MenuItem("copy");
MenuItem ml5=new MenuItem("xxx");
m2.add(ml4);
m2.add(ml5);
mb.add(m2);
f.setMenuBar(mb);
f.setSize(300,300);
f.setVisible(true);
}
}
/**
*
程序目标:
*
当点击按纽的时候,在终端输出用户在文本框中输入的内容
*/
package MY.module08.event;
import java.awt.*;
import java.awt.event.*;
public class TestTextEvent {
Frame f=null;
TextField t=null;
Button b=null;
public void init(){
f=new Frame("window");
t=new TextField(10);
b=new Button("info");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.out.println(t.getText());
}
});
f.setLayout(new FlowLayout());
f.add(t);
f.add(b);
f.setSize(300,300);
f.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestTextEvent tte=new TestTextEvent();
tte.init();
}
}
/**
*
知识点:
*
适配器类:
WindowAdapter
*
程序目标:
*
使用适配器类的方式让点击窗体关闭按纽时,将程序关闭
*/
package MY.module08.event;
import java.awt.*;
import java.awt.event.*;
public class TestWindowEvent {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Frame f=new Frame("window");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
f.setLayout(new FlowLayout());
f.setSize(300,300);
f.setVisible(true);
}
}
/**
*
知识点:
* String.valueOf(), getSource():
得到触发当前事件的对象,适配器类
*
程序目标:
*
有三个文本框,让第一个文本中的数字加上或减去第二的文本框中的
*
数字,把结果显示在第三个文本框中,点叉退出程序
*
*/
package MY.module08.zuoye;
import java.awt.*;
import java.awt.event.*;
public class Add extends WindowAdapter{
Frame f;
FlowLayout fl;
TextField t1;
TextField t2;
TextField t3;
Button b1;
Button b2;
public void init(){
f=new Frame("window");
f.addWindowListener(this);
t1=new TextField(10);
t2=new TextField(10);
t3=new TextField(10);
b1=new Button("add");
action ac=new action();
b1.addActionListener(ac);
b2=new Button("sub");
b2.addActionListener(ac);
fl=new FlowLayout();
f.setLayout(fl);
f.add(t1);
f.add(t2);
f.add(t3);
f.add(b1);
f.add(b2);
f.setSize(300,300);
f.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Add a=new Add();
a.init();
}
public void windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub
System.exit(0);
}
class action implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
int x=Integer.parseInt(t1.getText());
int y=Integer.parseInt(t2.getText());
String s=null;
Button b=null;
b=(Button)arg0.getSource();
String bName;
bName=b.getActionCommand();
System.out.println(bName);
if(bName.equals("add")){
// s=(x+y)+"";
s.valueOf(x+y);//
将整数转换为字符串类型的方法
t3.setText(s.valueOf(x+y));
// t3.setText(String.valueOf(x+y));//valueOf
是静态方法
// t3.setText(s);
}else if(bName.equals("sub")){
// s=(x-y)+"";
t3.setText(s.valueOf(x-y));
// t3.setText(s);
}else{
System.out.println("you wen ti");
}
t1.setText("");
t2.setText("");
}
}
}/**
*
知识点:
* ItemEvent
事件对象中的方法
*
组件方法:
Choice
组件,
TextArea
组件
* ItemListener
监听器接口
*
程序目标:
*
做一个下拉列表,当选日本人或美国人的时候,在文本域中写上杀他们
*
的信息,当是中国人,那么写上欢迎,并且不能覆盖以前从选择的内容
*/
package MY.module08.zuoye;
import java.awt.*;
import java.awt.event.*;
public class ItemEvent extends WindowAdapter{
Frame f;
Choice c;
TextArea ta;
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
public void init(){
f=new Frame("window");
f.setLayout(new FlowLayout());
f.addWindowListener(this);
c=new Choice();
c.add("
日本人
");
c.add("
美国人
");
c.add("
中国人
");
c.addItemListener(new ItemListener(){
public void itemStateChanged(java.awt.event.ItemEvent arg0) {
// TODO Auto-generated method stub
Choice choice=null;
String s;
choice=(Choice)arg0.getSource();
s=choice.getSelectedItem();
System.out.println(s);
if(s.equals("
日本人
")){
// ta.setText("
杀
"+s);
ta.append("
杀
"+s);
}else if(s.equals("
美国人
")){
// ta.setText("
杀
"+s);
ta.append("
杀
"+s);
}else if(s.equals("
中国人
")){
// ta.setText("
欢迎
"+s);
ta.append("
欢迎
"+s);
}
}
});
f.add(c);
ta=new TextArea(null,5,30);
f.add(ta);
f.setSize(300,300);
f.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ItemEvent ie=new ItemEvent();
ie.init();
}
}
/**
* Java
文件说明:
* User.java:
用户类,有名字和密码
*
程序目标:
*
用户输入名称和密码,判断是否正确,如果是正确的在终端输入
*
登陆成功,否则输出登陆失败
*
当用户输入用户名和密码的,点登陆的时候,生成个
User
对象
*
使用
Vector
来管理对象,并且判断输入的用户名和密码是否正确
*
*/
package MY.module08.zuoye.login;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
public class Login extends WindowAdapter{
private Vector vector;
public Login() {
vector=new Vector();
vector.add(new User("yuchen","7775118"));
}
Frame f;
Label l1;
Label l2;
TextField t1;
TextField t2;
Button b1;
Button b2;
public void init(){
f=new Frame("window");
f.setLayout(new FlowLayout());
f.addWindowListener(this);
t1=new TextField(10);
t2=new TextField(10);
l1=new Label("
请输入用户名
:");
l2=new Label("
请输入密码
:");
b1=new Button("login");
b2=new Button("exit");
Action a=new Action();
b1.addActionListener(a);
b2.addActionListener(a);
f.add(l1);
f.add(t1);
f.add(l2);
f.add(t2);
f.add(b1);
f.add(b2);
f.setSize(500,100);
f.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Login l=new Login();
l.init();
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
class Action implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Button b=(Button)arg0.getSource();
if(b.getActionCommand().equals("login")){
String userName=t1.getText();
String password=t2.getText();
User u=new User(userName,password);
boolean isempy=vector.contains(u);
if(isempy){
System.out.println("
登陆成功
");
}else{
System.out.println("
登陆失败
");
}
}else{
System.exit(0);
}
}
}
}
package MY.module08.zuoye.login;
public class User {
private String name;
private String password;
public User(String name, String password) {
super();
// TODO Auto-generated constructor stub
this.name = name;
this.password = password;
}
@Override
public boolean equals(Object arg0) {
// TODO Auto-generated method stub
boolean rst=false;
if(arg0 instanceof User){
User u=(User)arg0;
if(name.equals(u.name)&&password.equals(u.password)){
rst=true;
}
}
return rst;
}
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer();
sb.append(name+" ");
sb.append(password);
return sb.toString();
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
int rst=name.hashCode()^+password.hashCode();
return rst;
}
}
Swing:
和
awt
界面的区别:
AWT
是基于平台上的界面,就是基于操作系统的
Swing
的界面不是这样的,而且
Swing
界面更好看
掌握两点:
提示对话框的使用
添加组件的特殊点,组件在屏幕中央显示,工具包类,窗体大小类
Container container = window.getContentPane();
这里为什么不直接
new
个
Container
对象呢?可以这么理解,这样得到对象是采用了单例模式,因为一个窗体只用一个这样的中间容器就可以了,不需要更多的
Container
,通过这个单例模式可以得到唯一的一个这样的对象
/**
*
知识点:
*
工具包类,组件宽度高度类,
Swing,
内容窗格类
* Toolkit,Dimension,Container
*
程序目标:
*
使用
Swing,
让窗体在屏幕中央显示,并且有个按纽可以退出程序
*/
package MY.module08.Swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestSwing {
JFrame jf;
JButton jb;
public void init(){
jf=new JFrame("Swing");
Container container=jf.getContentPane();
container.setLayout(new FlowLayout());
jb=new JButton("exit");
jb.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
System.exit(0);
}
});
container.add(jb);
//
第一步:得到该窗体的工具包
//
第二步:使用工具包中的
getScreenSize()
方法得到系统窗口大小
//
第三步:使用窗体的
setBounds
方法,设置程序窗体的大小
Toolkit toolkit=jf.getToolkit();
Dimension screeSize = toolkit.getScreenSize();
jf.
setBounds(screeSize.width/4,screeSize.height/4,screeSize.width/2,screeSize.height/2);
// jf.setSize(300,300);
jf.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestSwing ts=new TestSwing();
ts.init();
}
}
/**
*
知识点:
*
对话框的使用:
* JOptionPane:
有三个静态的方法,一个是显示信息的,一个是与用户有
*
交互的,一个是让用户可以插入信息的
*
程序目标:
*
用户输入名字和密码,点
login
时,判断是不是为空,如果为空弹出对话框
*
显示消息,并在用户名框中得到焦点
.....
主要测试对话框的使用
*/
package MY.module08.Swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestPassword extends WindowAdapter{
JFrame jf;
JTextField jtf1;
JPasswordField jtf2;
JButton jb1;
JButton exit;
public void init(){
jf=new JFrame("login");
jf.addWindowListener(this);
Container container=jf.getContentPane();
container.setLayout(new FlowLayout());
container.add(new JLabel("
请输入用户名:
"));
jtf1=new JTextField(10);
container.add(jtf1);
container.add(new JLabel("
请输入密码:
"));
jtf2=new JPasswordField(10);
jtf2.setEchoChar('#');//
设置显示的格式
container.add(jtf2);
Action a=new Action();
jb1=new JButton("login");
jb1.addActionListener(a);
container.add(jb1);
exit = new JButton("exit");
exit.addActionListener(a);
container.add(exit);
jf.setSize(600,100);
jf.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestPassword tp=new TestPassword();
tp.init();
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
class Action implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JButton jb=(JButton)arg0.getSource();
if(jb.getActionCommand().equals("login")){
String a=jtf1.getText();
String b=jtf2.getText();
if(a.equals("")||b.equals("")){
JOptionPane.
showMessageDialog(jf,"
用户名或密码不能为空
","info",JOptionPane.INFORMATION_MESSAGE);
jtf1.requestFocus();
return;
}
int userSelect = JOptionPane //
判断选择的是确定还是撤消
.showConfirmDialog(jf,"confirm to login?","confirm",JOptionPane.OK_CANCEL_OPTION);
if(userSelect==JOptionPane.CANCEL_OPTION){
jtf1.requestFocus();
return;
}
//
接收用户在插入提示框中输入的内容,并打印出来
String info = JOptionPane
.showInputDialog(jf,"please input your resume","info",JOptionPane.INFORMATION_MESSAGE);
System.out.println("your resume is "+info);
if(a.equals("yuchen")&&b.equals("7775118")){
System.out.println("
登陆成功
");
}else{
System.out.println("
登陆失败
");
}
}else{
System.exit(0);
}
}
}
}