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.Dimensionimport 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)
}
})
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)