「java定义画板」java实现画板

博主:adminadmin 2022-11-27 06:55:07 49

今天给各位分享java定义画板的知识,其中也会对java实现画板进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

GUI画图板(绘图板)设计,用Java编写程序代码!!谢谢!!

只有矩形有圆形能移动,其它实现起来麻烦点,办法有的只是代码太多。

画圆弧改成了画曲线,圆弧稍麻烦,当然方法是很简单的,你可以自己思考一下。

双击13个颜色中的任意一个都会弹出颜色选择器。

有保存与打开功能。扩展名请用 .jdr

基本满足条件,细节可能不是很好,另,代码比较乱,怕不好看懂咯,呼呼。

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

import java.io.*;

import java.util.ArrayList;

import javax.swing.*;

import javax.swing.filechooser.FileNameExtensionFilter;

public class JDraw {

public static void main(String[] args) {

JFrame f=new JFrame();

f.setDefaultCloseOperation(3);

f.setSize(880,600);

f.setLocationRelativeTo(null);

f.getContentPane().add(M.c);

f.getContentPane().add(M.m,"South");

f.setVisible(true);

}

}

class CVS extends Component implements ComponentListener,MouseListener,MouseMotionListener{

public void componentHidden(ComponentEvent e) {}

public void componentMoved(ComponentEvent e) {}

public void componentResized(ComponentEvent e) {resized();}

public void componentShown(ComponentEvent e) {}

private void resized() {

int w=this.getWidth();

int h=this.getHeight();

tbuff=new BufferedImage(w,h,3);

makeBuff(w,h);

}

private void makeBuff(int w,int h) {

Graphics g = tbuff.getGraphics();

g.drawImage(buff,0,0,null);

g.dispose();

buff=new BufferedImage(w,h,3);

g=buff.getGraphics();

g.drawImage(tbuff,0,0,null);

g.dispose();

}

BufferedImage buff,tbuff;

CVS(){

this.addComponentListener(this);

this.addMouseListener(this);

this.addMouseMotionListener(this);

buff=new BufferedImage(1,1,3);

}

public void paint(Graphics gr){

Graphics2D g = buff.createGraphics();

g.setBackground(new Color(0xff000000,true));

g.clearRect(0,0,getWidth(),getHeight());

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

M.sa.drawAll(g);

if(M.ts!=null)

M.ts.draw(g);

g.dispose();

gr.drawImage(buff,0,0,this);

gr.dispose();

}

public void mouseClicked(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) {

M.mp(e.getPoint());

}

public void mouseReleased(MouseEvent e) {

M.mr(e.getPoint());

}

public void mouseDragged(MouseEvent e) {

M.md(e.getPoint());

}

public void mouseMoved(MouseEvent e) {}

}

class Menu extends JComponent implements MouseListener,ActionListener{

JComboBox sbox,method;

CLabel[] cl;

JCheckBox fillC,drawB;

JRadioButton fc,bc;

ButtonGroup bg;

JButton clear,up,down,save,load;

Menu(){

this.setLayout(new FlowLayout());

method=new JComboBox(new Object[]{"draw","move","erase",});

add(method);

sbox=new JComboBox(new Object[]{"Pt","Ln","Rect","Cir","Arc",});

add(sbox);

cl=new CLabel[13];

for(int i=0; icl.length; i++){

cl[i]=new CLabel();

cl[i].addMouseListener(this);

add(cl[i]);

}

fc=new JRadioButton("fc",true);

bc=new JRadioButton("bc");

bg=new ButtonGroup();

bg.add(fc);bg.add(bc);

add(fc);add(bc);

fc.setOpaque(true);

bc.setOpaque(true);

fc.setBackground(Color.white);

bc.setBackground(Color.blue);

fillC=new JCheckBox("Fill",true);

drawB=new JCheckBox("Draw",true);

fillC.addActionListener(this);

drawB.addActionListener(this);

add(fillC);add(drawB);

clear=new JButton("clear");

clear.addActionListener(this);

add(clear);

up=new JButton("zUp");

up.addActionListener(this);

add(up);

down=new JButton("zDown");

down.addActionListener(this);

add(down);

save=new JButton("Save");

save.addActionListener(this);

add(save);

load=new JButton("Load");

load.addActionListener(this);

add(load);

}

public void mouseClicked(MouseEvent e) {

JLabel l=(JLabel)e.getSource();

if(e.getClickCount()==2){

Color sc=JColorChooser.showDialog(null, "Color chooser", l.getBackground());

l.setBackground(sc);

mousePressed(e);

}

}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mousePressed(MouseEvent e) {

Color c=((JLabel)e.getSource()).getBackground();

if(fc.isSelected())

fc.setBackground(c);

else if(bc.isSelected())

bc.setBackground(c);

M.cp();

}

public void mouseReleased(MouseEvent e) {}

public void actionPerformed(ActionEvent e) {

if(e.getSource()==clear)M.clear();

else if(e.getSource()==up)M.up();

else if(e.getSource()==down)M.down();

else if(e.getSource()==save)M.save();

else if(e.getSource()==load)M.load();

else if(e.getSource()==fillC||e.getSource()==drawB)M.cp();

}

}

class CLabel extends JLabel{

static Color[] cs={Color.red,Color.orange,Color.yellow,Color.green,Color.cyan,

Color.blue,Color.magenta,Color.magenta.brighter(),

Color.white,Color.black,Color.gray,Color.LIGHT_GRAY,Color.DARK_GRAY,};

static int i;

CLabel(){

this.setOpaque(true);

this.setBackground(cs[i++]);

this.setBorder(BorderFactory.createLineBorder(Color.black));

this.setPreferredSize(new Dimension(10,20));

}

}

class M{

static JFileChooser jfc=new JFileChooser();

static Menu m=new Menu();

static CVS c=new CVS();

static SA sa=new SA();

static S ts=null,selected=null;

static Color fc,bc;

static void clear(){

sa.ss.clear();

c.repaint();

}

public static void cp() {

System.out.println(selected);

if(selected!=null){

selected.fillColor=m.fc.getBackground();

selected.borderColor=m.bc.getBackground();

selected.fc=m.fillC.isSelected();

selected.db=m.drawB.isSelected();

c.repaint();

}

}

public static void up() {

if(selected!=null){

sa.upZ(selected);

c.repaint();

}

}

public static void down(){

if(selected!=null){

sa.downZ(selected);

c.repaint();

}

}

static{

jfc.setFileFilter(new FileNameExtensionFilter("JDraw file (*.jdraw,*.jdr)","jdr","jdraw"));

}

static void save(){

int x=jfc.showSaveDialog(c);

if(x==JFileChooser.APPROVE_OPTION){

File f = jfc.getSelectedFile();

try{

ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));

oos.writeObject(sa);

oos.flush();

oos.close();

}catch(Exception e){}

}

}

static void load(){

int x=jfc.showOpenDialog(c);

if(x==JFileChooser.APPROVE_OPTION){

File f = jfc.getSelectedFile();

try{

ObjectInputStream oos=new ObjectInputStream(new FileInputStream(f));

Object r=oos.readObject();

if(r!=null){

sa=(SA)r;

c.repaint();

}

oos.close();

}catch(Exception e){e.printStackTrace();}

}

}

static int mx,my,tx,ty,ox,oy;

static int pc=0,pmax;

static int sm;

static boolean ne=true;

static int mid;

static void mp(Point p){

mid=m.method.getSelectedIndex();

if(mid==0){

if(ne){

mx=p.x;my=p.y;

pc=0;

sm=m.sbox.getSelectedIndex();

pmax=sm==4?2:1;

ne=false;

}

++pc;

}

else if(mid==1){

checkSel(p);

mx=p.x;my=p.y;

}

else if(mid==2){

checkSel(p);

if(selected!=null){

sa.ss.remove(selected);

c.repaint();

}

}

}

private static void checkSel(Point p) {

selected=null;

for(int i=sa.ss.size();i0; i--)

if(sa.ss.get(i-1).shape.contains(p)){

selected=sa.ss.get(i-1);break;

}

sa.select(selected);

c.repaint();

}

static void mt(){

Shape s=null;

int cx,cy,cw,ch;

switch(sm){

case 0:

case 2:

cx=Math.min(mx,tx);

cy=Math.min(my,ty);

cw=Math.abs(mx-tx);

ch=Math.abs(my-ty);

if(sm==0)

s=new Ellipse2D.Double(cx,cy,cw,ch);

else

s=new Rectangle(cx,cy,cw,ch);

break;

case 1:

s=new Line2D.Float(mx,my,tx,ty);

break;

case 3:

cw=Math.abs(mx-tx);

ch=Math.abs(my-ty);

int cd=(int)Math.sqrt(Math.pow(mx-tx,2)+Math.pow(my-ty,2))*2;

cx=mx-cd/2;

cy=my-cd/2;

s=new Ellipse2D.Double(cx,cy,cd,cd);

break;

case 4:

Path2D p=new Path2D.Double();

p.moveTo(mx,my);

if(pc==1){

p.lineTo(tx, ty);

}

else{

p.quadTo(ox,oy,tx,ty);

}

s=p;

break;

}

ts=new S(s,m.fc.getBackground(),m.bc.getBackground(),m.fillC.isSelected(),m.drawB.isSelected(),null);

c.repaint();

}

static void md(Point p){

if(mid==0){

if(!sa.ss.isEmpty()){

sa.ss.get(sa.ss.size()-1).sel=false;

}

if(pc1){

ox=p.x;oy=p.y;

}

else{

tx=p.x;ty=p.y;

}

mt();

}

else if(mid==1){

if(selected!=null){

moveTo(selected,p);

c.repaint();

}

}

else if(mid==2){

checkSel(p);

if(selected!=null){

sa.ss.remove(selected);

c.repaint();

}

}

}

static void moveTo(S s, Point p) {

if(s.shape instanceof Rectangle){

Rectangle r=(Rectangle)s.shape;

r.setLocation(r.x+p.x-mx,r.y+p.y-my);

mx=p.x;my=p.y;

}

else if(s.shape instanceof Ellipse2D){

Ellipse2D e=(Ellipse2D)s.shape;

e.setFrame(e.getX()+p.x-mx,e.getY()+p.y-my,e.getWidth(),e.getHeight());

mx=p.x;my=p.y;

}

}

static void mr(Point p) {

if(pc==pmax){

pc=0;

ne=true;

sa.add(ts);

selected=ts;

ts=null;

}

}

}

class S implements Serializable{

boolean fc,db,sel=true;

Shape shape;

Color fillColor,borderColor;

Stroke stroke;

static Stroke bstroke=new MyBasicStroke();

static Stroke selectStroke=new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,1,new float[]{5,2},1);

S(Shape s,Color c,Color b,boolean f,boolean d,Stroke k){

this.shape=s;this.fillColor=c;this.borderColor=b;this.fc=f;this.db=d;this.stroke=k==null?bstroke:k;

}

void draw(Graphics2D g){

if(fc){

g.setColor(fillColor);

g.fill(shape);

}

if(db){

g.setColor(borderColor);

g.setStroke(stroke);

g.draw(shape);

}

if(sel){

g.setColor(Color.green);

g.setStroke(selectStroke);

g.draw(shape.getBounds());

}

}

}

class MyBasicStroke extends BasicStroke implements Serializable{}

class SA implements Serializable{

ArrayListS ss=new ArrayListS();

void add(S s){

if(s!=null){

for(S sx:ss)

sx.sel=false;

ss.add(s);

}

}

S remove(int i){

return ss.remove(i);

}

void remove(S s){

ss.remove(s);

}

void upZ(S s){

indexZ(s,1);

}

void downZ(S s){

indexZ(s,-1);

}

void indexZ(S s, int i) {

int si=ss.indexOf(s);

if(si+i0||si+iss.size()-1)return;

swap(s,ss.get(si+i));

}

void swap(S a,S b){

int ai=ss.indexOf(a);

int bi=ss.indexOf(b);

ss.set(ai,b);

ss.set(bi,a);

}

void select(S s){

for(S x:ss)

x.sel=false;

if(s!=null)

s.sel=true;

}

void drawAll(Graphics2D g){

for(S s:ss)

s.draw(g);

}

}

用Java实现画图板功能的程序,请问如何编写一个绘制三角形的程序段

class Triangle extends drawings//空心三角形类

{

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke,

BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL));

g2d.drawLine((int)((x1+x2)/2),Math.min(y1,y2),Math.max(x1,x2),Math.max(y1,y2));

g2d.drawLine(Math.max(x1,x2),Math.max(y1,y2),Math.min(x1,x2),Math.max(y1,y2));

g2d.drawLine(Math.min(x1,x2),Math.max(y1,y2),(int)((x1+x2)/2),Math.min(y1,y2));

}

}

以上是通过绘制三条直线作为三角形的三条边来绘制三角形.

class fillTriangle extends drawings//实心三角形

{

void draw(Graphics2D g2d)

{g2d.setPaint(new Color(R,G,B));

g2d.setStroke(new BasicStroke(stroke));

int mx=(int)((x1+x2)/2);

int[] x={mx,Math.max(x1,x2),Math.min(x1,x2)};

int[] y={Math.min(y1,y2),Math.max(y1,y2),Math.max(y1,y2)};

g2d.fillPolygon(x,y,3);

}

}

以上是用填充多边形的方式填充一个三角形,如果把最后的:g2d.fillPolygon(x,y,3)改为g2d.drawPolygon(x,y,3); 则是以绘制多边形的方式绘制空心三角形.

这里说明一下:因为(x1,y1,x2,y2)只能确定一个矩形区域,即鼠标拉动的起点和终点确定的矩形区域所以可以有多种方式确定三角形的三个顶点,我这个用的三个顶点是:

点1( (x1+x2)/2, min(y) ) 点2( max(x),max(y) ) 点3( min(x),max(y) )

你的补充内容太多了,没心情看啊,太累了

求一个java程序:绘图程序包括画圆,椭圆,线,矩形,自定义。并且可以调图形颜色!

public enum ShapeTypes {

LINE, CIRCLE, RECTANGLE

}

public interface Shape {

void paint(Graphics g);

}

public class Rectangle implements Shape {

// 矩形左上角的坐标

private int x, y;

// 矩形的宽度和高度

private int width, height;

private Color rectangleColor;

public Rectangle() {

super();

}

public Rectangle(int x, int y, int width, int height, Color rectangleColor) {

super();

this.x = x;

this.y = y;

this.width = width;

this.height = height;

this.rectangleColor = rectangleColor;

}

@Override

public void paint(Graphics g) {

g.setColor(rectangleColor);

g.drawRect(x, y, width, height);

}

}

public class Line implements Shape {

// 直线的起始位置

private int x1, y1;

// 直线的终止位置

private int x2, y2;

private Color lineColor;

public Line(int x1, int y1, int x2, int y2, Color lineColor) {

super();

this.x1 = x1;

this.y1 = y1;

this.x2 = x2;

this.y2 = y2;

this.lineColor = lineColor;

}

public Line() {

super();

}

@Override

public void paint(Graphics g) {

g.setColor(lineColor);

g.drawLine(x1, y1, x2, y2);

}

}

public class Circle implements Shape {

// 圆的颜色

private Color circleColor;

// 圆心的坐标

private int x, y;

// 圆的半径

private int radius;

public Circle() {

super();

}

public Circle(int x, int y, int radius, Color circleColor) {

super();

this.circleColor = circleColor;

this.x = x;

this.y = y;

this.radius = radius;

}

@Override

public void paint(Graphics g) {

g.setColor(circleColor);

// 画弧, 当弧的宽度和高度一致且从0~360度时就是原形了

g.drawArc(x, y, radius, radius, 0, 360);

}

}

public class SketchpadPanel extends Canvas implements MouseListener, MouseMotionListener {

private static final long serialVersionUID = -5229161042153132522L;

// 鼠标点击起始坐标和当前坐标

private int beginX = 0, beginY = 0, currentX = 0, currentY = 0;

// 判断鼠标是否被按下

private boolean isMousePressing = false;

// 保存当前的图形, 在撤销和恢复时使用

private final StackShape currentShapes = new StackShape();

// 保存已经删除过的图形

private final StackShape deletedShapes = new StackShape();

private ShapeTypes type;

private Color color;

public SketchpadPanel() {

addMouseListener(this);

addMouseMotionListener(this);

}

/**

 * 撤销方法

 */

public void undo() {

if (currentShapes.size()  0) {

// 从所有保存过的图形中取出最后一个, 放入到已删除的图形中去

Shape shape = currentShapes.pop();

deletedShapes.push(shape);

repaint();

}

}

/**

 * 恢复撤销方法

 */

public void redo() {

if (deletedShapes.size()  0) {

// 从所有删除的图形中取出最后一个, 放入保存的图形中

Shape shape = deletedShapes.pop();

currentShapes.push(shape);

repaint();

}

}

/**

 * 设置命令

 * 

 * @param type

 */

public void setShapeType(ShapeTypes type) {

this.type = type;

}

/**

 * 设置颜色

 * 

 * @param color

 */

public void setColor(Color color) {

this.color = color;

}

public void updete(Graphics g) {

paint(g);

}

/**

 * 绘制画板

 */

@Override

public void paint(Graphics g) {

// 绘制画板

Dimension size = getSize();

int width = size.width;

int height = size.height;

g.setColor(Color.WHITE);

g.fillRect(0, 0, width, height);

// 绘制所有图形

Shape shape = null;

EnumerationShape e = currentShapes.elements();

while (e.hasMoreElements()) {

shape = e.nextElement();

shape.paint(g);

}

// 如果当前鼠标没有释放

if (isMousePressing) {

g.setColor(color);

switch (type) {

// 绘制直线

case LINE:

g.drawLine(beginX, beginY, currentX, currentY);

break;

// 绘制矩形

case RECTANGLE:

if (currentX  beginX) {

if (currentY  beginY) {

// 如果当前位置在起始位置的左上方, 则以鼠标当前位置为矩形的左上角位置

g.drawRect(currentX, currentY, beginX - currentX, beginY - currentY);

} else {

// 如果当前位置在起始位置的左下方, 则以鼠标当前位置的横坐标和起始位置的纵坐标作为矩形的左上角位置

g.drawRect(currentX, beginY, beginX - currentX, currentY - beginY);

}

} else {

if (currentY  beginY) {

// 如果当前位置在起始位置的右上方, 则以鼠标起始位置的很坐标和当前位置的纵坐标作为矩形的左上角位置

g.drawRect(beginX, currentY, currentX - beginX, beginY - currentY);

} else {

// 如果当前位置在起始位置的右下方, 则已起始位置作为矩形的左上叫位置

g.drawRect(beginX, beginY, currentX - beginX, currentY - beginY);

}

}

break;

// 绘制圆形

case CIRCLE:

// 半径为a*a + b*b的平方根

int radius = (int) Math

.sqrt((beginX - currentX) * (beginX - currentX) + (beginY - currentY) * (beginY - currentY));

g.drawArc(beginX - radius / 2, beginY - radius / 2, radius, radius, 0, 360);

break;

}

}

}

@Override

public void mouseClicked(MouseEvent e) {

}

@Override

public void mouseEntered(MouseEvent e) {

}

@Override

public void mouseExited(MouseEvent e) {

}

/**

 * 当鼠标按下的时候获得起始坐标

 */

@Override

public void mousePressed(MouseEvent e) {

beginX = e.getX();

beginY = e.getY();

isMousePressing = true;

}

/**

 * 当鼠标释放时获得当前坐标

 */

@Override

public void mouseReleased(MouseEvent e) {

currentX = e.getX();

currentY = e.getY();

isMousePressing = false;

// 当释放鼠标时, 将绘制的图形保存到shapes中

switch (type) {

// 绘制直线

case LINE:

Line line = new Line(beginX, beginY, currentX, currentY, color);

currentShapes.push(line);

break;

// 绘制圆形

case CIRCLE:

// 半径为a*a + b*b的平方根

int radius = (int) Math

.sqrt((beginX - currentX) * (beginX - currentX) + (beginY - currentY) * (beginY - currentY));

Circle circle = new Circle(beginX - radius / 2, beginY - radius / 2, radius, color);

currentShapes.push(circle);

break;

// 绘制矩形

case RECTANGLE:

Rectangle rectangle = null;

if (currentX  beginX) {

if (currentY  beginY) {

rectangle = new Rectangle(currentX, currentY, beginX - currentX, beginY - currentY, color);

} else {

rectangle = new Rectangle(currentX, beginY, beginX - currentX, currentY - beginY, color);

}

} else {

if (currentY  beginY) {

rectangle = new Rectangle(beginX, currentY, currentX - beginX, beginY - currentY, color);

} else {

rectangle = new Rectangle(beginX, beginY, currentX - beginX, currentY - beginY, color);

}

}

currentShapes.push(rectangle);

break;

}

repaint();

}

@Override

public void mouseDragged(MouseEvent e) {

currentX = e.getX();

currentY = e.getY();

this.repaint();

}

@Override

public void mouseMoved(MouseEvent e) {

}

}

public class SketchpadFrame extends JFrame {

private static final long serialVersionUID = -7080053971741609904L;

private final JPanel commandPanel = new JPanel(); // 存放命令的面板

private final JPanel colorPanel = new JPanel(); // 存放颜色的面板

private final JPanel mainPanel = new JPanel(); // 主面板

private final JButton redButton = new JButton("红色");

private final JButton blueButton = new JButton("蓝色");

private final JButton greenButton = new JButton("绿色");

private final JButton lineButton = new JButton("直线");

private final JButton circleButton = new JButton("圆");

private final JButton rectangleButton = new JButton("矩形");

private final JButton undoButton = new JButton("撤销");

private final JButton redoButton = new JButton("恢复撤销");

private final JButton exitButton = new JButton("退出");

SketchpadPanel sketchPanel = new SketchpadPanel();

private void initFrame() {

commandPanel.setLayout(new FlowLayout());

commandPanel.add(lineButton);

commandPanel.add(circleButton);

commandPanel.add(rectangleButton);

commandPanel.add(undoButton);

commandPanel.add(redoButton);

commandPanel.add(exitButton);

colorPanel.setLayout(new FlowLayout());

colorPanel.add(redButton);

colorPanel.add(blueButton);

colorPanel.add(greenButton);

mainPanel.setLayout(new BorderLayout());

mainPanel.add(commandPanel, BorderLayout.NORTH);

mainPanel.add(colorPanel, BorderLayout.CENTER);

getContentPane().add("South", mainPanel);

getContentPane().add("Center", sketchPanel);

// 初始化设置:颜色和命令

lineButton.setForeground(Color.RED);

sketchPanel.setColor(Color.RED);

redButton.setForeground(Color.RED);

sketchPanel.setShapeType(ShapeTypes.LINE);

}

private void initListener() {

redButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

redAction(e);

}

});

blueButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

blueAction(e);

}

});

greenButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

greenAction(e);

}

});

undoButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

undoAction(e);

}

});

redoButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

redoAction(e);

}

});

exitButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

exitAction(e);

}

});

lineButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

lineAction(e);

}

});

circleButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

circleAction(e);

}

});

rectangleButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

rectangleAction(e);

}

});

}

public SketchpadFrame() {

initFrame();

initListener();

this.setSize(500, 600);

setLocationByPlatform(true);

setResizable(true);

}

/* ********************处理事件********************* */

private void undoAction(ActionEvent e) {

sketchPanel.undo();

}

private void redoAction(ActionEvent e) {

sketchPanel.redo();

}

private void exitAction(ActionEvent e) {

System.exit(0);

}

private void lineAction(ActionEvent e) {

// 选中按钮为红色, 其余为黑色

lineButton.setForeground(Color.RED);

circleButton.setForeground(Color.BLACK);

rectangleButton.setForeground(Color.BLACK);

sketchPanel.setShapeType(ShapeTypes.LINE);

}

private void circleAction(ActionEvent e) {

circleButton.setForeground(Color.RED);

lineButton.setForeground(Color.BLACK);

rectangleButton.setForeground(Color.BLACK);

sketchPanel.setShapeType(ShapeTypes.CIRCLE);

}

private void rectangleAction(ActionEvent e) {

rectangleButton.setForeground(Color.RED);

lineButton.setForeground(Color.BLACK);

circleButton.setForeground(Color.BLACK);

sketchPanel.setShapeType(ShapeTypes.RECTANGLE);

}

private void redAction(ActionEvent e) {

redButton.setForeground(Color.RED);

blueButton.setForeground(Color.BLACK);

greenButton.setForeground(Color.BLACK);

sketchPanel.setColor(Color.RED);

}

private void blueAction(ActionEvent e) {

blueButton.setForeground(Color.RED);

redButton.setForeground(Color.BLACK);

greenButton.setForeground(Color.BLACK);

sketchPanel.setColor(Color.BLUE);

}

private void greenAction(ActionEvent e) {

greenButton.setForeground(Color.RED);

redButton.setForeground(Color.BLACK);

blueButton.setForeground(Color.BLACK);

sketchPanel.setColor(Color.GREEN);

}

}

/**

 * 

 * @author 不落的太阳(Sean Yang)

 * @version 1.0

 * @since JDK 1.8

 * 

 */

public class SketchpadMain {

/**

 * 测试方法

 * 

 * @param args命令行参数

 */

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

JFrame frame = new SketchpadFrame();

frame.setVisible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

});

}

}

急求如何用JAVA写一个简单的计算器 或者 画板

import java.awt.*;

import java.awt.event.*;

public class jisuanqi extends WindowAdapter {

Panel p1 = new Panel();

Panel p2 = new Panel();

Panel p3 = new Panel();

TextField txt;

private Button[] b = new Button[17];

private String ss[] = { "7", "8", "9", "+", "4", "5", "6", "-", "1", "2",

"3", "*", "清空", "0", "=", "/", "关闭" };

static double a;

static String s, str;//定义变量 创建对像

public static void main(String args[]) {

(new jisuanqi()).frame();

}

public void frame() {

Frame fm = new Frame("简单计算器");

for (int i = 0; i = 16; i++) {

b[i] = new Button(ss[i]);

}

for (int i = 0; i = 15; i++) {

p2.add(b[i]);

} //创建按钮 并添加到P2

b[16].setBackground(Color.yellow);

txt = new TextField(15);

txt.setEditable(false);

for (int i = 0; i = 16; i++) {

b[i].addActionListener(new buttonlistener());//添加监听器

}

b[16].addActionListener(new close());

fm.addWindowListener(this);

fm.setBackground(Color.red);

p1.setLayout(new BorderLayout());

p1.add(txt, "North");

p2.setLayout(new GridLayout(4, 4));

p3.setLayout(new BorderLayout());

p3.add(b[16]);

fm.add(p1, "North");

fm.add(p2, "Center");

fm.add(p3, "South");

fm.pack();

fm.setVisible(true);//都是些窗中设置 添加相关组件和监听器

}

public void windowClosing(WindowEvent e) {

System.exit(0);//退出系统

}

class buttonlistener implements ActionListener {//编写监听器事件 通过按键得出给果

public void actionPerformed(ActionEvent e) {

Button btn = (Button) e.getSource();

if (btn.getLabel() == "=") {

jisuan();

str = String.valueOf(a);

txt.setText(str);

s = "";

} else if (btn.getLabel() == "+") {

jisuan();

txt.setText("");

s = "+";

} else if (btn.getLabel() == "-") {

jisuan();

txt.setText("");

s = "-";

} else if (btn.getLabel() == "/") {

jisuan();

txt.setText("");

s = "/";

} else if (btn.getLabel() == "*") {

jisuan();

txt.setText("");

s = "*";

} else {

txt.setText(txt.getText() + btn.getLabel());

if (btn.getLabel() == "清空")

txt.setText("");

}

}

public void jisuan() {//编写具体计算方法

if (s == "+")

a += Double.parseDouble(txt.getText());

else if (s == "-")

a -= Double.parseDouble(txt.getText());

else if (s == "*")

a *= Double.parseDouble(txt.getText());

else if (s == "/")

a /= Double.parseDouble(txt.getText());

else

a = Double.parseDouble(txt.getText());

}

}

}

class close implements ActionListener {//退出

public void actionPerformed(ActionEvent e) {

System.exit(0);

}

}

java 涂鸦画板

 

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);

}

}

java画板

//有问题的话,给我发百度消息

import java.awt.Color;

import java.awt.Cursor;

import java.awt.Graphics;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.LinkedList;

import java.util.List;

import javax.swing.JFrame;

import javax.swing.JPanel;

/**功能介绍

* 1.改变线条长度时鼠标形状的改变(鼠标位于线条两端时,四种鼠标状态)

* 2.移动线条时鼠标形状的改变(鼠标位于线条中间)

* 3.删除时鼠标形状的改变

* 4.最后一条直线颜色的不同

* 5.最大化、最小化、窗口大小改变时,线条的重绘

*

*/

public class LineDraw extends JFrame{

/**

*我需要在一个背景下能在任意位置添加线条,

能通过鼠标左键拉长,并且如果当鼠标点到直线中央时能拖动线条,当用鼠标右键点击直线时直线能消失。

*/

private LineDrawPanel drawPanel=new LineDrawPanel();

public static void main(String[] args) {

new LineDraw("画图面板");

}

public LineDraw(String title) {

super(title);

setBounds(300, 100, 500, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

add(drawPanel);

validate();

}

}

class LineDrawPanel extends JPanel{

private int x1;

private int y1;

private Line lastLine;//最后一条线,也是当前正在画的线,注意线的颜色

private boolean isDrawing;//是否正在画的标记

private Line moveLine;//正在移动的线条

private Line changeLine;//正在改变长度的线条

private ListLine list=new LinkedListLine();

public LineDrawPanel() {

init();

}

public void init() {

MouseAdapter adapter=new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

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

x1 = e.getX();

y1 = e.getY();

moveLine=getMoveLine(x1, y1);

if(moveLine!=null){

setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));

setToolTipText("移动");

return;

}

changeLine=getChangeLine(x1, y1);

if(changeLine!=null){

return;

}

setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

setToolTipText("画图");

isDrawing=true;

}

}

@Override

public void mouseMoved(MouseEvent e) {

Line l=getChangeLine(e.getX(), e.getY());

if(l!=null){//设置四种鼠标形状

setToolTipText("变长");

if(Math.abs(l.x1-l.x2)4){

setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));

}

else if(Math.abs(l.y1-l.y2)4){

setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));

}

else{

double k=(l.y1-l.y2)*1.0/(l.x1-l.x2);

if(k=0) setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));

else setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));

}

}else{

l=getMoveLine(e.getX(), e.getY());

if(l!=null) {

setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));

setToolTipText("移动");

return;

}

l=getDelLine(e.getX(), e.getY());

if(l!=null){

setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

setToolTipText("右键删除");

}else {

setCursor(Cursor.getDefaultCursor());

}

}

}

@Override

public void mouseDragged(MouseEvent e) {

if(moveLine!=null){

moveLine.move(e.getX()-x1, e.getY()-y1);

x1 = e.getX();

y1 = e.getY();

repaint();

return;

}

if(changeLine!=null){

int xVal=e.getX()-x1;

int yVal=e.getY()-y1;

if(Math.abs(xVal)5||Math.abs(yVal)5)

return;

changeLine.changeLength(xVal,yVal );

x1 = e.getX();

y1 = e.getY();

repaint();

return;

}

if(isDrawing){

int xVal=e.getX()-x1;

int yVal=e.getY()-y1;

if(Math.abs(xVal)3||Math.abs(yVal)3)

return;

lastLine=new Line(x1, y1, e.getX(), e.getY());

repaint();

}

}

@Override

public void mouseReleased(MouseEvent e) {

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

if(moveLine!=null){//移动

moveLine=null;

repaint();

return;

}

if(changeLine!=null){//改变长度

return;

}

if(isDrawing){//画线条

isDrawing=false;//重置

lastLine=null;

setCursor(Cursor.getDefaultCursor());

int xVal=e.getX()-x1;

int yVal=e.getY()-y1;

if(Math.abs(xVal)3||Math.abs(yVal)3)

return;

Line l=new Line(x1, y1, e.getX(), e.getY());

list.add(l);

}

}else if(e.getButton()==MouseEvent.BUTTON3){//鼠标右键

Line delLine=getDelLine(e.getX(), e.getY());//该删除的线

if(delLine!=null){

list.remove(delLine);

int size=list.size();

lastLine=(size0?list.get(size-1):null);

repaint();

}

}

}

};

addMouseListener(adapter);//添加鼠标动作事件

addMouseMotionListener(adapter);//添加鼠标移动事件

}

public void paint(Graphics g) {

super.paint(g);//调用父类的方法

g.setColor(Color.BLUE);

for (Line l:list) {

l.drawLine(g);

}

g.setColor(Color.red);//画最后一个线条

if(lastLine!=null){

lastLine.drawLine(g);

}else {

if(list.size()0) list.get(list.size()-1).drawLine(g);

}

}

public Line getChangeLine(int x,int y){//获取能够改变的直线

for (Line l:list) {

if(l.isCanChange(x,y))

return l;

}

return null;

}

public Line getDelLine(int x,int y){//获取能够删除的直线

for (Line l:list) {

if(l.isCanDel(x,y))

return l;

}

return null;

}

public Line getMoveLine(int x,int y){//获取能够移动的直线

for (Line l:list) {

if(l.isCanMove(x, y))

return l;

}

return null;

}

}

class Line{

public int x1;

public int y1;

public int x2;

public int y2;

public static boolean isStart;//决定改变的线条的那一端

public Line(int x1, int y1, int x2, int y2) {

this.x1 = x1;

this.y1 = y1;

this.x2 = x2;

this.y2 = y2;

}

public void drawLine(Graphics g){

g.drawLine(x1, y1, x2, y2);

}

public void move(int xVal,int yVal){//线条移动

x1+=xVal;

x2+=xVal;

y1+=yVal;

y2+=yVal;

}

public void changeLength(int xVal,int yVal){//改变长度 (该算法有点问题)

if(x1==x2){

xVal=0;

}else {

double k=(y1-y2)*1.0/(x1-x2);

System.out.println(k);

yVal=(int) Math.round(k*xVal);

}

if(isStart){

x1+=xVal;

y1+=yVal;

}else {

x2+=xVal;

y2+=yVal;

}

//x1=(x10?0:x1);

//y1=(y10?0:y1);

}

public boolean isLineValue(){//判断所画的线条是否有效

int len2=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);

if(len2==0) return false;

if(Math.sqrt(len2)=1)//长度小于1的,视为无效线条

return false;

return true;

}

public boolean isCanDel(int x,int y){//线条是否可被删除

int sideA2=(x-x1)*(x-x1)+(y-y1)*(y-y1);

int sideB2=(x-x2)*(x-x2)+(y-y2)*(y-y2);

int sideC2=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);

if(sideA2==0||sideB2==0)return true;

double cosC=(sideA2+sideB2-sideC2)/(2*Math.sqrt(sideA2*sideB2));

if(cosC-0.99) return true;

return false;

}

public boolean isCanChange(int x,int y){//线条是否可改变长度,仅鼠标位于线条两端时才可改变

if(Math.abs(x1-x)2Math.abs(y1-y)2){

isStart=true;

return true;

}

if(Math.abs(x2-x)2Math.abs(y2-y)2){

isStart=false;

return true;

}

return false;

}

public boolean isCanMove(int x,int y){//线条是否可移动

int midX=(x1+x2)/2;

int midY=(y1+y2)/2;

//if(midX==xmidY==y) return false;

if(Math.abs(midX-x)5Math.abs(midY-y)5)

return true;

return false;

}

}

java定义画板的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java实现画板、java定义画板的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。