Java GUI

一、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();
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值