За да може да се рисува в Java, е необходимо използването на обект от клас "Canvas" от пакета "awt"(платно за рисуване). .Приложенията трябва да го създадат в явна форма.Рисуване, компонент Canvas
При аплетите, се създава автоматично един обект "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);
}
}
}