java画板程序

Python09

java画板程序,第1张

package draw

import java.awt.*

import java.awt.event.*

import java.awt.geom.*

import java.io.*

import java.util.*

import javax.swing.*

//the point

//impress the info of one point,the x and y

class OnePoint implements Serializable

{

int x

int y

int tool

Color c

int border

public OnePoint(int x,int y,int tool,Color cc,int border)

{

this.x=x

this.y=y

this.tool=tool

this.c=cc

this.border=border

}

public static void main(String[] args)

{

DrawingBoard oneBorder=new DrawingBoard()

}

}

class DrawingBoard extends Frame implements MouseListener,ItemListener,ActionListener,MouseMotionListener

{

Button pen,line,ellipse,rect,clear,colorboard,storebutton,openbutton

Choice sizechoice,colorchoice

Label pensize, pencolor

Panel panel

FileDialog storefile, openfile

FileInputStream filein

FileOutputStream fileout

ObjectInputStream objectin

ObjectOutputStream objectout

int mode=0

int flagtool=0

Color flagcolor

int border

BasicStroke size

private Point2D[] p=new Point2D[3]

OnePoint p1,p2

Vector<OnePoint>points=new Vector<OnePoint>()

public DrawingBoard()

{

pen=new Button("画笔")

line=new Button("直线")

ellipse=new Button("圆")

rect=new Button("矩形")

clear=new Button("清除")

colorboard=new Button("调色板")

storebutton=new Button("存储文件")

openbutton=new Button("打开文件")

pensize=new Label("画笔大小")

pencolor=new Label("画笔颜色")

storefile=new FileDialog(this,"存储文件",FileDialog.SAVE)

storefile.setVisible(false)

storefile.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

storefile.setVisible(false)

}

})

openfile=new FileDialog(this,"打开文件",FileDialog.LOAD)

openfile.setVisible(false)

openfile.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

openfile.setVisible(false)

}

})

sizechoice=new Choice()

sizechoice.add("1")

sizechoice.add("2")

sizechoice.add("4")

sizechoice.add("6")

sizechoice.add("8")

sizechoice.addItemListener(this)

colorchoice=new Choice()

colorchoice.add("black")

colorchoice.add("red")

colorchoice.add("blue")

colorchoice.add("green")

colorchoice.addItemListener(this)

pen.addActionListener(this)

line.addActionListener(this)

ellipse.addActionListener(this)

rect.addActionListener(this)

clear.addActionListener(this)

colorboard.addActionListener(this)

storebutton.addActionListener(this)

openbutton.addActionListener(this)

panel=new Panel()

panel.add(storebutton)

panel.add(openbutton)

panel.add(pen)

panel.add(line)

panel.add(ellipse)

panel.add(rect)

panel.add(clear)

panel.add(sizechoice)

panel.add(pensize)

panel.add(colorchoice)

panel.add(pencolor)

panel.add(colorboard)

add(panel,BorderLayout.NORTH)

setBounds(100,100,700,600)

setVisible(true)

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0)

}

})

/**

* 添加鼠标事件的监听器,否则,鼠标的移动和点击都将无法识别!

* */

addMouseListener(this)

addMouseMotionListener(this)

}

public void paint(Graphics g)

{

Graphics2D g2d=(Graphics2D)g

if(flagtool==2)

{ //qing chu

g.clearRect(0,0,getSize().width,getSize().height)

}

for(int i=0i<points.size()-1i++)

{

p1=(OnePoint)points.elementAt(i)

p2=(OnePoint)points.elementAt(i+1)

g2d.setColor(p1.c)//////////////需要使用Graphics2D从Graphics类中继承下来的方法 setColor()设置当前的颜色

size=new BasicStroke(p1.border,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL)

g2d.setStroke(size)

if(p1.tool==p2.tool)

{

switch(p1.tool)

{

case 0:

Line2D.Double line1=new Line2D.Double(p1.x,p1.y,p2.x,p2.y)

g2d.draw(line1)

break

case 1:

Line2D.Double line2=new Line2D.Double(p1.x,p1.y,p2.x,p2.y)

g2d.draw(line2)

break

case 3:

Ellipse2D.Double ellipse=new Ellipse2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y))

g2d.draw(ellipse)

break

case 4:

Rectangle2D.Double rect=new Rectangle2D.Double(p1.x,p1.y,Math.abs(p2.x-p1.x),Math.abs(p2.y-p1.y))

g2d.draw(rect)

break

default:

}

}

}

}

public void mouseClicked(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) //鼠标点下时候,将当前的点信息记录

{

mode=0

p[0]=e.getPoint()

OnePoint pp1=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border)

points.addElement(pp1)

//repaint()

}

public void mouseReleased(MouseEvent e) //鼠标松开时候,如果是画笔,则当前截断,是其余状态记下一枚点信息

{

mode=1

if(flagtool==0)

{

points.addElement(new OnePoint(-1,-1,22,flagcolor,border))

}

else

{

OnePoint pp2=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border)

points.addElement(pp2)

points.add(new OnePoint(-1,-1,22,flagcolor,border))

}

repaint()

}

public void itemStateChanged(ItemEvent e)

{

if(e.getSource()==colorchoice)

{

String selected=colorchoice.getSelectedItem()

if(selected=="black"){flagcolor=new Color(0,0,0)}

else if(selected=="red"){flagcolor=new Color(255,0,0)}

else if(selected=="blue"){ flagcolor=new Color(0,0,255)}

else if(selected=="green"){ flagcolor=new Color(0,255,0)}

}

else if(e.getSource()==sizechoice)

{

String selected=sizechoice.getSelectedItem()

if (selected=="1"){ border=1}

else if(selected=="2"){ border=2*2}

else if(selected=="4"){ border=4*2}

else if(selected=="6"){ border=6*2}

else if(selected=="8"){ border=8*2}

}

}

/*public void update(Graphics g) { //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

paint(g)

} */

public void actionPerformed(ActionEvent e)

{

// TODO Auto-generated method stub

if(e.getSource()==pen){flagtool=0}

else if(e.getSource()==line){ flagtool=1}

else if(e.getSource()==clear)

{

flagtool=2

points.removeAllElements()

repaint()//此语要有,否则今生无法删除!

}

else if(e.getSource()==ellipse){ flagtool=3}

else if(e.getSource()==rect){ flagtool=4}

else if(e.getSource()==colorboard)

{

/*

* 使用 javax.swing.×包中的 JColorChooser 类的静态方法showDialog(Component component,String title,Color color ),

* 该方法的参数,component是当前显示对话框的父框架,color是设置调色板初始的被选颜色

*

* 该方法返回被选的颜色,类型为Color

* */

Color color=JColorChooser.showDialog(this, "调色板",flagcolor)

flagcolor=color

}

else if(e.getSource()==openbutton)

{

openfile.setVisible(true)

if(openfile.getFile()!=null)

{

int temp=flagtool

flagtool=2

repaint()

try{

points.removeAllElements()

File file=new File(openfile.getDirectory(),openfile.getFile())

filein=new FileInputStream(file)

objectin=new ObjectInputStream(filein)

points=(Vector)objectin.readObject()

objectin.close()

filein.close()

flagtool=temp

repaint()

}

catch(Exception ee){ System.out.println(ee.toString())}

}

}

else if(e.getSource()==storebutton)

{

storefile.setVisible(true)

if(storefile.getFile()!=null)

{

try {

File file=new File(storefile.getDirectory(),storefile.getFile())

fileout=new FileOutputStream(file)

objectout=new ObjectOutputStream(fileout)

objectout.writeObject(points)

objectout.close()

fileout.close()

repaint()

}

catch (FileNotFoundException e1)

{

System.out.println(e1.toString())

e1.printStackTrace()

} catch (IOException ee) {

System.out.println(ee.toString())

ee.printStackTrace()

}

}

}

}

public void mouseDragged(MouseEvent e) //鼠标拖动时候,//当且仅当 flagtool==0,或者表示为橡皮的时候

//才将拖动过程中涉及到的点全部记录下来,并且调用repain()方法,重画当前

// TODO Auto-generated method stub

{

if(flagtool==0)

{

OnePoint pp3=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border)

points.addElement(pp3)

repaint()

}

if(flagtool==1)

{

OnePoint pp3=new OnePoint(e.getX(),e.getY(),flagtool,flagcolor,border)

repaint()

}

}

public void mouseMoved(MouseEvent e) {

// TODO Auto-generated method stub

}

}

 

import java.awt.BasicStroke

import java.awt.BorderLayout

import java.awt.Color

import java.awt.FlowLayout

import java.awt.Frame

import java.awt.Graphics

import java.awt.Graphics2D

import java.awt.Label

import java.awt.Panel

import java.awt.event.MouseAdapter

import java.awt.event.MouseEvent

import java.awt.event.MouseMotionListener

import java.awt.event.WindowAdapter

import java.awt.event.WindowEvent

public class MouseDrawPanel extends Frame

{

private static final long serialVersionUID = 1L

MouseEvent e = null

int startX = -1

int startY = -1

int endX = -1

int endY = -1

boolean left = false

public MouseDrawPanel ( String title )

{

setTitle (title)

setLayout (new BorderLayout ())

setResizable (false)

setSize (500, 400)

setLocationRelativeTo (null)

addWindowListener (new WindowAdapter ()

{

@Override

public void windowClosing ( WindowEvent e )

{

System.exit (0)

}

})

}

@Override

public void paintComponents ( Graphics g )

{

float lineWidth = 8.0f

( (Graphics2D) g ).setStroke (new BasicStroke (lineWidth))

g.setColor (Color.YELLOW)

g.drawLine (startX, startY, endX, endY)

g.dispose ()

}

public static void main ( String[] args )

{

final MouseDrawPanel mdp = new MouseDrawPanel ("Use Mouse Draw")

Panel panel = new Panel ()

panel.setLayout (new FlowLayout (FlowLayout.LEFT))

Label startL = new Label ("start: ")

Label endL = new Label ("end: ")

final Label nowL = new Label ("now: ")

final Label startR = new Label ("000,000")

final Label endR = new Label ("000,000")

final Label nowN = new Label ("000,000")

panel.add (startL)

panel.add (startR)

panel.add (endL)

panel.add (endR)

panel.add (nowL)

panel.add (nowN)

mdp.add (panel, "South")

mdp.addMouseMotionListener (new MouseMotionListener ()

{

@Override

public void mouseMoved ( MouseEvent e )

{

if (mdp.left)

{

nowN.setText (e.getX () + " , " + e.getY ())

}

}

@Override

public void mouseDragged ( MouseEvent e )

{

if (mdp.left)

{

mdp.endX = e.getX ()

mdp.endY = e.getY ()

mdp.paintComponents (mdp.getGraphics ())

mdp.startX = mdp.endX

mdp.startY = mdp.endY

endR.setText (mdp.endX + " , " + mdp.endY)

}

}

})

mdp.addMouseListener (new MouseAdapter ()

{

@Override

public void mousePressed ( MouseEvent e )

{

if (e.getButton () == MouseEvent.BUTTON1)

{

mdp.startX = e.getX ()

mdp.startY = e.getY ()

startR.setText (mdp.startX + " , " + mdp.startY)

mdp.left = true

}

else

{

mdp.left = false

}

}

@Override

public void mouseReleased ( MouseEvent e )

{

if (mdp.left)

{

endR.setText (e.getX () + " , " + e.getY ())

}

}

})

mdp.setVisible (true)

}

}

可以,用Graphics类的void setFont(Font font)方法来,设定字体的名称,大小,是否加粗斜体等.

例如 Font f=new Font(null,Font.PLAIN,20)用这个语句定义一个缺省字体名称大小20磅的普通字体对象f,然后用g.setFont(f)为图形对象Graphics g设定字体大小,画板drawString的字体大小就会改变了.