java做的绘图程序

java做的绘图程序,第1张

// 粗细,颜色都符合你的,你就不要不讲诚信了,我雹缺也跟你没有仇,你视而不见就没有必要了

import java.awt.BasicStroke

import java.awt.BorderLayout

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

    static int startX = -1

    static int startY = -1

    static int endX = -1

    static int endY = -1

 

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

            {

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

            }

 

            @Override

            public void mouseDragged ( MouseEvent e )

       源橘辩     {

                endX = e.getX ()

                endY = e.getY ()

                mdp.paintComponents (mdp.getGraphics ())

                startX = endX

                startY = endY

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

            }

        })

        mdp.addMouseListener (new MouseAdapter ()

        {

            @Override

            public void mousePressed ( MouseEvent e )

            {

                startX = e.getX ()

                startY = e.getY ()

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

            }

 

            @Override

            public void mouseReleased ( MouseEvent e )

            {

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

            }

        })

        mdp.setVisible (true)

    }

}

import java.awt.Dimension

import java.awt.Graphics2D

import java.awt.Image

import java.awt.Rectangle

import java.awt.image.BufferedImage

import java.io.File

import java.io.IOException

import javax.imageio.ImageIO

public class RotateImage {

public static BufferedImage Rotate(Image src, int angel) {

int src_width = src.getWidth(null)

int src_height = src.getHeight(null)

Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(

src_width, src_height)), angel)

BufferedImage res = null

//res = new BufferedImage(rect_des.width, rect_des.height,BufferedImage.TYPE_INT_RGB)

res = new BufferedImage(rect_des.width, rect_des.height,BufferedImage.TYPE_INT_ARGB)

//res = new BufferedImage(rect_des.width, rect_des.height,BufferedImage.TYPE_INT_BGR)

//res = new BufferedImage(rect_des.width, rect_des.height,BufferedImage.TYPE_INT_ARGB_PRE)

Graphics2D g2 = res.createGraphics()

g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2)

g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2)

g2.drawImage(src, null, null)

return res

}

public static Rectangle CalcRotatedSize(Rectangle src, int angel) {

if (angel >= 90) {

if(angel / 90 % 2 == 1){

int temp = src.height

src.height = src.width

src.width = temp

}

angel = angel % 90

}

double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2

double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r

double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2

double angel_dalta_width = Math.atan((double) src.height / src.width)

double angel_dalta_height = Math.atan((double) src.width / src.height)

int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha

- angel_dalta_width))

int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha

- angel_dalta_height))

int des_width = src.width + len_dalta_width * 2

int des_height = src.height + len_dalta_height * 2

return new Rectangle(new Dimension(des_width, des_height))

}

public static void main(String[] args) {

try {

BufferedImage src = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\使用Mondrian查询的一个例子.png"))

BufferedImage des = RotateImage.Rotate(src, 30)

System.out.println(des)

System.out.println(ImageIO.write(des, "png", new File("C:\\Users\\Administrator\\Desktop\\使用Mondrian查询的一个例子_旋转30°.png")))

des = RotateImage.Rotate(src, 150)

System.out.println(des)

System.out.println(ImageIO.write(des, "png", new File("C:\\Users\\Administrator\\Desktop\\使用Mondrian查询的一个例子_旋转150°.png")))

des = RotateImage.Rotate(src, 270)

System.out.println(des)

System.out.println(ImageIO.write(des, "png", new File("C:\\Users\\Administrator\\Desktop\\使用Mondrian查询的一个例子_旋转270°.png")))

} catch (IOException e) {

e.printStackTrace()

}

}

}

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 Stack<Shape> currentShapes = new Stack<Shape>()

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

private final Stack<Shape> deletedShapes = new Stack<Shape>()

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

Enumeration<Shape> 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)

}

})

}

}


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

原文地址: https://outofmemory.cn/yw/12351304.html

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

发表评论

登录后才能评论

评论列表(0条)

保存