您的位置:首页 > 编程语言 > Java开发

java小小工具第二弹 画图

2016-03-02 23:02 423 查看
/*

* 实现对直线,矩形,圆,曲线,颜色变换的绘画

* 利用集合封装线条类型,位置,颜色

* 以及撤销和返还功能

*/



package cn.hncu.mytoolkit;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

import cn.hncu.set.MySet;

public class MyDraw extends JFrame{
private int DRAETYPE=0;
private Color DRAECOLOR=Color.black;
private static final int DRAELINE=0;
private static final int DRAECURVE=1;
private static final int DRAERECTANGLE=2;
private static final int DRAECIRCLE=4;
private JPopupMenu pmenu;
private JMenuItem[] menuItem;
private JDrawPanel palette;
private MySet mySet=new MySet();
private MySet myAdd=new MySet();
private Point state;
private Point end;
private static final String dir="./images_Draw/";
private boolean drawFlag=false;

public MyDraw(){
super("我的简易绘图");
setBounds(200, 80, 600, 400);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);

palette=new JDrawPanel();
getContentPane().add(palette);
//利用快捷菜单来实现功能
pmenu=new JPopupMenu();
String[] str={"直线","曲线","矩形","圆","撤回","返撤","颜色..."};
String[] str0={"line","curve","rectangle","circle","cancle","add","color"};
menuItem=new JMenuItem[str.length];
for (int i = 0; i < menuItem.length; i++) {
ImageIcon img=new ImageIcon(dir+str0[i]+".png");
menuItem[i]=new JMenuItem(str[i],img);
menuItem[i].setActionCommand(str0[i]);
//匿名内部类
menuItem[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//设置线的类型
if(e.getActionCommand().equals("line"))
DRAETYPE=DRAELINE;
else if(e.getActionCommand().equals("curve"))
DRAETYPE=DRAECURVE;
else if(e.getActionCommand().equals("rectangle"))
DRAETYPE=DRAERECTANGLE;
else if(e.getActionCommand().equals("circle"))
DRAETYPE=DRAECIRCLE;
else if(e.getActionCommand().equals("color")){
Color c=JColorChooser.showDialog(null, "颜色选择", Color.black);
DRAECOLOR=c;
}else if(e.getActionCommand().equals("cancle")){
//对撤销的处理
if(mySet.size()<=0)
return;
MyGeaph geaph=(MyGeaph)mySet.get(mySet.size()-1);
//不是曲线,删除该线条
if(geaph.drawType!=DRAECURVE){
myAdd.add(geaph);
mySet.remove(mySet.size()-1);
}
else{
//是曲线,找到构成曲线所有的点,并删除
while(true){
MyGeaph gelast=(MyGeaph)mySet.get(mySet.size()-1);
myAdd.add(gelast);
mySet.remove(mySet.size()-1);
if(mySet.size()<=0)
break;
MyGeaph ge=(MyGeaph)mySet.get(mySet.size()-1);
if(ge.drawType!=DRAECURVE)
break;
if(!(gelast.state.x==ge.end.x&&gelast.state.y==ge.end.y))
break;
}
}
palette.repaint();
}else if(e.getActionCommand().equals("add")){
//将撤销的线储存起来,以便返还
if(myAdd.size()<=0)
return;
MyGeaph geaph=(MyGeaph)myAdd.get(myAdd.size()-1);
if(geaph.drawType!=DRAECURVE){
mySet.add(geaph);
myAdd.remove(myAdd.size()-1);
}
else{
while(true){
MyGeaph gelast=(MyGeaph)myAdd.get(myAdd.size()-1);
mySet.add(gelast);
myAdd.remove(myAdd.size()-1);
if(myAdd.size()<=0)
break;
MyGeaph ge=(MyGeaph)myAdd.get(myAdd.size()-1);
if(ge.drawType!=DRAECURVE)
break;
if(!(gelast.end.x==ge.state.x&&gelast.end.y==ge.state.y))
break;
}
}
palette.repaint();
}
}
});
pmenu.add(menuItem[i]);
}
palette.add(pmenu);
//鼠标监听
palette.addMouseListener(new MouseListener(){
@Override
public void mouseReleased(MouseEvent e) {
//划线终点
if(!(e.getModifiers()==MouseEvent.BUTTON1_MASK))
return;
drawFlag=false;
palette.repaint();
}
@Override
public void mousePressed(MouseEvent e) {
//划线落点
if(!(e.getModifiers()==MouseEvent.BUTTON1_MASK))
return;
myAdd.removeAll();
drawFlag=false;
state=new Point(e.getX(), e.getY());
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
//右键快捷菜单显示
if(e.getModifiers()==MouseEvent.BUTTON3_MASK)
pmenu.show(palette, e.getX(), e.getY());
}
});
palette.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
}
//对鼠标拖动过程的处理,具有橡皮线功能
@Override
public void mouseDragged(MouseEvent e) {
if(!(e.getModifiers()==MouseEvent.BUTTON1_MASK))
return;
if(DRAETYPE==DRAECURVE){
end=new Point(e.getX(), e.getY());
mySet.add(new MyGeaph(state, end, DRAETYPE, DRAECOLOR));
state=new Point(e.getX(), e.getY());
}else{
if(!drawFlag){
drawFlag=true;
}else{
mySet.remove(mySet.size()-1);
}
end=new Point(e.getX(), e.getY());
mySet.add(new MyGeaph(state, end, DRAETYPE, DRAECOLOR));
}
palette.repaint();
}
});

setVisible(true);
}
/*
* 绘画面板
*/
private class JDrawPanel extends JPanel {

@Override
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < mySet.size(); i++) {
MyGeaph geaph=(MyGeaph)mySet.get(i);
g.setColor(geaph.color);
if(geaph.drawType==DRAELINE)
g.drawLine(geaph.state.x, geaph.state.y, geaph.end.x, geaph.end.y);
else if(geaph.drawType==DRAECURVE)
g.drawLine(geaph.state.x, geaph.state.y, geaph.end.x, geaph.end.y);
else if(geaph.drawType==DRAERECTANGLE){
MyGeaph ge=change(geaph);
g.drawRect(ge.state.x, ge.state.y, width(geaph), height(geaph));
}
else if(geaph.drawType==DRAECIRCLE){
MyGeaph ge=change(geaph);
g.drawOval(ge.state.x, ge.state.y, width(geaph), height(geaph));
}
}
}

/*
* 使得绘画正确,数据合理,防止起点终点不一致
*/
private MyGeaph change(MyGeaph geaph) {
Point state=new Point();
Point end=new Point();
if(geaph.state.x<geaph.end.x){
state.x=geaph.state.x;
end.x=geaph.end.x;
}else{
state.x=geaph.end.x;
end.x=geaph.state.x;
}
if(geaph.state.y<geaph.end.y){
state.y=geaph.state.y;
end.y=geaph.end.y;
}else{
state.y=geaph.end.y;
end.y=geaph.state.y;
}
return new MyGeaph(state, end, geaph.drawType, geaph.color);
}

private int height(MyGeaph geaph) {
return Math.abs(geaph.end.y-geaph.state.y);
}

private int width(MyGeaph geaph) {
return Math.abs(geaph.end.x-geaph.state.x);
}

}
private class MyGeaph{
private Point state,end;
private int drawType;
private Color color;

public MyGeaph(Point state, Point end, int drawType, Color color) {
this.state = state;
this.end = end;
this.drawType = drawType;
this.color = color;
}

}
public static void main(String[] args) {
new MyDraw();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: