table des matiиres

Рисуване, компонент Canvas

    За да може да се рисува в  Java, е необходимо използването на обект от клас "Canvas" от пакета  "awt"(платно за рисуване). .Приложенията трябва да го създадат в явна форма.
 
При аплетите, се създава автоматично един обект "Canvas", с размери определени от параметрите "hеight" и "width" на аплета. Всичко, което се рисува извън този обект е невидимо.

Декартовите координати в платното се изчисляват съгласно фигурата:
 

Инструменталните средства за рисуване на различни форми се намират в клас "Graphics" .
 
 
          clearRect()
          copyArea()
          drawArc()
          drawLine()
          drawOval()
          drawPolygon()
          drawRect()
          drawRoundRect()
          drawString()
          fillArc()
          fillOval()
          fillPolygon()
          fillRect()
          fillRoundRect()
          getColor()
          getFont()
          getFontMetrics()
          setColor()
          setFont()

 Функцията, която реализира рисунката се нарича  "paint()" и се вика автоматично, когато някой компонент реши че трябва да се прерисува:

    public void paint(Graphics g) {...}

Тя има един параметър - обект от клас "Graphics", който предоставя методите за рисуване върху платното. За аплетите методът методът  "paint()" се извиква от навигатора след извикването на методите "init()" и "start()" и всеки път когато се вика метода update(). За да може да се направи рисунка, трябва да се предефинира метода "paint()".

Например:

    public void paint(Graphics g) {
            g.drawLine(5, 10, 23, 10);
   }

Рисува права линия с начало с координати  5,10 и край с координати 23,10.

g представлява обекта от клас Graphics - параметър на функцията "paint()".
 

Пример - рисуване на правоъгълник със закръглени ъгли

 

 
 
 
import java.awt.*;
import java.applet.*;
public class RndR extends Applet {
    public void paint (Graphics g){
          g.fillRoundRect(50, 30, 95, 170, 15, 15);
               // параметри: x,y,width, height,arcWidth,arcHeight
    }
}

 Друг пример

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Pgn0 extends Applet{
    int pointNum=0;
    int x[]= new int[0], y[]=new int[0],idx=0,yp=20;
    Label lx,ly;
    TextField tx, ty;
    X xls = new X();
    Y yls = new Y();
    public void init(){
        lx=new Label("x "+pointNum);
        tx=new TextField("",5);
        ly=new Label("y "+pointNum);
        ty=new TextField("",5);
        tx.addActionListener(xls);
        ty.setEditable(false);
        add(lx); add(tx);    add(ly); add(ty); 
    }
    public void paint(Graphics g){
        g.drawPolygon(x, y, pointNum);
        for(int i= 0;i<x.length;i++){
            g.drawString("["+x[i]+","+y[i]+"]", x[i], y[i]);
        }
    }
    class X implements ActionListener{
        public void actionPerformed(ActionEvent e){
            tx.setEditable(false);
            tx.removeActionListener(xls);
            ty.setEditable(true);
            ty.addActionListener(yls);      
        }
    }
    class Y implements ActionListener{
        public void actionPerformed(ActionEvent e){
            ty.setEditable(false);
            ty.removeActionListener(yls);
            tx.setEditable(true);
            tx.addActionListener(xls);
            addPt();
            repaint();
        }
    }
    void addPt(){
        pointNum++;
        int help[] = new int[pointNum];
        System.arraycopy(x, 0, help, 0, pointNum-1);
        x=help; x[pointNum-1]= Integer.parseInt(tx.getText());
        help = new int[pointNum];
        System.arraycopy(y, 0, help, 0, pointNum-1);
        y=help; y[pointNum-1]= Integer.parseInt(ty.getText());
        lx.setText("x"+pointNum);
        ly.setText("y"+pointNum);
     
    }
}

За въвеждане на точки може да се използва мишката

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Pgn extends Applet{
    int pointNum=0;
    int x[]= new int[0], y[]=new int[0],idx=0,yp=20;   
    MouseHandler mh = new MouseHandler();
    public void init(){
        addMouseListener(mh);
        add(new Label("Click mouse to introduce a point"));
    }
    public void paint(Graphics g){
        g.drawPolygon(x, y, pointNum);
        for(int i= 0;i<x.length;i++){
            g.drawString("["+x[i]+","+y[i]+"]", x[i], y[i]);
        }
    }
    class MouseHandler extends MouseAdapter {
        public void mousePressed(MouseEvent e){
           int xm=e.getX();
           int ym=e.getY();
           addPt(xm,ym);
           repaint();
           validate();
         }
     }  
    void addPt(int xm, int ym){
        pointNum++;
        int help[] = new int[pointNum];
        System.arraycopy(x, 0, help, 0, pointNum-1);
        x=help; x[pointNum-1]= xm;
        help = new int[pointNum];
        System.arraycopy(y, 0, help, 0, pointNum-1);
        y=help; y[pointNum-1]= ym;     
    }
}

По-подробен пример


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
import java.util.Vector;

public class Draw extends Applet {
   Button lineButton = new Button("Line");
   Button ovalButton = new Button("Oval");
   Button rectButton = new Button("Rectangle");
   Button clearButton = new Button("Clear");
   MyCanvas canvas = new MyCanvas(TwoPointObject.LINE);
   int screenWidth = 400;
   int screenHeight = 400;
   public void init() {
      setBackground(Color.green);
      setLayout(new BorderLayout());
      add("Center",canvas);
      setupButtons();
      resize(screenWidth,screenHeight);
   }
   void setupButtons() {
      lineButton.addActionListener(new ButtonHandler());
      ovalButton.addActionListener(new ButtonHandler());
      rectButton.addActionListener(new ButtonHandler());
      clearButton.addActionListener(new ButtonHandler());
      Panel panel = new Panel();
      panel.add(lineButton);
      panel.add(ovalButton);
      panel.add(rectButton);
      panel.add(clearButton);
      add("North",panel);
   }
   class ButtonHandler implements ActionListener {
      public void actionPerformed(ActionEvent ev){
         String s=ev.getActionCommand();
         if(s.equals("Clear")) canvas.clear();
         else if(s.equals("Line"))
             canvas.setTool(TwoPointObject.LINE);
         else if(s.equals("Oval"))
             canvas.setTool(TwoPointObject.OVAL);
         else if(s.equals("Rectangle"))
             canvas.setTool(TwoPointObject.RECTANGLE);
      }
   }
}
class MyCanvas extends Canvas {
   int tool = TwoPointObject.LINE;
   Vector objects = new Vector();
   TwoPointObject current;
   boolean newObject = false;
   public MyCanvas(int toolType) {
         super();
         tool = toolType;
         addMouseListener(new MouseHandler());
         addMouseMotionListener(new MouseMotionHandler());
   }
   public void setTool(int toolType) {
       tool = toolType;
   }
   public void clear() {
        objects.removeAllElements();
        repaint();
   }
   public void paint(Graphics g) {
        int numObjects = objects.size();
        for(int i=0;i<numObjects;++i) {
              TwoPointObject obj = (TwoPointObject) objects.elementAt(i);
              obj.draw(g);
        }
        if(newObject) current.draw(g);
   }
   class MouseHandler extends MouseAdapter {
         public void mousePressed(MouseEvent e){
              current = new TwoPointObject(tool,e.getX(),e.getY());
              newObject = true;
         }
         public void mouseReleased(MouseEvent e){
              if(newObject) {
                   objects.addElement(current);
                   newObject = false;
              }
         }
   }

   class MouseMotionHandler extends MouseMotionAdapter {
        public void mouseDragged(MouseEvent e){
              int x = e.getX();
              int y = e.getY();
              if(newObject) {
                      int oldX = current.endX;
                      int oldY = current.endY;
                      if(tool != TwoPointObject.LINE) {                          //овал или правоъгълник
                               if(x > current.startX) current.endX = x;
                               if(y > current.startY) current.endY = y;
                               int width = Math.max(oldX,current.endX) - current.startX + 1;
                               int height = Math.max(oldY,current.endY) - current.startY + 1;
                               repaint(current.startX,current.startY,width,height);
                      }else{                                              //линия
                             current.endX = x;
                             current.endY = y;
                             int startX = Math.min(Math.min(current.startX,current.endX),oldX);
                             int startY = Math.min(Math.min(current.startY,current.endY),oldY);
                             int endX = Math.max(Math.max(current.startX,current.endX),oldX);
                             int endY = Math.max(Math.max(current.startY,current.endY),oldY);
                             repaint(startX,startY,endX-startX+1,endY-startY+1);
                       }
               }
          }
     }
}
class TwoPointObject {
    public static int LINE = 0;
    public static int OVAL = 1;
    public static int RECTANGLE = 2;
    public int type, startX, startY, endX, endY;
    public TwoPointObject(int objectType,int x1,int y1,int x2,int y2) {
            type = objectType;
            startX = x1;
            startY = y1;
            endX = x2;
            endY = y2;
    }
    public TwoPointObject(int objectType,int x,int y) {
            this(objectType,x,y,x,y);
    }
    public TwoPointObject() {
            this(LINE,0,0,0,0);
    }
    public void draw(Graphics g) {
            if(type == LINE) g.drawLine(startX,startY,endX,endY);
            else{
                   int w = Math.abs(endX - startX);
                   int l = Math.abs(endY - startY);
                   if(type == OVAL) g.drawOval(startX,startY,w,l);
                   else g.drawRect(startX,startY,w,l);
             }
    }
}
 
 
 

table des matiиres