GUI组件上的图形操作-3

    技术2025-01-09  48

    1)      Graphics类与图形绘制

     

    package GUI;

     

    import java.awt.*;

    import java.awt.event.*;

     

    public class DrawLine extends Frame {

      public DrawLine()//添加构造方法

      {

             addWindowListener(new WindowAdapter(){//注册窗口适配器

     

     

                    public void windowClosing(WindowEvent arg0) {//重写关闭窗口的方法

                           dispose();     //释放该窗口

                           System.exit(0);//停止程序的运行

                    }

     

             });

             this.addMouseListener(new MouseAdapter(){

                    int orgX;//初始点的横坐标

                    int orgY;//初始点的纵坐标

                    public void mousePressed(MouseEvent e)

                    {

                           orgX=e.getX();//获得初始点的横坐标

                           orgY=e.getY();//获得初始点的纵坐标

                    }

                    public void mouseReleased(MouseEvent e)

                    {

                           Graphics graphics=getGraphics();//定义一个画图对象

                           graphics.setColor(Color.RED);  //设置字体的颜色为红色

                           graphics.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));//设置字的格式

                           graphics.drawString(orgX+","+orgY, orgX, orgY);//在初始坐标处划线

                           graphics.drawString(e.getX()+","+e.getY(), e.getX(), e.getY());//在末坐标处划线

                           graphics.drawLine(orgX, orgY, e.getX(), e.getY());//根据初始坐标和末坐标画线

                    }

             });

      }

      public static void main(String[] args) {

             System.out.println("starting TestMyButton..");

             DrawLine drawLine=new DrawLine();//实例化定义的创库

             drawLine.setSize(400, 400);//设置窗口的大小

             drawLine.setTitle("TestMyButton");

             drawLine.setVisible(true);

      }

    }

     

    2)      组件重绘的处理

    直线类:

    package GUI;

     

    import java.awt.*;

    import java.awt.event.*;

    import java.util.*;

     

    public class MyLine {

        private int orgX;

        private int orgY;

        private int endX;

        private int endY;

        public MyLine(int orgX,int orgY,int endX,int endY)

        {

           this.orgX=orgX;

           this.orgY=orgY;

           this.endX=endX;

           this.endY=endY;

        }

        public void drawMe(Graphics g)

        {

           g.setColor(Color.RED);  //设置字体的颜色为红色

           g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));//设置字的格式

           g.drawString(orgX+","+orgY, orgX, orgY);//在初始坐标处划线

           g.drawString(endX+","+endY, endX, endY);//在末坐标处划线

           g.drawLine(orgX, orgY, endX, endY);

        }

    }

    主类:

    package GUI;

     

    import java.awt.*;

    import java.awt.event.*;

    import java.util.*;

    public class DrawLine extends Frame {

        int orgX;//初始点的横坐标

        int orgY;//初始点的纵坐标

        int endX;

        int endY;

        Vector vLines=new Vector();

        public void paint(Graphics g)

        {

           Enumeration e=vLines.elements();

           while (e.hasMoreElements()) {

               MyLine line=(MyLine)e.nextElement();

               line.drawMe(g);

           }

        }

        public DrawLine()//添加构造方法

        {

           addWindowListener(new WindowAdapter(){//注册窗口适配器

     

     

               public void windowClosing(WindowEvent arg0) {//重写关闭窗口的方法

                  dispose();     //释放该窗口

                  System.exit(0);//停止程序的运行

               }

     

           });

           this.addMouseListener(new MouseAdapter(){

              

               public void mousePressed(MouseEvent e)

               {

                  orgX=e.getX();//获得初始点的横坐标

                  orgY=e.getY();//获得初始点的纵坐标

               }

               public void mouseReleased(MouseEvent e)

               {

                  endX=e.getX();//获得末点横坐标

                  endY=e.getY();//获得末点纵坐标

                  vLines.add(new MyLine(orgX,orgY,endX,endY));//存储坐标

                  repaint();//调用绘图方法,重绘直线

               }

           });

        }

        public static void main(String[] args) {

           System.out.println("starting TestMyButton..");

           DrawLine drawLine=new DrawLine();//实例化定义的创库

           drawLine.setSize(400, 400);//设置窗口的大小

           drawLine.setTitle("TestMyButton");

           drawLine.setVisible(true);

        }

    }

     

    3)      图像显示

    package drawImage;

     

    import java.awt.*;

    import java.awt.event.*;

     

    public class DrawImage extends Frame{

         

        Image img=getToolkit().getImage("hero.gif");//加载图像对象

        public void paint(Graphics g)

        {

           while (!g.drawImage(img, 20, 20, this));

        }

     

        public DrawImage()//添加构造方法

        {

           addWindowListener(new WindowAdapter(){//注册窗口适配器

     

     

               public void windowClosing(WindowEvent arg0) {//重写关闭窗口的方法

                  dispose();     //释放该窗口

                  System.exit(0);//停止程序的运行

               }

     

           });

        }

        public static void main(String[] args) {

           System.out.println("starting DrawImage..");

           DrawImage drawImage=new DrawImage();

           drawImage.setSize(400, 400);//设置窗口的大小

           drawImage.setTitle("TestMyButton");

           drawImage.setVisible(true);

     

        }

     

    }

    问题:为什么没用到repaint()

    4)      双缓冲技术

    package drawImage;

    import GUI.*;

     

    import java.awt.*;

    import java.awt.event.*;

    import java.util.*;

    public class DrawLine1 extends Frame {

        int orgX;//初始点的横坐标

        int orgY;//初始点的纵坐标

        int endX;

        int endY;

        Image image=null;

        Graphics graphics=null;

        public void paint(Graphics g)

        {

           System.out.println("我来了");

           g.drawImage(image,20,20,this);//image第一次可以是空的

        }

        public DrawLine1()//添加构造方法

        {

           setSize(400, 400);//设置窗口的大小

           setTitle("TestMyButton");

           setVisible(true);

          

           Dimension d=this.getSize();

           image=createImage(d.width, d.height);

           graphics=image.getGraphics();

          

          

          

           addWindowListener(new WindowAdapter(){//注册窗口适配器

               public void windowClosing(WindowEvent arg0) {//重写关闭窗口的方法

                  dispose();     //释放该窗口

                  System.exit(0);//停止程序的运行

               }

     

           });

          

          

           this.addMouseListener(new MouseAdapter(){

          

               public void mousePressed(MouseEvent e)

               {

                  orgX=e.getX();//获得初始点的横坐标

                  orgY=e.getY();//获得初始点的纵坐标

               }  

               public void mouseReleased(MouseEvent e)

               {

                  endX=e.getX();//获得末点横坐标

                  endY=e.getY();//获得末点纵坐标

                 

                  Graphics g=getGraphics();

                  g.setColor(Color.RED);  //设置字体的颜色为红色

                  g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));//设置字的格式

                  g.drawString(orgX+","+orgY, orgX, orgY);//在初始坐标处划线

                  g.drawString(endX+","+endY, endX, endY);//在末坐标处划线

                  g.drawLine(orgX, orgY, endX, endY);

                 

                  graphics.setColor(Color.RED);  //在内存中设置字体的颜色为红色

                  graphics.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));//在内存中设置字的格式

                  graphics.drawString(orgX+","+orgY, orgX, orgY);//在内存中初始坐标写坐标

                  graphics.drawString(endX+","+endY, endX, endY);//

                  graphics.drawLine(orgX, orgY, endX, endY);//在内存中绘制线

               }

           });

        }

        public static void main(String[] args) {

           System.out.println("starting TestMyButton..");

           DrawLine1 drawLine=new DrawLine1();//实例化窗口

          

        }

    }

     

     

    最新回复(0)