黑马程序员——Java基础知识——GUI

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! 

一、概述

       GUI(GraphicalUser Interface) ,图形用户界面,是计算机与用户交互的方式。计算机与用户交互有两种方式:GUI和CLI。对两种方式的特点进行介绍:

       GUI:GraphicalUser Interface,图形用户接口,用图形方式,显示计算机操作界面,方便直观。

       CLI:Command LineUser Interface,命令行用户接口,就是常见的Dos命令行操作,需要记住一些命令,操作不直观。

       Java将GUI提供的对象,都存在于两个包中:java.Awt包和java.Swing包。 

        java Awt包:Abstract Window Toolkit,抽象窗口工具包。要调用本地系统方法实现功能,属重量级控件。

           java Swing包:在Awt的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由Java实现,增强了移植性,属轻量 级控件

         还有一个 Eclipse提供的Swt包。

        通过下图了解java中各组件之间的继承关系。如图:

   黑马程序员——Java基础知识——GUI_第1张图片


Container:容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。

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

 Window常用子类:Frame Dialog

二、布局管理器

       布局就是容器的组件排列方式。

       常见的布局管理器:

        (1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器。

        (2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame默认的管理器。窗体中只有一个组件时,覆盖整个窗体

        (3)GridLayout:网格式布局管理器,规则的矩阵,如计算器。

          (4)CardLayout:卡片式布局管理器,即选项卡。

          (5)GridBayLayout:网格包布局管理器,非规则矩阵

         如果存在多种布局方式,如何创建窗体界面呢?步骤:

        (1)先将窗体Frame进行大区域的划分,设置其布局管理器,加入面板Panel

        (2)将组件加入Panel,设置面板的布局管理器。

 三、窗体的创建过程

         步骤:1.创建Frame窗体  Frame f=new Frame(标题);

                    2.对窗体进行基本设置,如大小、位置、布局等。

                       f.setSize(int wight,int hight) 设置窗体大小

                       f.setLocation(int x,int y) 设置窗体显示位置,x为横坐标

                         f.setBounds(int x,int y,int wight,int hight) 直接设置窗体的位置和大小

                       f.setLayout(Layout  layout) 选择布局格式。

                     3.定义组件。如:Button b=new Button(按钮名);

                     4.将组件添加到窗体中。f.add(b);

                     5.显示窗体  f.setVisible(true);如果传入false窗体不显示。

        下面通过一段代码展示整个过程:

public static void main(String[] args)
 	{
       //创建窗体
		Frame f=new Frame("我的窗体");
	   //对窗体进行基本设置
		f.setBounds(400, 500, 400, 350);//设置窗体的位置和大小
		f.setLayout(new FlowLayout());//设置流式布局
		//定义组件
		Button b=new Button("按钮");
		//添加组件
		f.add(b);
		//显示窗体
		f.setVisible(true);
	} 

     在运行程序后,发现无法直接在窗体上实现关闭,这时就需要学习图形化界面中事件监听机制,来实现窗体的操作。

四、事件的监听机制

      首先通过事件的监听流程图,对事件的监听机制进行一下认识,如图:

黑马程序员——Java基础知识——GUI_第2张图片

组成部分:

       事件源:awt或swing包中的图形界面组件。

       事件(Event):每一个事件都有自己特有的对应事件和共性事件。

       监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到监听器里。 

       事件处理:引发事件后的处理方式。

      事件源、事件、监听器可以通过获取其对象来使用,最后的事件处理方式需要自己定义。

 操作步骤:

        1.确定事件源,作用在窗体 ,还是窗体的哪个组件上。

        2.通过事件源对象的addXXXlistener()方法将监听器注册到该事件源上。 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类表示该对象。

        3.覆盖方法,方法的参数一般是XXXEvent类型的变量。在事件触发后就会把事件打包成对象传递给这个变量。

      下面通过具体的几个程序学习各种操作事件包括键盘事件、鼠标事件等的监听和处理过程。如下:

/**
 创建一个窗体 ,并让窗体和按钮都能实现关闭窗体的功能
*/
class EventDemo
{
  //定义组件引用
  private Frame f;
  private Button b;
  EventDemo(){
     init();
  }
  //创建窗体,实现功能
  private  void  init(){
	 //创建窗体
	  f=new Frame("My Frame");
	 //对窗体进行基本设置
	  f.setBounds(300,100,600,500);
	  f.setLayout(new FlowLayout());
	 //添加组件
	  b=new Button("My Button");
	  f.add(b);
	  //加载事件
	  myEvent();
	  //显示窗体
	  f.setVisible(true);
  }
   //注册事件
  private  void  myEvent(){
   //实现窗体的关闭功能
	f.addWindowListener(new WindowAdapter() {
	   public void windowClosing(WindowEvent e){
		   System.exit(0);
	   }
	});
   //实现按钮的关闭功能
	b.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
	        System.exit(0);
		}
	});
  }		
  public static void main(String[]args){
	  //运行窗体
	  new EventDemo();
  }
}
从上面的程序可以得到几个知识点:1.当要添加的监听器内的方法很多时(一般超过2个),这时可以添加它的子类XXXAdapter来代替,XXXAdapter已经覆盖了对应的监听器的方法,添加时只需要覆盖需要的方法即可。2.查阅组件的功能,选择要添加的监听器。3.明确事件,并对事件处理。添加什么监听器,就需要添加什么事件。

/**
 给按钮添加键盘、鼠标监听。
*/
class EventDemo 
{
    //定义组件引用
    private Frame f;
    private Button but;

    EventDemo()
    {
     init();
    }

    private void init()
    {
      //创建窗体
      f = new Frame("my frame");
      //窗体设置
      f.setBounds(300,100,600,500);
      f.setLayout(new FlowLayout());
     //创建组件
      but = new Button("my button");
      //添加组件
      f.add(but);
      //加载事件
      myEvent();
      //显示窗体
      f.setVisible(true);

	}
	private void myEvent()
	{
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});

		//给按钮添加键盘监听。
		but.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{	
			 if(e.getKeyCode()==KeyEvent.VK_ENTER)
				 System.out.println("enter is coming");
            }
		});
		//给按钮添加鼠标监听
		but.addMouseListener(new MouseAdapter()
		{
			private int count = 1;
			private int clickCount = 1;
			public void mouseEntered(MouseEvent e) 
			{
				System.out.println("鼠标进入到该组件"+count++);
			}
			public void mouseClicked(MouseEvent e)
			{
				if(e.getClickCount()==2)
					System.out.println("双击动作"+clickCount++);
			}
		});
		
	}

        public static void main(String[] args) 
	{
		new EventDemo();
	}
}
要注意的是一个组件上如果即添加了鼠标监听,又添加了活动监听,会先执行鼠标监听的处理动作。

/**
列出指定目录内容
*/
class  EventDemo
{       
    //定义组件引用
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	
    EventDemo()
	{
		init();
	}
	//窗体创建,功能实现
    private void init()
	{
		f = new Frame("My Frame");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		tf = new TextField(60);
        but = new Button("转到");
        ta = new TextArea(25,70);
        //添加组件
        f.add(tf);
		f.add(but);
		f.add(ta);
        //加载事件
        myEvent();
		//显示窗体 
        f.setVisible(true);
	}
	private void  myEvent()
	{
     //文本框添加键盘监听
     tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
			}
		});

                //按钮添加活动监听
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				showDir();
				
			}
		});                 
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);	
			}
		});
	}
    //定义显示目录内容的方法
	private void showDir()
	{
	  //获得录入的目录
      String dirPath = tf.getText();
	  File dir = new File(dirPath);
      //若目录存在,在文本区显示目录下的内容。
		if(dir.exists() && dir.isDirectory())
		{
			ta.setText("");
			String[] names = dir.list();
			for(String name : names)
			     ta.append(name+"\r\n");
	        }
		
        }

	public static void main(String[] args) 
	{
		new EventDemo();
	}
}
注意的是这个窗体在运行时,用户有可能输入的不是一个目录,这时就需要对用户进行提醒,就需要另一个组件——对话框。下面就通过建立对话框,完善该程序的功能,在输入错误的信息时,就调用对话框,提醒用户。如下:

class  EventDemo
{       
    //定义组件引用
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	private Dialog d;
	private Label lab;
	private Button dBut;

    EventDemo()
	{
		init();
	}
	//窗体创建,功能实现
    private void init()
	{
		f = new Frame("My Frame");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());

		tf = new TextField(60);
        but = new Button("转到");
        ta = new TextArea(25,70);
        //将窗体、标题、模式传入
        d = new Dialog(f,"提示信息",true);
		d.setBounds(400,200,240,150);
		d.setLayout(new FlowLayout());
		lab = new Label();
		dBut = new Button("确定");

        //添加组件
		d.add(lab);
		d.add(dBut);
		f.add(tf);
		f.add(but);
		f.add(ta);
        //加载事件
        myEvent();
	//显示窗体 
        f.setVisible(true);
	}
	private void  myEvent()
	{
     //文本框添加键盘监听
     tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
			}
		});

        //按钮添加活动监听
		but.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				showDir();
				
			}
		});                 
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);	
			}
		});
		//给对话框的按钮添加活动监听。
		dBut.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				d.setVisible(false);
			}
		});
		//给对话框添加窗口监听
		d.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				d.setVisible(false);
			}
		});
	}
    //定义显示目录内容的方法
	private void showDir()
	{
	  //获得录入的目录
      String dirPath = tf.getText();
	  File dir = new File(dirPath);
      //若目录存在,在文本区显示目录下的内容。
		if(dir.exists() && dir.isDirectory())
		{
			ta.setText("");
			String[] names = dir.list();
			for(String name : names)
			     ta.append(name+"\r\n");
	    }
		//目录不存在,让对话框可见,提醒用户。
		else
		{
			String info = "您输入的信息:"+dirPath+"是错误的。请重输";
			lab.setText(info);
			d.setVisible(true);
		}
        }

	public static void main(String[] args) 
	{
		new EventDemo();
	}
}
五、菜单

 黑马程序员——Java基础知识——GUI_第3张图片 

         菜单栏(MenuBar):可添加菜单和菜单条目。要先创建菜单栏,再创建菜单。通过setMenuBar()方法,将菜单栏添加到窗体中

         菜单(Menu):继承菜单项,可添加菜单和菜单项。

         菜单项(MenuItem):最终的菜单项。

         下面通过一个程序展示菜单的建立以及菜单功能的实现 ,如下:         

/**
建立一个具有退出功能的菜单项
*/
class EventDemo 
{
    private Frame f;
	private MenuBar mb;
	private Menu m,subMenu;
	private MenuItem closeItem,subItem;

	EventDemo()
	{
		init();
	}
	public void init()
	{
	 f = new Frame("My Frame");
	 f.setBounds(300,100,500,600);
	 f.setLayout(new FlowLayout());
        //创建菜单、菜单栏、菜单项对象
	mb = new MenuBar();
        m = new Menu("文件");
        subMenu = new Menu("子菜单");
        subItem = new MenuItem("子条目");
	closeItem = new MenuItem("退出");
		
	subMenu.add(subItem);
        m.add(subMenu);
	m.add(closeItem);
	mb.add(m);
        //添加菜单栏
	f.setMenuBar(mb);
       //加载事件
	myEvent();
        //显示窗体
	f.setVisible(true);

    }
	private void myEvent()
	{
                //给菜单项添加监听
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);	
			}
		});
	}
	
	public static void main(String[] args) 
	{
		new EventDemo();
	}
}
通过对菜单项或菜单添加活动监听,可以进行对应的事件处理,实现功能。

        下面利用菜单制作一个简易的记事本程序,这时就需要另一个组件——FileDialog(文件对话框),具体程序如下:

public class EventDemo
{
    //定义组件引用
	private Frame f;
	private MenuBar bar;
	private TextArea ta;
	private Menu fileMenu;
	private MenuItem openItem,saveItem,closeItem;
    private FileDialog openDia,saveDia;
    private File file;
	EventDemo()
	{
		init();
	}
	public void init()
	{
		f = new Frame("my window");
		f.setBounds(300,100,650,600);

		bar = new MenuBar();

		ta = new TextArea();

		fileMenu = new Menu("文件");
		
		openItem = new MenuItem("打开");
		saveItem = new MenuItem("保存");
		closeItem = new MenuItem("退出");
		
		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(closeItem);
		bar.add(fileMenu);

		f.setMenuBar(bar);

        //建立文件对话框,传入窗体、标题、模式
		openDia = new FileDialog(f,"打开",FileDialog.LOAD);
		saveDia = new FileDialog(f,"保存",FileDialog.SAVE);
       //在窗体上添加文本区
       f.add(ta);
	   //加载事件
       myEvent();
      //显示窗体
	  f.setVisible(true);


	}
	private void myEvent()
	{
        //给保存菜单项添加活动监听
		saveItem.addActionListener(new ActionListener()
		{
		
			public void actionPerformed(ActionEvent e)
			{
				//若文件为新建,利用文本对话框获取存入地址。
                if(file==null)
				 {  //显示文件对话框
					saveDia.setVisible(true);

					String dirPath = saveDia.getDirectory();
					String fileName = saveDia.getFile();
					if(dirPath==null || fileName==null)
						return ;
					file = new File(dirPath,fileName);
				}
                //将内容写入文件中
				try
				{
					BufferedWriter bufw  = new BufferedWriter(new FileWriter(file));
                    String text = ta.getText();
                    bufw.write(text);
					bufw.flush();
					bufw.close();
				}
				catch (IOException ex)
				{
					throw new RuntimeException("保存失败");
				}
				
			}
		});

        //给打开菜单项添加活动监听
		openItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				openDia.setVisible(true);
				String dirPath = openDia.getDirectory();
				String fileName = openDia.getFile();
                if(dirPath==null || fileName==null)
					return ;
                //清空文本区
				ta.setText("");
				file = new File(dirPath,fileName);
               //读取打开的文件,写入文本区中
				try
				{
					BufferedReader bufr = new BufferedReader(new FileReader(file));

					String line = null;

					while((line=bufr.readLine())!=null)
					{
						ta.append(line+"\r\n");
					}

					bufr.close();
				}
				catch (IOException ex)
				{
					throw new RuntimeException("读取失败");
				}


			}
		});
                  
        //给关闭菜单项添加活动监听  
        closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);	
			}
		});
	}
	
	public static void main(String[] args) 
	{
		new EventDemo();
	}
}


 
  

-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

你可能感兴趣的:(Java学习)