==============================================================================
JAVA 第十二天
==============================================================================
今天的内容 : GUI:
重点 -> 设计模式 : 观察者设计模式 .
-------------------------------------------------------------------------------------
(1) 构造图形化界面的四个步骤 :
1. 选择容器
2. 设置布局管理器
3. 添加组件
4. 设置事件监听器
------------------------------------------------------------------------------------
awt: java.awt; 早期的包 .
javax.swing: 现在使用的包 . 扩展自 awt.
(2) 组件的父类 : Jcomponent
(3) 设置布局管理器 : LayoutManager 是一个接口
第一个实现类 : 流式管理器 :FlowLayout()
JFrame: 由 6 层面板组成 . 我们上午的组件是放在内容面板上 ; 默认布局管理器是 :BorderLayout();
JPanel 的默认布局管理器是 FlowLayOut();
如果是
(4) BorderLayout() 东西南北中
JFrame 的默认布局管理器是 :BorderLayout();
(5) GirdLayout() : 网格布局
new GirdLayout(3,2) // 表示 3 行 2 列 ;
(6) CardLayout() : 卡片布局 / 管理器 .
(7) GridBagLayout(); 复杂的网格布局 允许一个组件跨越多行和多列 .
(8) 小组件
<1> Button
<2> JTextField()
<3> JTextArea()
<4> JScrollPane( 组件 );// 为组件添加滚动功能 .
<5> JLable(); 显示组件
<6> JComboBox(): 下拉选择框
<7> JPasswordField : 密码输入框
--------------------------------------------------
<8>JList 列表
<9>JRadioButton 单选框
<10>JCheckBox 复选框
<11>JMenuBar 菜单条
<12>JMenu 菜单( JMenu 也可以放在 JMenu 里面,做成二级菜单)
<13>JMenuItem 菜单项
<14>JCheckBoxMenuItem 多选菜单项
<15>JRadioButtonMenuItem 单选菜单项
<16>JPopupMenu 弹出式菜单
<17>JToolBar 工具条
<18>JEditorPane 显示格式化文本
<19>JSplitPane 分隔面板
<20>JTabbedPane 分层面板
<21>JSlider 滑动条
<22>JProgressBar 进度条
<23>JFileChooser 文件选择器
<24>JColorChooser 颜色选择器
----------------------------------------------------------------------------------------------
(9)AWT 事件模型 ( 源自观察者模式 )
体现 : 个司其职 , 接口 , 弱藕合 .
<1> 事件源 : 发出事件对象的对象 需要授权 ( 注册 ) 给一个事件监听器
<2> 事件对象 :
<3> 事件监听器 : 处理事件
工作原理 : 事件源先和事件监听器建立授权注册关系 , 当事件条件满足的时候 , 由事件源给注册的事件监听器发送事件对象 , 由监听器来处理事件 .
事件源可以成为多种事件的事件源 .
一个事件监听器可以在多个事件源上注册 .
一个事件源在一种事件上可以注册多个监听器 .
体现了弱藕合的关系
事件对象 , 继承 EevetObject 接口 , 封装了一个事件源对象 .
事件监听接口 , 继承 EventListener, 其中没一个方法都要以事件对象作为参数 .
事件源给事件监听器发送事件对象就是事件源以事件对象作为参数,调用监听器接口的相应方法,通过回调,调用的是不同监听实现类的方法
步骤 :
<1> 先写一个事件对象类继承自 EventObject(), 它是一个标记接口 , 里面没有定义方法 , 只有一个属性 :source; 此时需要事件对象类 , 写出有参的构造方法 . 来构造父类 , 给父类的 source 赋值 .
<2> 写事件监听器接口 , 实现 EventListener 接口 , 用来定义事件监听器要实现的方法 .
<3> 写事件源类 , 里面要有添加 , 删除和激发监听器的方法 . 要用一个集合来存储监听器对象 . 其中的激发事件的方法要着重的提一下 , 这个方法以事件对象为一个参数 , 自己写怎么激发 ( 调用 ) 事件监听器的方法 . 通过遍历所有监听器 , 通过接口调用所有监听器的处理方法 .
<4> 写事件监听器对象实现自己定义的事件监听器的接口 .
例子 :
package homework;
import java.util.*;
public class TestGirl {
public static void main(String[] args) {
Girl g=new Girl(" 小企鹅 ");
EnmotionEventListener e1=new Chenpy(" 陈鹏烨 ");
EnmotionEventListener e2=new yangqing(" 杨青 ");
g.addEventListener(e1);
g.addEventListener(e2);
g.fire();
}
}
/*
<1> 先写一个事件对象类继承自 EventObject(), 它是一个标记接口 ,
里面没有定义方法 , 只有一个属性 :source; 此时需要事件对象类 ,
写出有参的构造方法 . 来构造父类 , 给父类的 source 赋值 .*/
class EnmotionEvent extends EventObject{
public EnmotionEvent(Object o){
super(o);
}
}
//<2> 写事件监听器接口 , 实现 EventListener 接口 , 用来定义事件监听器要实现的方法 .
interface EnmotionEventListener extends EventListener{
void happy(EnmotionEvent e);
void sad(EnmotionEvent e);
}
/*
<3> 写事件源类 , 里面要有添加 , 删除和激发监听器的方法 . 要用一个集合
来存储监听器对象 . 其中的激发事件的方法要着重的提一下 , 这个方法以
事件对象为一个参数 , 自己写怎么激发 ( 调用 ) 事件监听器的方法 . 通过
遍历所有监听器 , 通过接口调用所有监听器的处理方法 .*/
class Girl{
String name;
List ls=new ArrayList();
public Girl(String name){
this.name=name;
}
public void addEventListener(EnmotionEventListener e){
ls.add(e);
}
public void removeEventListener(EnmotionEventListener e){
ls.remove(e);
}
public void fire(){
EnmotionEvent e=new EnmotionEvent(this);
for(int i=0;i<10;i++){
Iterator it=ls.iterator();
while(it.hasNext()){
EnmotionEventListener en=(EnmotionEventListener)it.next();
if(i%2==0){
en.happy(e);
}
else{
en.sad(e);
}
}
}
}
public String getName() {
return name;
}
}
//<4> 写事件监听器对象实现自己定义的事件监听器的接口 .
class Chenpy implements EnmotionEventListener{
String name;
public Chenpy(String name){
this.name=name;
}
public void happy(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 你高兴我就高兴 , 嘻嘻 ");
}
public void sad(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 别伤心了 ");
}
}
class yangqing implements EnmotionEventListener{
String name;
public yangqing(String name){
this.name=name;
}
public void happy(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 你高兴我不高兴 !");
}
public void sad(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 该 , 气死你 ! 哈哈 ");
}
}
JAVA 第十二天
==============================================================================
今天的内容 : GUI:
重点 -> 设计模式 : 观察者设计模式 .
-------------------------------------------------------------------------------------
(1) 构造图形化界面的四个步骤 :
1. 选择容器
2. 设置布局管理器
3. 添加组件
4. 设置事件监听器
------------------------------------------------------------------------------------
awt: java.awt; 早期的包 .
javax.swing: 现在使用的包 . 扩展自 awt.
(2) 组件的父类 : Jcomponent
(3) 设置布局管理器 : LayoutManager 是一个接口
第一个实现类 : 流式管理器 :FlowLayout()
JFrame: 由 6 层面板组成 . 我们上午的组件是放在内容面板上 ; 默认布局管理器是 :BorderLayout();
JPanel 的默认布局管理器是 FlowLayOut();
如果是
(4) BorderLayout() 东西南北中
JFrame 的默认布局管理器是 :BorderLayout();
(5) GirdLayout() : 网格布局
new GirdLayout(3,2) // 表示 3 行 2 列 ;
(6) CardLayout() : 卡片布局 / 管理器 .
(7) GridBagLayout(); 复杂的网格布局 允许一个组件跨越多行和多列 .
(8) 小组件
<1> Button
<2> JTextField()
<3> JTextArea()
<4> JScrollPane( 组件 );// 为组件添加滚动功能 .
<5> JLable(); 显示组件
<6> JComboBox(): 下拉选择框
<7> JPasswordField : 密码输入框
--------------------------------------------------
<8>JList 列表
<9>JRadioButton 单选框
<10>JCheckBox 复选框
<11>JMenuBar 菜单条
<12>JMenu 菜单( JMenu 也可以放在 JMenu 里面,做成二级菜单)
<13>JMenuItem 菜单项
<14>JCheckBoxMenuItem 多选菜单项
<15>JRadioButtonMenuItem 单选菜单项
<16>JPopupMenu 弹出式菜单
<17>JToolBar 工具条
<18>JEditorPane 显示格式化文本
<19>JSplitPane 分隔面板
<20>JTabbedPane 分层面板
<21>JSlider 滑动条
<22>JProgressBar 进度条
<23>JFileChooser 文件选择器
<24>JColorChooser 颜色选择器
----------------------------------------------------------------------------------------------
(9)AWT 事件模型 ( 源自观察者模式 )
体现 : 个司其职 , 接口 , 弱藕合 .
<1> 事件源 : 发出事件对象的对象 需要授权 ( 注册 ) 给一个事件监听器
<2> 事件对象 :
<3> 事件监听器 : 处理事件
工作原理 : 事件源先和事件监听器建立授权注册关系 , 当事件条件满足的时候 , 由事件源给注册的事件监听器发送事件对象 , 由监听器来处理事件 .
事件源可以成为多种事件的事件源 .
一个事件监听器可以在多个事件源上注册 .
一个事件源在一种事件上可以注册多个监听器 .
体现了弱藕合的关系
事件对象 , 继承 EevetObject 接口 , 封装了一个事件源对象 .
事件监听接口 , 继承 EventListener, 其中没一个方法都要以事件对象作为参数 .
事件源给事件监听器发送事件对象就是事件源以事件对象作为参数,调用监听器接口的相应方法,通过回调,调用的是不同监听实现类的方法
步骤 :
<1> 先写一个事件对象类继承自 EventObject(), 它是一个标记接口 , 里面没有定义方法 , 只有一个属性 :source; 此时需要事件对象类 , 写出有参的构造方法 . 来构造父类 , 给父类的 source 赋值 .
<2> 写事件监听器接口 , 实现 EventListener 接口 , 用来定义事件监听器要实现的方法 .
<3> 写事件源类 , 里面要有添加 , 删除和激发监听器的方法 . 要用一个集合来存储监听器对象 . 其中的激发事件的方法要着重的提一下 , 这个方法以事件对象为一个参数 , 自己写怎么激发 ( 调用 ) 事件监听器的方法 . 通过遍历所有监听器 , 通过接口调用所有监听器的处理方法 .
<4> 写事件监听器对象实现自己定义的事件监听器的接口 .
例子 :
package homework;
import java.util.*;
public class TestGirl {
public static void main(String[] args) {
Girl g=new Girl(" 小企鹅 ");
EnmotionEventListener e1=new Chenpy(" 陈鹏烨 ");
EnmotionEventListener e2=new yangqing(" 杨青 ");
g.addEventListener(e1);
g.addEventListener(e2);
g.fire();
}
}
/*
<1> 先写一个事件对象类继承自 EventObject(), 它是一个标记接口 ,
里面没有定义方法 , 只有一个属性 :source; 此时需要事件对象类 ,
写出有参的构造方法 . 来构造父类 , 给父类的 source 赋值 .*/
class EnmotionEvent extends EventObject{
public EnmotionEvent(Object o){
super(o);
}
}
//<2> 写事件监听器接口 , 实现 EventListener 接口 , 用来定义事件监听器要实现的方法 .
interface EnmotionEventListener extends EventListener{
void happy(EnmotionEvent e);
void sad(EnmotionEvent e);
}
/*
<3> 写事件源类 , 里面要有添加 , 删除和激发监听器的方法 . 要用一个集合
来存储监听器对象 . 其中的激发事件的方法要着重的提一下 , 这个方法以
事件对象为一个参数 , 自己写怎么激发 ( 调用 ) 事件监听器的方法 . 通过
遍历所有监听器 , 通过接口调用所有监听器的处理方法 .*/
class Girl{
String name;
List ls=new ArrayList();
public Girl(String name){
this.name=name;
}
public void addEventListener(EnmotionEventListener e){
ls.add(e);
}
public void removeEventListener(EnmotionEventListener e){
ls.remove(e);
}
public void fire(){
EnmotionEvent e=new EnmotionEvent(this);
for(int i=0;i<10;i++){
Iterator it=ls.iterator();
while(it.hasNext()){
EnmotionEventListener en=(EnmotionEventListener)it.next();
if(i%2==0){
en.happy(e);
}
else{
en.sad(e);
}
}
}
}
public String getName() {
return name;
}
}
//<4> 写事件监听器对象实现自己定义的事件监听器的接口 .
class Chenpy implements EnmotionEventListener{
String name;
public Chenpy(String name){
this.name=name;
}
public void happy(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 你高兴我就高兴 , 嘻嘻 ");
}
public void sad(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 别伤心了 ");
}
}
class yangqing implements EnmotionEventListener{
String name;
public yangqing(String name){
this.name=name;
}
public void happy(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 你高兴我不高兴 !");
}
public void sad(EnmotionEvent e){
Girl g=(Girl)e.getSource();
System.out.println(name+" 说 : "+g.getName()+" 该 , 气死你 ! 哈哈 ");
}
}