Java基础--------GUI


 GUI


    概述:Graphical User Interface(图形用户接口) 用图形的方式,来显示计算机操作的界面,这样更方便更直观。

 

     Java为GUI提供的对象都存在java.Awt和 javax.Swing包中;

     awt和swing:

      ava.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。

                    属重量级控件。

   javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性。

               属轻量级控件。


Awt中继承关系图:

                


布局管理器

   所谓的布局,就是容器中的组件的排放方式。

  常见的布局管理器:
FlowLayout(流式布局管理器)
它是Panel默认的布局管理器。从左到右顺序排列。


BorderLayout(边界布局管理器)
它是Frame默认的布局管理器。  东南西北中的排列方式。


GridLayout(网格布局管理器)     规矩的矩阵。


GridBagLayout(网格包布局管理器) 非规矩的矩阵。


CardLayout(卡片布局管理器)    选项卡。

创建一个简单的窗体:

    Container常用子类:Window   Panel(面板,不能单独存在。)
    Window常用子类:Frame  Dialog

 创建过程:

      1、创建Frame窗体

          例:Frame  f = new  Frame(“我的第一个窗体”);          //可设置标题,就是窗口的名字

                        注意:这时候创建的窗体是不可见的,下面会学习如何让窗口变得可见。


      2、设置窗体属性

          窗体的属性有好多,下面我列举一些我用过的,来帮助理解:

         void setTitle(String title) 给窗体设置标题

         void setSize(int width,int height) 

                    设置组件的大小,使其宽度为width,高度为height

         void setVisible(boolean b)

                 设置窗体是否可见。   根据参数 b 的值显示或隐藏此 Window

         void setBounds(int x,int y,int width,int height) 

                    移动组件并调整其大小

         void setFont(Font f) 设置此容器的字体

         void setLayout(LayoutManager mgr)  设置此容器的字体

       3.   定义组件


                      例:Button b =new Button(“按钮”);       //定义组件对象,可设置组件的名称。


        4.   将组建通过窗体的add方式添加到窗体中。


                        例:f.add(b);    //将刚刚定义的按钮组建添加到窗体中。


        5.   让窗体显示

                        void setVisible(boolean b)                使窗体可见

                        例:f.setVisible(true);

练习如下:

/**
 * 步骤:
 * 1、创建Frame窗体
 * 2、对窗体属性进行设置
 * 3、定义组件
 * 4、将组件添加到窗体中
 * 5、让窗体显示
 */
public class FrameDemo {
  public static void main(String[] args) {
  //创建Frame对象
	  Frame f=new Frame();
	  
	//定义窗体大小
	  f.setSize(400, 350);
	//设置窗台位置
	  f.setLocation(200,200);
	//设置窗体名
	f.setTitle("我的第一个简单的窗体");
	//指定布局管理器    网格布局
	f.setLayout(new FlowLayout());  
	
	//定义并添加组件
	Button btn=new Button("非诚勿点!");
	 f.add(btn);
	//设置窗体可见
	f.setVisible(true);
	
  }
}
运行后如下:

                                
         在上面这个程序中,我们虽然运行后显示出了窗体,但是发现不能关闭,还有就是点击上面那个按钮,发现不起作用,如果想让它们实现某些我们想要的功能,那么就要用到接下来需要介绍的知识点,事件监听机制。  

         

事件监听机制:

    A:事件源---就是将来事件发生的那个组件(就是awt包和swing包中的那些图形界面组件

 B:事件---就是要发生的事情。

 C:事件监听---就是把事件注册到事件源上,让事件和事件源产生关联(将可以触发某一个事件的动作(不只一个动作)都封装在监听器中

         以上三者在java中都已定义好,直接获取其对象来用即可。

         而我们要做的就是对产生的动作进行处理


    D:事件处理---就是针对发生的事情的处理结果。

举个通俗的例子来帮助理解:

                                   张三上课迟到了。

                                   

                                   事件源:张三

                                   事     件:迟到了

                                                       导致张三上课迟到的原因有好多,而针对不同的原因老师对他的惩罚也不一样。

                                                      但是,不管什么原因导致的上课迟到,反正是迟到了。

                                    一般来说,事件是一个接口。是要发生的问题,但是没有明确的处理。


事件监听机制流程图:

                                                  

    要关闭窗口可以使用 java.awt.window类中的方法


                              void addWindowListener(WindowLIstener L)      添加指定的窗口监听器,以窗口接收窗口事件。

     

但是,从上面可以看到,这个方法接受的参数类型WindowListener是一个接口类型的参数,创建子类对象的话,就会复写其中所有的方法 ,  但是我们只用到了一个关闭窗口方法。

     所以这时就要使用WindowAdapter类,它是WindowListener的子类已经实现了该接口,并覆盖了其中所有的方法,那么只要继承  WindowAdapter类,并覆盖所需的方法即可。

        若写一个类来继承的话,太麻烦了,这时候可以用到之前学过的匿名内部类来实现。 WindowAdapter适配器,方便功能使用

                       例如:实现点击关闭窗口

                              // 创建窗体对象
         Frame f = new Frame();

             // 设置窗体属性
        f.setTitle("关闭窗口");
         f.setSize(400, 300);
         f.setLocation(400, 200);

           // 用适配器类
   f.addWindowListener(new WindowAdapter(){
   @Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
   });

                                                

  WindowAdapter中用得较多的几个方法:

                    1.   void  windowClosing(WindowEvent  e)            窗口正处于关闭过程中调用


                              2.   void  windowActivated(WindowEvext  e)           激活窗口时调用。


                              3.   void  windowOpend(WindowEvent  e)             一打开窗口时调用。

       其中WindowEvent为事件对象。

 下面从一个案例中来更加深入的应用一下刚才学的知识吧~~

/**
 * 需求:把文本框中的内容通过按钮点击显示在文本区域内
 * 思路:1、创建窗体对象
 *     2、设置窗体属性
 *     3、创建文本框,按钮,文本域对象并添加到窗体中
 *     4、注册事件
 *     5、显示窗体
 */
public class MyText {
	public static void main(String[] args) {
		//创建窗体对象
		Frame f=new Frame();
		//设置窗体属性
		f.setTitle("文件组件");
		f.setSize(400,300);
		f.setLocation(400, 200);
		f.setLayout(new FlowLayout());

		//创建文本框,按钮,文本域对象并添加到窗体中
		final TextField tf=new TextField(20);
		Button btn=new Button("转到");
		final TextArea ta=new TextArea(12,40);
		//将它们添加到窗体中
		f.add(tf);
		f.add(btn);
		f.add(ta);

		//注册事件
		f.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent arg0) {
				System.exit(0);
			}

		});

		btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				//获取文本框的值
				String tf_str=tf.getText();
				//清空操作
				tf.setText("");
				//赋值给文本域
				ta.append(tf_str+"\r\n");
			}
		});
		//显示窗体
		f.setVisible(true);
	}
}
    运行后显示为:

                    
 菜单Menu


   先介绍下菜单体系:

                MenuBar菜单栏 添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。
        Menu 菜单  继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem
MenuItem 菜单项  无右三角的图标存在,是最终的菜单项。

     菜单栏上可以添加菜单,而每个菜单又可以添加菜单项。每个菜单项其实也可以是一个菜单
     在这儿需要注意的是:

               菜单栏和Frame的结合是通过Frame的setMenuBar方法


下面是菜单继承体系:

                


 菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象事件源添加活动监听ActionListener,并进行相关的事件处理。

 通过setMenuBar()方法,将菜单添加到Frame中。

 其实理论讲再详细,都不如拿一个实例来看,这样更容易理解。有时候特想多写点例子,又怕老师误以为懒省事,嘿嘿~~~ 

 下面是一个综合练习:

/*
 * 需求:创建一个窗体,里面有菜单  菜单栏 菜单项  点击相应菜单,及菜单项,实现其功能。
 * 菜单栏:MenuBar
 * 		菜单 Menu
 * 			菜单
 * 				菜单项
 * 			菜单项 MenuItem
 * 1个Frame
 * 1个MenuBar
 * 2个Menu
 * 5个MenuItem
 */
public class MyMenu {
	public static void main(String[] args) {
		//创建窗体
		final Frame fr=new Frame();
		//设置窗体属性
		fr.setTitle("多级菜单");
		fr.setLocation(300,300);
		fr.setSize(400,300);
		final String name=fr.getTitle();

		//创建菜单、菜单栏、菜单项的对象  并添加
		MenuBar mb=new MenuBar(); 
		Menu m1=new Menu("文件");
		Menu m2=new Menu("更改标题");
		final MenuItem mi1=new MenuItem("好好学习");
		final MenuItem mi2=new MenuItem("天天向上");
		MenuItem mi3=new MenuItem("恢复标题");
		MenuItem mi4=new MenuItem("退出系统");
		MenuItem mi5=new MenuItem("打开记事本");
		//在这儿一定要注意是谁添加谁
		m2.add(mi1);
		m2.add(mi2);
		m2.add(mi3);

		m1.add(m2);
		m1.add(mi4);
		m1.add(mi5);

		mb.add(m1);
		fr.setMenuBar(mb);

		fr.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		mi4.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				System.exit(0);
			}
		});
		mi5.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				//打开系统的记事本
				Runtime r=Runtime.getRuntime();
				try {
					r.exec("notepad");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		mi1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				fr.setTitle(mi1.getLabel());

			}
		});
		mi2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				fr.setTitle(mi2.getLabel());

			}
		});  
		mi3.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				fr.setTitle(name);
			}
		});
		// 设置窗体可见
		fr.setVisible(true);
	}
}
下面是运行结果:

                      

点开之后:

                                       

小小发泄一下:这个图好难截啊,点开后,一点截图就没了,无奈只能手机拍一张再传到电脑上,然后在截图了,呜呜呜呜~~~~



 到此,GUI的所有知识点儿就先总结到这儿啦,有些理解的不对的地方,真诚地希望大家帮我指正出来,谢谢!!!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值