java画板程序

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.*

import javax.swing.*

import java.awt.event.*

public class Painter extends JFrame

{

private int xValue=0,yValue=0

public Painter()

{

super("A Simple paint program")

getContentPane().add(new JLabel("Drag the Mouse To Paint"),"South")

/*addMouseMotionListener(

new MouseMotionAdapter(){

public void mouseDragged(MouseEvent e)

{

xValue=e.getX()

yValue=e.getY()

repaint()

}

}

)*/

setSize(300,300)

setVisible(true)

}

/*

public void paint(Graphics g)

{

g.fillOval(xValue,yValue,4,4)

}*/

public static void main(String[] args)

{

Painter frame=new Painter()

}

}

这主要是paint(Griphics g)方法的问题

注意java.awt包和javax.swing包中的类的层次问题

java.lang.Object ->java.awt.Component ->java.awt.Label

java.lang.Object

-> java.awt.Component

-> java.awt.Container

-> javax.swing.JComponent

-> javax.swing.JLabel

而在java.awt.Component和javax.swing.JComponent都分别根据组件的清重量级定义了不同实现方式的paint方法

在你的程序中,你是在JFrame中直接进行绘画,而JFrame属于重量级组件,Label属于偏重量级JLabel属于偏轻(轻重的区别就是是否跟本地系统有太大关系)。。JFrame JWindow JDialog 等等。。并且你绘画的区域和你添加Label

的位置有重叠。。。诸多原因导致了无法显示

建议:将绘画的组件 改成JPanel。。可以多分级绘画,也可以并列多个JPanel,然后分别添加 组件 和绘画,不会重叠。。

 

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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11133873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存