一、BorderLayoutTest.java

package com.briup.md08;
 import java.awt.*;
 import javax.swing.*;/*BorderLayout特点
 1、组件的大小由容器决定
 2、容器被划分为5个区域,每个区域只能直接加入3个组件
 3、组件加入的位置需要指定,默认为CENTER
 4、组件之间默认没有间隙
 5、如果除CENTER 以外的区域没有加入组件,其空间将被其他区域合理分配;如果CENTER区域没有加入组件,其空间将会保留;通常在使用中必须在CENTER加入组件,其它区域可以视需要决定要求:保持容器大小为800*600,将FlowLayoutTest中100个JButton放到CENTER区域(每个按钮大小相同,每行10个按钮)
 */
 public class BorderLayoutTest{
  private JFrame f;
  private Container c;
  private JPanel jp;
  public BorderLayoutTest(){
   f=new JFrame("Border Layout");
   c=f.getContentPane();
   c.setLayout(new BorderLayout(10,10));
   /*添加组件:add(组件,添加位置)*/
   JPanel jp=new JPanel();
   jp.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
   for(int i=1;i<=100;i++){
    if(i<10)
    jp.add(new JButton("00"+i));
    else if(i<100)
    jp.add(new JButton("0"+i));
    else
    jp.add(new JButton(""+i));
   }
   c.add(new JButton("1"),BorderLayout.EAST);
   c.add(new JButton("2"),BorderLayout.WEST);
   c.add(new JButton("3"),BorderLayout.NORTH);
   c.add(new JButton("4"),BorderLayout.SOUTH);
   c.add(jp,BorderLayout.CENTER);
   f.addWindowListener(new WindowClose());
   c.setBackground(Color.red);
   f.setSize(800,600);
   f.setVisible(true);
  }
  public static void main(String[] args){
   new BorderLayoutTest();
  }
  } 
 
二、CardLayoutTest.java
 
package com.briup.md08;
import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 /*CardLayout的特点
 1、容器按照加入的先后顺序管理每张卡片,先加入的在前
 2、卡片默认填满容器
 3、每张卡片只能直接加入一个组件,且加入时必须指定一个在容器中唯一的名称,用于执行show()的识别
 */public class CardLayoutTest{
 private JFrame f;
  private Container c;
  private JButton[] btns=new JButton[5];
  public CardLayoutTest(){
   f=new JFrame("Card Layout");
   c=f.getContentPane();
   
   c.setLayout(new CardLayout());
   
   for(int i=0;i<btns.length;i++){
    btns[i]=new JButton(""+i);
    /*CardLayout组件加入格式:
    add(组件,组件名称);
    */
    c.add(btns[i],"btns"+i);
    /*作用:当点击btns[i]时,执行MyActionListener类的actionPerformed()*/
    btns[i].addActionListener(new MyActionListener());
   }
   f.addWindowListener(new WindowClose());
   
   c.setBackground(Color.yellow);
   f.setSize(400,300);
   f.setVisible(true);
  }
  /*在GUI的事件处理中,经常使用成员内部类和匿名内部类*/
  class MyActionListener implements ActionListener{
   public void actionPerformed(ActionEvent e){
    /*获得c的布局管理器,返回类型为LayoutManager,该类型是所有布局管理器的父类,获得后应执行类型转换*/
    CardLayout card=(CardLayout)c.getLayout();
    /*在容器c中显示下一张卡片,next()操作循环执行*/
    card.next(c);
   }
  }
  public static void main(String[] args){
   new CardLayoutTest();
  }
 } 
三、FirstGUI.java
 
package com.briup.md08;
import java.awt.*;
 import javax.swing.*;
 public class FirstGUI{
  private JFrame f;
  private Container c;
  
  public  FirstGUI(){
   /*step 1:创建容器*/
   f=new JFrame("My First GUI");
   /*创建于f对应的容器c,从外观上理解,f和c相同,常用操作中,
   对布局管理器的操作、增加组件的操作和设置背景色通过c执行,其余通过f执行*/
   c=f.getContentPane();
   /*step 2:选择布局管理器,容器有默认的布局管理器*/
   c.setLayout(null);//禁用布局管理器
   
   /*step 3:创建组件并加入容器*/
   JPanel p=new JPanel();
   c.add(p);
   /*step 4:执行事件处理*/
   f.addWindowListener(new WindowClose());
   /*其他设置*/
   p.setBackground(Color.yellow);
   p.setSize(200,150);
   c.setBackground(Color.blue);
   f.setSize(400,300);
   f.setVisible(true);
  }
  public static void main(String[] args){
   new FirstGUI();
  }}
 
四、FlowLayoutTest.java
 
package com.briup.md08;
 import java.awt.*;
 import javax.swing.*;/*FlowLayout特点
 1、组件自身决定大小
 2、组件按照加入的先后顺序排列,默认居中
 3、组件之间默认有5个像素的纵向和横向间隙
 4、组件换行排列的时机由容器大小决定 要求:在保持容器大小为800*600不变的前提下
 1、每行显示10个按钮
 2、所有按钮大小相同,但按钮含义不变(显示信息为1-100)
 */
 public class FlowLayoutTest{
  private JFrame f;
  private Container c;
  public FlowLayoutTest(){
   f=new JFrame("Flow Layout");
   c=f.getContentPane();
   /*设置布局管理器,参数为具体的布局管理器对象*/
   c.setLayout(new FlowLayout(FlowLayout.LEFT,20,10));
   for(int i=1;i<=100;i++){
    if(i<10)
    c.add(new JButton("00"+i));
    else if(i<100)
    c.add(new JButton("0"+i));
    else
    c.add(new JButton(""+i));
   }
   f.addWindowListener(new WindowClose());
   c.setBackground(Color.green);
   f.setSize(800,600);
   f.setVisible(true);
  }
  public static void main(String[] args){
   new FlowLayoutTest();
  }
 }五、GridLayoutTest.java
 
package com.briup.md08;
import java.awt.*;
import javax.swing.*;
 /*GridLayout的特点
 1、将容器分为大小相同的网格,由行和列两个参数指定
 2、每个网格只能直接加入一个组件
 3、网格之间默认没有间隙
 4、容器按照行优先原则对加入的组件以加入顺序进行排列
 */public class GridLayoutTest{
  
   private JFrame f;
  
   private Container c;
  
   public GridLayoutTest(){
   
   f=new JFrame("Gird Layout");
   
   c=f.getContentPane();
   
   /*GridLayout通常不使用无参构造器,当前使用的构造器的参数表示将容器划分成网格的行数和列数*/
   
   c.setLayout(new GridLayout(5,6,10,10));
   
   for(int i=1;i<=30;i++)
    
   c.add(new JButton(""+i));
   
   f.addWindowListener(new WindowClose());
   
   c.setBackground(Color.yellow);
   
   f.setSize(800,600);
   
   f.setVisible(true);
  
  }
  
  public static void main(String[] args){
   
   new GridLayoutTest();
  
  }}
 
六、MulLayoutTest.java
 
package com.briup.md08;
/*要求:
 1、容器大小为1024*768
 2、将容器分为大小相同的2部分
 3、上半部分加入FlowLayoutTest中显示的内容
 4、下半部分加入BorderLayout中显示的内容
 5、对3和4均保持按钮大小相同,每行的按钮数量不作要求
 */
 import java.awt.*;
 import javax.swing.*;public class MulLayoutTest{
  private JFrame f;
  private Container c;
  private JPanel p1;
  private JPanel p2;
  
  public MulLayoutTest(){
   f=new JFrame("MulLayoutTest");
   c=f.getContentPane();
   c.setLayout(new GridLayout(2,1));  p1=new JPanel();
   p2=new JPanel();
   c.add(p1);
   c.add(p2);
   
   p1.setLayout(new FlowLayout(FlowLayout.LEFT,20,10));
   for(int i=1;i<=100;i++){
    if(i<10)
    p1.add(new JButton("00"+i));
    else if(i<100)
    p1.add(new JButton("0"+i));
    else
    p1.add(new JButton(""+i));
   }
   
   p2.setLayout(new BorderLayout()); 
   p2.add(new JButton("1"),BorderLayout.EAST);
   p2.add(new JButton("2"),BorderLayout.WEST);
   p2.add(new JButton("3"),BorderLayout.NORTH);
   p2.add(new JButton("4"),BorderLayout.SOUTH);
   JPanel jp=new JPanel();
   p2.add(jp,BorderLayout.CENTER);
   jp.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
   for(int i=1;i<=100;i++){
    if(i<10)
    jp.add(new JButton("00"+i));
    else if(i<100)
    jp.add(new JButton("0"+i));
    else
    jp.add(new JButton(""+i));
   }
   
   f.addWindowListener(new WindowClose());
   f.setSize(1024,768);
   f.setVisible(true);
  }
  public static void main(String[] args){
   new MulLayoutTest();
  }
 } 
七、WindowClose.java
 
package com.briup.md08;
 import java.awt.event.*;/*JFrame的关闭按钮默认行为隐藏,可以通过事件处理方式修改其行为*/
 public class WindowClose extends WindowAdapter{
  public void windowClosing(WindowEvent e){
   System.exit(0);
  }
 } 
八、EmotionEvent.java
 
package com.briup.md09;
 import java.util.*;
 /*事件对象,继承java.util.EventObject*/class EmotionEvent extends EventObject{
  /*参数为事件源对象,该信息由父类维护*/
  public EmotionEvent(Object source){
   super(source);
  }
 }
 /*事件监听器(接口),定义需要监听的具体行为,通常1个方法对应1种行为,方法参数为事件对象*/
 interface EmotionListener{
  void sad(EmotionEvent e);
  void happy(EmotionEvent e);
 }
 /*事件适配器(类),实现相应的事件监听器,所有方法实现为空内容*/
 class EmotionAdapter implements EmotionListener{
  public void sad(EmotionEvent e){}
  public void happy(EmotionEvent e){}
 }
 /*事件监听器的另一种实现,继承特定的适配器类,定义监听行为的具体处理方式,该实现方式只需要覆盖必要的方法*/
 class Boy2 extends EmotionAdapter{
  private String name;
  public Boy2(String name){
   this.name=name;
  }
  public void setName(String name){
   this.name=name;
  }
  public String getName(){
   return name;
  }
  public void happy(EmotionEvent e){
   /*调用事件对象的getSource()可以获得事件源对象,该方法对所有事件对象都是有效的,该方法在EventObject中定义*/
   Girl girl=(Girl)e.getSource();
   System.out.println(name+" know "+girl.getName()+" is happy!");
  }
 }
 /*事件监听器的实现,实现特定的监听器接口,定义行为监听的具体处理方式,该实现方式必须实现所有的方法*/
 class Boy implements EmotionListener{
  private String name;
  public Boy(String name){
   this.name=name;
  }
  public void setName(String name){
   this.name=name;
  }
  public String getName(){
   return name;
  }
  public void happy(EmotionEvent e){
   /*调用事件对象的getSource()可以获得事件源对象,该方法对所有事件对象都是有效的,该方法在EventObject中定义*/
   Girl girl=(Girl)e.getSource();
   System.out.println(name+" know "+girl.getName()+" is happy!");
  }
  public void sad(EmotionEvent e){
   Girl girl=(Girl)e.getSource();
   System.out.println(name+" know "+girl.getName()+" is sad!");
  }
 }
 /*事件源对象,通常有三部分组成
 1、类本身的内容,如name属性等
 2、维护事件监听器的列表(当事件发生时,需要通知哪些监听器对象)
 3、导致事件产生的行为*/
  class Girl{
   /*-----Part 1------*/
   private String name;
   public Girl(String name){
    this.name=name;
   }
   public void setName(String name){
    this.name=name;
   }
   public String getName(){
    return name;
   }
   /*-----Part 2------*/
   private ArrayList listeners=new ArrayList();
   /*将监听器对象加入监听器列表中,通常成为注册*/
   public void addEmotionListener(EmotionListener listener){
    listeners.add(listener);
   }
   /*将监听器对象从监听器列表中删除*/
   public void removeEmotionListener(EmotionListener listener){
    listeners.remove(listener);
   }
   /*-----part 3------*/
   /*导致girl happy,应调用所有监听器列表中boy的happy方法*/
   public void raiseSalary(){
    EmotionEvent e=new EmotionEvent(this);
    Iterator iter=listeners.iterator();
    while(iter.hasNext()){
     Boy boy=(Boy)iter.next();
     boy.happy(e);
    }
   }
   /*导致girl sad,应调用所有监听器类表中的boy的sad方法*/
   public void fire(){
    EmotionEvent e=new EmotionEvent(this);
    Iterator iter=listeners.iterator();
    while(iter.hasNext()){
     Boy boy=(Boy)iter.next();
     boy.sad(e);
    }
   }
 }
 public class EmotionTest{
  public static void main(String[] args){
   Girl mary=new Girl("mary");
   Boy tom=new Boy("tom");
   Boy jack=new Boy("jack");
   mary.addEmotionListener(tom);
   mary.addEmotionListener(jack);
   mary.raiseSalary();
   /*输出结果为
   tom know mary is happy!
   jack know mary is happy!
   */
   mary.removeEmotionListener(jack);
   mary.fire();
   /*输出结果为
   tom know mary is sad!
   */
  }
 } 
 九、MouseEventTest.java
 
package com.briup.md09;
import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import com.briup.md08.*;public class MouseEventTest{
 private JFrame f;
  private Container c;
  private JTextArea ta;
  public MouseEventTest(){
   f=new JFrame("Mouse Event");
   c=f.getContentPane();
   /*参数指定文本框的行和列*/
   ta=new JTextArea(10,30);
   JScrollPane sp=new JScrollPane(ta);
   c.add(sp,BorderLayout.NORTH);
   
   /*注册操作于使用监听器类的两种实现方式无关*/
   f.addWindowListener(new WindowClose());
   f.addMouseMotionListener(new MyMouseMotionListener());
   f.addMouseListener(new MouseAdapter(){
    public void mouseEntered(MouseEvent e){
    ta.append("Enter!/n");
    }
    public void mouseExited(MouseEvent e){
    ta.append("Exit!/n");
    }
   });
      
   c.setBackground(Color.blue);
   f.setSize(400,300);
   f.setVisible(true);
  }// class MyMouseListener extends MouseAdapter{
 //  public void mouseEntered(MouseEvent e){
 //   /*在JTextArea的内容后追加*/
 //   ta.append("Enter!/n");
 //  }
 //  public void mouseExited(MouseEvent e){
 //   ta.append("Exit!/n");
 //  }
 // }
  class MyMouseMotionListener extends MouseMotionAdapter{
    public void mouseDragged(MouseEvent e){
    /*getX()和getY可以获得当前鼠标所处的位置的坐标*/
    ta.append("Dragged, X="+e.getX()+" Y="+e.getY()+"./n");
   }
  }
  public static void main(String[] args){
   new MouseEventTest();
  }
 }


https://blog.51cto.com/myitworld/667239