GUI组件

 

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

GUI图形用户接口:
|----全称:Graphical User Inteface.与之相对的是命令行用户接口CLI(Command line User Interface)
|----对象包:java.Awt与java.Swing
 |----Awt( Abstract Window ToolKit )依赖于本地系统,属于重量级控件。
 |----Swing,在Awt的基础上,增加了更多的组件,而且完全由java实现,增加了可移植性。
|----布局:
 容器(Container)中的组件排列方式就是布局.
 常见的布局管理器:
 |----流式布局(Flow Layout)从左到右的顺序排列。pannel默认的布局管理器。
 |----边界布局( Border Layout )东南西北中.Frame默认的布局管理器。没有指定边界布局的东南西北,默认居中填充。
   public class buttonDir extends Applet {
     public void init() {
       setLayout(new BorderLayout());
       add(new Button("North"), BorderLayout.NORTH);
       add(new Button("South"), BorderLayout.SOUTH);
       add(new Button("East"), BorderLayout.EAST);
       add(new Button("West"), BorderLayout.WEST);
       add(new Button("Center"), BorderLayout.CENTER);
     }
   }
 |----GridLayout网格布局。规则的矩阵。
 |----GridBagLayout网格包。不规则的矩阵。
 |----CardLayout卡片布局管理器。
 如果在一个容器中存在两种布局,则将容器划分成一块一块的面板,在面板中设置不同的布局。
|----Frame
 |----图形化界面由另一个线程来控制,与主线程分开。
 |----创建图形化界面的步骤:
  1.创建frame窗体。new Frame( "title" )
  2.对窗体进行基本设置。如大小,位置,颜色。setSize( 横坐标,纵坐标 ),setLocation( 横,纵 )。f.setBounds( 300, 100, 500, 400 );
  3.定义组件,如new Button( "我是一个按钮" )
  4.将组件通过add方法添加到容器中。(容器运用了集合)
  5.让窗体显示,通过setVisible( true )
|----事件监听机制
 |----1.事件源。---按钮.窗体
        2.事件。---单击动作按钮,alt+f4
        3.监听器。---比如对窗口产生的动作,关闭窗口(点叉号或者alt+f4),窗口前置(Activated)这些结果都是通过事件所引发的
        4.事件处理。---对事件产生的结果进行处理,比如单击X事件,在监听器中产生关闭窗口的结果,然后就要在关闭窗口的方法中进行处理System.exit(0);
        事件源:就是awt和swing包中的那些图形界面组件
        事件:每一个事件源都有自己特有的对应事件和共性事件。
        监听器:可以将触发某一个事件的动作(不止一个动作)都已经封装到了监听器中。
        以上三者都在java中定义了,直接获取对象就可以。
        我们要做的就是对产生的动作进行处理
 |----适配器Adapter
  因为监听器都是一些接口,每次要使用监听器都要将方法复写一边很麻烦,因此就产生了适配器
  他将接口中的方法都实现了,但是都是空。如果用适配器则用到哪个方法就复写哪一个方法
  public abstract class WindowAdapter
  适配器要写成抽象类是为了不让用户建立对象
 |----具体例子:
   import java.awt.*;
   import java.awt.event.*;//这个事件包要导入
   class AwtDemo
   {
    public static void main(String[] args)
    {
     Frame f = new Frame( "我的窗口" );
     f.setSize( 500, 400 );
     f.setLocation( 300, 200 );
     f.setLayout( new FlowLayout() );
     Button b = new Button( "按钮" );
     f.add( b );
     f.addWindowListener( new MyWindowAdapter() );//使用**窗口的** addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。
     //当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,
     //并将 WindowEvent 传递给该方法。
     f.setVisible( true );

     System.out.println("Hello World!");
    }
   }

   class MyWindowAdapter extends WindowAdapter
   {
    public void windowClosing( WindowEvent e )//事件处理
    {
     System.out.println( "窗口关闭" );
     System.exit( 0 );
    }
    public void windowActivated(WindowEvent e)
    {
     System.out.println( "窗口前置" );
    }
    public void windowOpened(WindowEvent e)
    {
     System.out.println( "窗口打开" );//在窗口被打开时,这里可以做一些处理
    }
   }
 |----Action事件
  ActionListener是少数几个没有适配器(Adapter)的监听器,他只有一个方法,所以不需要适配器。超过2个方法的监听器就有适配器。
   private void myEvent()//整个框架中每个事件源进行监听器注册
   {
    f.addWindowListener( new WindowAdapter()
    {
     public void windowClosing( WindowEvent e )
     {
      System.exit( 0 );
     }
    });
    but.addActionListener( new ActionListener()
    {
     public void actionPerformed(ActionEvent e)//发生操作时调用,比如点击了按钮就算发生操作
     {
      System.out.println( "退出,按钮干的" );
      System.exit( 0 );
     }
    });
   }
 |----鼠标动作
  |---but按钮上有两个监听器,点击鼠标先执行鼠标点击事件处理,在执行Action事件处理,因为鼠标单击更具体
    but.addMouseListener( new MouseAdapter()
    {
     private int count;
     private int mouseCount;
     public void mouseClicked(MouseEvent e)
     {
      if( e.getClickCount() == 2 )
      {
       System.out.println( "鼠标双击" );
      }
      //System.out.println( "退出,鼠标单击" + count++ );
      //System.exit( 0 );
     }
     public void mouseEntered(MouseEvent e)
     {
      System.out.println( "鼠标进入"+ mouseCount++ );
     }
 
    });
 |----键盘动作
   //添加键盘监听器
   but.addKeyListener( new KeyAdapter()
   {
    public void keyPressed( KeyEvent e )//键盘按下,即输入字符或者字符串
    {
     //System.out.println( KeyEvent.getKeyText( e.getKeyCode() ) + "..."+e.getKeyCode() );
     //public boolean isControlDown() 为一些组合键提供的函数还有Shift Alt 等等。在 java.awt.event.InputEvent包中
     if( e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown() )//QQ发送消息的快捷键
     {
      System.out.println( "ctrl+entry" );
     }
    }
   } );
   //为文本框添加监听器。
   //事件源上操作的不一定是自己。比如按钮接收单击事件,但是单击操作打印的是文本框中的内容
   text.addKeyListener( new KeyAdapter()
   {
    public void keyPressed( KeyEvent e )
    {
     int num = e.getKeyCode();
     if( !(num <= KeyEvent.VK_9 && num >= KeyEvent.VK_0) )
     {
      System.out.println( "输入非法字符" );
      e.consume();//不会按照默认的方式由产生此事件的源代码来处理此事件。
     }=-
    }
   } );
 |----练习:列出指定目录内容
  class MyWindow
  {
   private Frame f;
   private Button but;
   private TextField tf;
   private TextArea ta;
   MyWindow()
   {
    init();
   }
   private void init()
   {
    f = new Frame( "窗口" );
    f.setBounds( 300, 100, 600, 500 );
    f.setLayout( new FlowLayout() );
    tf = new TextField( 60 );
    f.add( tf );
    but = new Button( "转到" );
    f.add( but );
    ta = new TextArea( 25, 70 );
    f.add( ta );
    f.setVisible( true );
    //myEvent();
   }
   public void myEvent()
   {
    f.addWindowListener( new WindowAdapter()
    {
     public void windowClosing( WindowEvent e )
     {
      System.exit( 0 );
     }
    } );
    but.addActionListener( new ActionListener()
    {
     public void actionPerformed( ActionEvent e )
     {
      //得到文件目录的字符串
      String dirPath = tf.getText();
      //将文件目录封装成一个文件对象
      File dir = new File( dirPath );
      if( dir.exists() && dir.isDirectory() )
      {
       String[] names = dir.list();
       //将文本区原来的内容清空
       ta.setText( "" );
       for( String name: names )
       {
        ta.append( name+"\r\n" );
       }
      }
     }
    });

   }
   public static void main(String[] args)
   {
    //myEvent();无法在静态方法中引用非静态方法,非静态方法依赖于对象存在
    //可以将myEvent写入到初始化函数中或者这样
    new MyWindow().myEvent();
   }
  }
 |----对话框Dialog
  |----Dialog一般不自己单独存在,依赖于窗口或者其他组件,因此他的构造函数是其他组件的实例
   Dialog(Frame f, String title, boolean modal) 第三个参数为true则不关闭当前对话框则
   不能修改Frame的内容
  |----对话框中如果有Label标签,那么需要在d.setVisible()之前设置标签文字,否则不会显示。在Frame中setVisible
   不需要限定位置,只要保证放在f 有具体引用(即不能时空指针)即可。
   setVisible();之后在注册的事件注册不上,执行到这个语句会发生线程阻塞
  |---- private void myEvent()
  {
   but.addActionListener( new ActionListener()
   {
    public void actionPerformed( ActionEvent e )
    {
     String dir = tf.getText();
     File dirpath = new File( dir );
     if( dirpath.exists() && dirpath.isDirectory() )
     {
      String[] names = dirpath.list();
      for( String name : names )
      {
       ta.append( name+"\r\n" );
      }
     }
     else
     {
      final Dialog d = new Dialog( f, "提示", true );
      Button butok = new Button( "确定" );
      Label lab = new Label( dir+"不存在" );
      d.setBounds( 350, 150, 200, 120 );
      d.setLayout( new FlowLayout() );
      d.add( butok );
      d.add( lab );
      //d.setVisible( true );这行应该放在所有事件注册完毕之后。不然后面事件监听注册不上,注册不上因为运行到这里线程阻塞
      //Dialog的第三个参数就是设置模态对话框,如果是模态Modal Dialogue Box模态对话框显示后,父对话框时要等待模态对话框响应完成了才会继续执行的。

      butok.addActionListener( new ActionListener()
      {
       public void actionPerformed( ActionEvent e )
       {
        d.setVisible( false );
       }
      });
      d.addWindowListener( new WindowAdapter()
      {
       public void windowClosing( WindowEvent e )
       {
        d.setVisible( false );
       }
      });
      d.setVisible( true );
     }
    }
    应该是final Dialog d = new Dialog(f, "提示", true);这一行的原因。你的Dialog构造器第3个参数设为false就可以了。
    原因是modal为true的Dialog执行setVisible(true)之后线程阻塞,后面的代码要等Dialog关闭之后才会执行。

 ------- android培训、java培训、期待与您交流! ----------   详细请查看:http://edu.csdn.net/heima/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值