黑马程序员--java基础--GUI总结

目录:一.GUI简述    二.常用的AWT组件     三.布局管理器     四.AWT事件处理      五.GUI组件上的图形操作   

一.GUI简述

      GUI全称是Graphical User Interface,即图形用户界面。

      JDK中提供了AWT和Swing两个包,用于GUI程序的设计和开发,Swing为在AWT基础上改进。

      AWT为重量型组件,SWING为轻量型组件,开发中建议使用Swing组件。

      程序的GUI部分由AWT线程管理

      test:让框架窗口显示5秒钟后关闭,查AWT的线程状态

二.常用的AWT组件:

     GUI组件可以分为两大类,基本组件和容器,分别是java.awt.Component和java.awt.Container的直接或者间接子类

     1.Container:容器显示以后,就不能添加新的组件了,否则无法显示
        a.Container类是所有容器类的父类,Container.add方法用于将组件添加到容器中
        b.Container也是Component的子类,因此也可以作为组件增加到其他容器上。    

        |--Container
             |-- Window:Frame、Dialog   BorderLayout
             |--Panel:Applet        FlowLayout
       Dialog与FileDialog:对话框不能独立存在,需要有一个上级窗口
       a.Dialog类用于产生对话框
       b.模态对话框与非模态对话框:模态对话框时不能进行窗口其他操作。
       c.Dialog类的两个常用构造方法:
          public Dialog(Frame owner,String title);
          public Dialog(Frame owner,String title,boolean modal);

public static void main(String[] args) {  
/       1.创建Frame组件:  
    Frame frame = new Frame("frame title");  
/       2.设置Frame组件属性:长宽及可见  
    frame.setSize(300,300);  
    frame.setVisible(true);       
} 


 2.GUI最基本的元素就是组件
        MenuComponent:菜单组件基类,也称为超类,其下有MenuBar、Menu、MenuItem
        Component:与菜单不相关的组件基类,也称为超类
    
        Canvas:
        a.是具有最基本的和最简单的GUI功能的组件
        b.代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,
            也能够捕获用户的操作,产生相应的事件
        c.当要设计自定义的具有GUI功能的组件类时,继承Canvas将会大大简化编程难度

 

        Component常用组件:Button、Label、CheckBox、TextComponent( TextArea、TextField)

       容器通过add方法来添加这些组件。

public static void main(String[] args) {  
        Frame frame = new _4ButtonOfFrameTest1().frame;  
        frame.setVisible(true);  
        frame.setSize(300,300);  
          
//      1.设置并通过窗口的add方法添加Button   
        Button btn = new Button("hello");  
        btn.addActionListener(new _4ButtonOfFrameTest1());  
            frame.add(btn);  
    }  


三.布局管理器:容器中的组件排列方式

         常见的布局管理器:

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

         2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器

         3)GridLayout:网格式布局管理器,规则的矩阵

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

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

public static void main(String[] args) {  
/       1.创建并设置窗体  
    final Frame frame = new Frame("button of frame3");  
    frame.setVisible(true);  
    frame.setSize(300, 300);  
/       2.设置布局管理器  
    frame.setLayout(new FlowLayout());  
/       3.添加组件,其显示效果为布局管理器设置  
    frame.add(new Button("yes"));  
    frame.add(new Button("no"));  
}  


四.AWT事件处理机制:事件监听器,它是一个接口,需要进行实现

         处理发生在某个GUI组件上的XxxEvent事件的某种情况,其事件处理的通用编写流程:

         1.编写一个实现了XxxListener接口的事件监听器类

         2.XxxListener类中的用于处理该事件情况的方法中,编写处理代码

         3.调用组件的addXxxListener方法,将类XxxListener创建的实例对象注册到GUI组件上。

class MyWindowAdapter extends WindowAdapter{  
    @Override  
//  使用注解防止覆盖方法形式错误   
    public void windowClosing(WindowEvent e){  
        Window window = e.getWindow();  
        window.setVisible(false);  
        window.dispose();  
        System.exit(0);  
    }  
}  

 

五.GUI组件上的图形操作

          1.绘制图形和图形重绘

            Graphics类与图形绘制

            Component.getGraphics方法与Graphics类

            Graphics.drawLine(int x1, int y1, int x2, int y2)方法

            Graphics.drawString(String str, int x, int y)方法

            Graphics.drawString方法的坐标参数(相对于左上角而言)

            AWT线程对组件重绘的调用过程:见图解(曝光即为改变大小了,如最小化最大化)。

 


 

          2.显示图片和双缓冲技术

             图像显示:
             使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法显示图像。
             使用Component.getToolkit.getImage(String path)语句获得Image实例对象。

//此时的图片显示是通过paint方法完成的,内部有自己的实现机制,我们正常使用drawImage方法即可。而且解决了曝光后的重绘问题。   
class MainFrame1 extends Frame{  
    Image img = getToolkit().getImage("images/girl.jpg");  
      
    public MainFrame1(){  
        this.addWindowListener(new WindowAdapter(){  
              
            @Override  
            public void windowClosing(WindowEvent e){  
                dispose();  
                System.exit(0);  
            }  
              
        });  
        repaint();  
    }  
          
    @Override  
    public void paint(Graphics g){  
        g.drawImage(img, 0, 0, this);  
    }  
      
}  


在前面使用paint绘制直线和图片的时候,需要存储每个图形元素的信息,如果元素较多且复杂,消耗资源严重
           双缓冲区技术:
           Component.createImage方法创建内存Image对象
           在Image对象上进行绘制的结果就成了一幅图像
           在Image对象执行与组件表面同样的绘制,Image对象中的图像时组件表面内容的复制,当组件重画时,只需将内存中的Image对象在组件上画出。
           当组件上图像较多时,效率会明显提升。

class MainFrame2 extends Frame{  
  
      int orgX,orgY,endX,endY;  
      Graphics og = null;  
      Image oimg = null;  
  
      //问题:如何在曝光后连带g的基本属性也都恢复?       
      @Override  
      public void paint(Graphics g){  
         if(oimg!=null){  
             g.drawImage(oimg, 0, 0, this);  
         }  
      }  
        
      public MainFrame2(){  
          this.setSize(700,1000);  
          this.setTitle("mainFrame2");  
          //设置显示为ture时,会调用paint方法,此时oimg尚未创建,所以paint方法编译时   
          //会报空指针异常,改进方式如上。          
          this.setVisible(true);  
  
            
          Dimension d = this.getSize();  
          oimg = this.createImage(d.width, d.height);  
          og = oimg.getGraphics();  
            
          this.addMouseListener(new MouseAdapter(){  
                
              @Override  
              public void mousePressed(MouseEvent e){  
                  orgX = e.getX();  
                  orgY = e.getY();  
                  System.out.println("world");  
              }  
                
              @Override  
              public void mouseReleased(MouseEvent e){  
                  endX = e.getX();  
                  endY = e.getY();  
                  Graphics g = getGraphics();  
                  g.setColor(Color.RED);  
                  System.out.println("hello");  
                  g.drawLine(orgX, orgY, endX, endY);  
                    
                  og.drawLine(orgX, orgY, endX, endY);  
              }  
                
          });  
            
          this.addWindowListener(new WindowAdapter(){  
                
              @Override  
              public void windowClosing(WindowEvent e){  
                  dispose();  
                  System.exit(0);  
              }  
                
          });  
      }  
      
}  



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值