黑马程序员_GUI

------- android培训java培训、期待与您交流! ---------- 

 

          java_GUI

 

GUI(图形用户界面)


 GUI

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


 CLI
  Command line User Interface
(命令行用户接口)
  就是常见的Dos命令行操作。
 需要记忆一些常用的命令,操作不直观。

 

 举例:
  比如:创建文件夹,或者删除文件夹等
 Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。

 

Awt和Swing
 java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
 javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全 由Java实现。增强了移植性,属轻量级控件。

 

 

继承关系图


Component
 |--Container:可包含其他 AWT 组件的组件。
          |--Window:窗口
               |--Frame:框架
               |--Dialog:对话框
                          |--FileDialog:文件对话框
          |--Panel:面板
 |--Button:按钮
 |--Label:标签,作用是封装文字
 |--Checkbox:复选框
 |--TextComponent:文本组件
          |--TextArea:文本框
          |--TextField:文本区域

 

 注意:
  Component的子类区别:Container可以添加其他组件.而其他组件不行.
//-------------------------------------------------------------------


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

 常见的布局管理器:


  FlowLayout(流式布局管理器)
   从左到右的顺序排列。

 

  Panel默认的布局管理器。


  BorderLayout(边界布局管理器)
   东,南,西,北,中


   Frame默认的布局管理器。

 

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

 

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

 

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


 Component 类java.awt 包中:


  component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的
  按钮、复选框和滚动条都是组件示例。 Component 类是与菜单不相关的 Abstract Window Toolkit 组件的抽
  象超类。还可以直接扩展类 Component 来创建一个轻量级组件。轻量级组件是与本机不透明窗口不相关的组件。


  Component
            |--Button:按钮   


    常用方法:


     void | setBounds(int x, int y, int width, int height) 
                                      移动组件并调整其大小。


    Button(String label) 
                                    构造一个带指定标签的按钮。


 
  Component
            |--Container类


    常用方法:


    Component | add(Component comp)

                                    将指定组件追加到此容器的尾部。

 

    void | setLayout(LayoutManager mgr)
                                   设置此容器的布局管理器。
    **********************************************


可包含其他 AWT 组件的组件。

         Container:
               |--Window:窗口的常见方法

 

      void | setSize(int width, int height)
                                  调整组件的大小,使其宽度为 width,高度为 height。

    
      void | setVisible(boolean b)
                                  根据参数 b 的值显示或隐藏此 Window。
    **********************************************


       Container:可包含其他 AWT 组件的组件。
                  |--Window:窗口
                           |--Frame:框架的方法:

 

        Frame(String title)
                           构造一个新的、最初不可见的、具有指定标题的 Frame 对象。

 

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

创建图形化界面:


1,创建frame窗体。

2,对窗体进行基本设置。
 比如大小,位置,布局。
3,定义组件。

4,将组件通过窗体的add方法添加到窗体中。

5,让窗体显示,通过setVisible(true)

 

简单示例:


 

import java.awt.*;//导入awt包来用里面的类和方法
class AwtDemo
{
 public static void main(String[] args) 
 {

  Frame f=new Frame("百鑫制作");//创建一个Frame窗体.

  f.setSize(500,400);//设置窗体的长宽

  f.setLocation(300,200);//设置距离横向和纵向坐标

  f.setLayout(new FlowLayout());//设置布局FlowLayout流式布局,从左到右的顺序排列。

  Button b= new Button("按钮");//创建一个按钮

  f.add(b);//将按钮添加到窗体中
  f.setVisible(true);//显示窗体.
 }
}


//-----------------------------------------------------------------------------
事件监听机制的特点:


1.事件源:就是awt包或者swing包中的那些图形界面组件。

 

2.事件:每一个事件源都有自己特有的对应事件和共性事件。

 

3.监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
(以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情是,就是对产
生的动作进行处理。)

 

4.事件处理。

 

 窗口监听器:


  Window类中
    void addWindowListener(WindowListener l)
    添加指定的窗口侦听器,以从此窗口接收窗口事件。

 

 

  例如:用匿名内部类实现. 


  f.addWindowListener(new WindowAdapter()//事件源是f.也就是窗口
  {
   public void windowClosing(WindowEvent e)//窗口里面关闭的方法.
   {
    System.out.println("我关");
    System.exit(0);//关闭窗口
   }
  });
  ps:如果想让按钮具有关闭功能.就在按钮事件源上面找监听器.同样匿名内部类覆盖方法.

 

共性事件:


 鼠标和键盘:


  既然是共享.所有的组件都具备.
   在 Component 中


    void addKeyListener(KeyListener l)
      添加指定的按键侦听器,以接收发自此组件的按键事件。

 

     例如:
      建立文本框只能输入1234567680.
    

 tf.addKeyListener(new KeyAdapter()//tf.代表文本框.确定事件源是文本框
      {
       public void keyPressed(KeyEvent e) //键盘事件
       {
        //处理事件
        int code=e.getKeyCode();//getKeyCode.键盘事件中KeyEvent的方法,键关联的整数 keyCode
        if(!(code<=KeyEvent.VK_9 && code>=KeyEvent.VK_0))//判断是否是大于九还是小于零
        {
         System.out.println(code+"...是非法的");//如果大于9,小于零提示非法
         e.consume();//提示非法之后还能打印.就用到了KeyEvent父类的方法consume() 不会按照默认方式处理此事件。
        }
       }
      }); 
    void addMouseListener(MouseListener l) 
      添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。 

      例如:
      but.addMouseListener(new  MouseAdapter()
      {
       int count1=0;
       public void mouseEntered(MouseEvent e)//鼠标放在按钮上就打印
       {
        System.out.println(count1++);
       }
       public void mouseClicked(MouseEvent e)
       {
        if(e.getClickCount()==2)//判断次数.getClickCount()在单机的方法里面详情参见API
         System.out.println("双击机");
       }
      }); 



//-----------------------------------------------------------------------------
示例:

import java.awt.*;//导入包
import java.awt.event.*;
import java.io.*;//涉及到IO技术导入IO包
class  MyWindowDemo
{
 private Frame f;//建窗体
 private TextField tf;//文本框
 private Button but;//按钮
 private TextArea ta;//文本区域
 
 private Dialog d;//对话框
 private Label lab;//标签.作用是封装文字的
 private Button okBut;//对话框的按钮


 MyWindowDemo()//构造函数,程序一运行就执行init()函数
 {
  init();
 }
 public void init()
 {
  f = new Frame("my window");//建立窗体
  f.setBounds(300,100,600,500);//设置窗体的坐标,和距离左上屏幕的坐标
  f.setLayout(new FlowLayout());//建立窗体的布局(流式布局)

  tf = new TextField(60);//文本框,长度为六十

  but = new Button("转到");//建立按钮

  ta = new TextArea(25,70);//建立文本区域,竖着为25,横向70


  d = new Dialog(f,"提示信息-self",true);//建立对话框,依赖于f窗体,true是对话框出现之后f不可以被操作了
  d.setBounds(400,200,240,150);//设置对话的大小
  d.setLayout(new FlowLayout());//建立对话框的布局(流式布局)
  lab = new Label();//建立标签
  okBut = new Button("确定");//建立标签的按钮

  d.add(lab);//将标签添加到对话框中
  d.add(okBut);//将按钮添加到对话框中

 

  f.add(tf);//将文本框添加到窗体上
  f.add(but);//将按钮添加到窗体上
  f.add(ta);//将文本区域添加到窗体上


  myEvent();//调用事件的函数
  f.setVisible(true);//显示窗体
 }
 private void  myEvent()
 {
  //事件源是对话框的按钮,事件是按钮发生操作时,处理时间是按钮发生操作对话框不显示
  okBut.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    d.setVisible(false);
   }
  });
  //事件源是对话框,事件是对话框关闭.处理是点击X对话框不显示
  d.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    d.setVisible(false);
   }
  });
  //事件源是文本框,事件是键盘,处理是按回车,执行showDir()函数.
  tf.addKeyListener(new KeyAdapter()
  {
   public void keyPressed(KeyEvent e)
   {
    //判断是否是回车,getKeyCode在键盘事件的KeyAdapter里面
    if(e.getKeyCode()==KeyEvent.VK_ENTER)
     showDir();
   }
  });
  //事件源是窗体的按钮,时间是发生操作,处理时执行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);//用IO的File类,来判断路径

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


 

 结论:

1.如果关闭窗口的做动作.就在窗口中找监听器,如果找不到就找父类.


  2.监听器接收的是一个接口类型的参数.很多方法要要全覆盖,java为了方便
  就建立类实现接口,一般名字都叫做XXXAdpter.


  3.事件监听的类等都在包中.所以一般要导入import java.awt.event.*;和
  import java.awt.*;两个包
//-----------------------------------------------------------------------------


GUI(菜单)
 MenuComponent
            |--MenuBar 类 java.awt包中


 MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。


    构造方法摘要


    MenuBar() : 创建新的菜单栏。

 

   方法:


     Menu add(Menu m)  :
将指定的菜单添加到菜单栏。

 

 MenuComponent
            |--Menu 类 java.awt包中.下拉式菜单组件。

 
   构造方法摘要


    Menu(String label) : 构造具有指定标签的新菜单。

 

   方法:


    MenuItem add(MenuItem mi) :
将指定的菜单项添加到此菜单。
    

 

 MenuComponent
              |--MenuItem 类 java.awt包中.也就是子条目


   构造方法摘要


    MenuItem(String label) : 构造具有指定的标签且没有键盘快捷方式的新菜单项。

 

   方法:


     void | addActionListener(ActionListener l)
       添加指定的动作侦听器,以从此菜单项接收动作事件。


 思路:


 菜单条
    |--子条目
    |--子菜单(也是菜单)
         |字菜单++
                |子条目

//-----------------------------------------------------------------------------


文件的保存和打开
Component
     |--Container
         |--Window
            |--Dialog
                 |--FileDialog

 

 FileDialog 类显示一个对话框窗口,用户可以从中选择文件。
  由于它是一个模式对话框,当应用程序调用其 show 方法来显示对话框时,它将阻塞其余应用程序,直到用户选择一个文件。

 

  构造方法:


   FileDialog(Frame parent, String title, int mode)
       创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
      
     static int LOAD
      此常量值指示文件对话框窗口的作用是查找要读取的文件。
     static int SAVE
      此常量值指示文件对话框窗口的作用是查找要写入的文件。 .


  方法:


   String | getDirectory()
                     获取此文件对话框的目录。
    
   String | getFile() 
                     获取此文件对话框的选定文件。

 

示例:

/*
文件的保存和打开
*/
import java.awt.*;//导入包
import java.awt.event.*;
import java.io.*;

public class MyMenuTest
{
 //建立设为私有
 private Frame f;//窗体
 private MenuBar bar;//菜单栏
 private TextArea ta;//文本区域
 private Menu fileMenu;//菜单
 private MenuItem openItem,saveItem,closeItem;//字条目


 private FileDialog openDia,saveDia;//文件打开和关闭

 private File file;
 MyMenuTest()//构造函数.初始化就执行init函数
 {
  init();
 }
 public void init()
 {
  f = new Frame("百鑫制作");//建立窗体
  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);//创建打开,LOAD代表打开
  saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);//SAVE代码保存


  f.add(ta);//将文本区域添加到窗体中
  myEvent();

  f.setVisible(true);


 }
 private void myEvent()
 {
  //事件源是子条目保存,事件是发生操作,处理是保存.
  saveItem.addActionListener(new ActionListener()
  {
  
   public void actionPerformed(ActionEvent e)
   {
    BufferedWriter bufw =null;
    if(file==null)
    {
     //判断file是否为空,如果是空的话提示对话框保存并,
     saveDia.setVisible(true);

     //获取目录和文件
     String dirPath = saveDia.getDirectory();
     String fileName = saveDia.getFile();

     //点击对话框取消的时候,会发生异常,进行判断
     //目录或者文件是空的话就返回
     if(dirPath==null || fileName==null)
      return ;

     //创建文件.获取文件目录和文件的抽象信息
     file = new File(dirPath,fileName);
    }

    try
    {
     //建立字输出符流容器.
     bufw= new BufferedWriter(new FileWriter(file));
     
     String text = ta.getText();//调用TextArea父类的getText()方法,获取文本组件表示的文本

     bufw.write(text);//输出.
    
    }
    catch (IOException ex)
    {
     throw new RuntimeException("保存错误啦");
    }
    finally
    {
     try
     {
      if(bufw!=null)
       bufw.close();//关闭流
     }
     catch (IOException ex)
     {
      throw new RuntimeException("字符输出流关闭失败");
     }
    }
   }
  });
  //事件源是openItem打开.事件是发生操作时.处理时保存
  openItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    BufferedReader bufr =null;

    //提示对话框打开,获取路径和文件
    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
    {
     //建立字输出符流容器.
     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("读取失败");
    }
    finally
    {
     try
     {
      if(bufr!=null)
       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 MyMenuTest();
 }
}



//-----------------------------------------------------------------------------
Jar包:
 Javac –d –cvfmy.jar
 
 自定义jar包中,添加属性,自动执行默认class文件。
 
 如建立1.txt,内容为:
 
 Main-Class: mymenu.MyMenuTest     (分号后面有个空格,最后还要有个回车)
 
 Javac –d –cvfm1.txt  mymenu

------- android培训java培训、期待与您交流! ---------- 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值