添加水印,改变鼠标图标,简笔画功能
添加水印所用到方法
方法名 | 方法说明 | 参数 | 参数说明 |
rotate(double theta) | 设置绘图的旋转弧度,让图片旋转 | double theta | 旋转弧度 |
setFont(Font font) | 设置字体 | Font font | 字体对象 |
setComposite(Composite comp) | 设置图片绘制像素的方法,这次用来设置透明度 | Composite comp | 绘图合成借口 |
drawString(String str,intx,inty) | 绘制文字 |
| 要绘制的文字 绘制的横坐标 绘制的纵坐标 |
改添加素材
如图,创建包img.icon和img.picture,并且从资源包里复制图片素材到该包
DrawPictureFrame.java
package com.mr.draw;
/**
* 略略略略略略略
*/
//添加水印
import java.awt.AlphaComposite;
import java.awt.Font;//设置字体
import javax.swing.JOptionPane;//
//改变图标功能
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.Cursor;
public class DrawPictureFrame extends JFrame implements FrameGetShape{//继承窗体类
//水印
private JMenuItem shuiyinMenuItem;//水印菜单
private String shuiyin ="";//水印字符内容
//简笔画
private PictureWindow picWindow;//简笔画展示窗体
private JButton showPicButton;//展开简笔画
/**
* 构造方法,添加组件的初始化方法
*/
public DrawPictureFrame() {
setResizable(false); //窗体不能改变大小
setTitle("画图程序(水印内容:["+ shuiyin+ "])");//设置标题,添加水印内容
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭则停止程序
setBounds(500,100,574,460); //设置窗口位置 Bounds:边界
init(); //组件初始化 init();
addListener(); //添加组件监听
}//DrawPictureFrame()结束
/**
* 组件初始化
*/
private void init() {
/**
* 略略略略略略略
*/
toolBar =new JToolBar();//初始化工具栏
getContentPane().add(toolBar,BorderLayout.NORTH);//工具栏放至船体北方
//简笔画放到保存前面
showPicButton =new JButton("展开简笔画");//初始化按钮对象,并添加文本内容
toolBar.add(showPicButton);工具栏添加按钮
/**
* 略略略略略略略
*/
JMenu systemMenu =new JMenu("系统");//初始化菜单对象,并添加文本内容
menuBar.add(systemMenu);//菜单栏添加菜单对象
shuiyinMenuItem =new JMenuItem("设置水印");
systemMenu.add(shuiyinMenuItem);
}
}
private void addListener() {
/**
* 略略略略略略略
*/
//mouseDragged结束
public void mouseMoved(final MouseEvent arg0) {
if (rubber) {//如果使用橡皮
//设置鼠标指针的图形为图片
Toolkit kit = Toolkit.getDefaultToolkit();//获得系统默认的组件工具包
//使用工具包获得图片
Image img=kit.createImage("src/img/icon/鼠标橡皮.png");
//使用工具包创建一个自定义的光标对象
//参数为图片,光标热点写成0.0,和鼠标描述字符串
Cursor c =kit.createCustomCursor(img,new Point(0,0),"clear");
setCursor(c);//使用自定义的光标
}else {
//设置鼠标指针的形状为十字光体
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}//mouseMoved结束
});//addMouseMotion结束
toolBar.addMouseMotionListener(new MouseMotionAdapter() {//工具栏添加鼠标移动监听
public void mouseMoved(final MouseEvent arg0) {
//设置鼠标指针为默认光标
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});//toolBar.addMouseMotionListener结束
canvas.addMouseListener(new MouseAdapter() {//画板添加鼠标单击事件监听
public void mouseReleased(final MouseEvent arg0) {//当按键抬起时
x=-1; //将记录上一次鼠标绘制点的横坐标恢复成-1
y=-1; //将记录上一次鼠标绘制点的纵坐标恢复成-1
}//mouseReleased结束
//addMouseListener结束
//保存图片
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent argo) {//单击时
addWatermark();//添加水印
DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片
}
});
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {//单击时
addWatermark();//添加水印
DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片
}
});
//设置水印
shuiyinMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {//单击时
//弹出对话框
shuiyin=JOptionPane.showInputDialog(DrawPictureFrame.this,"你想添加的水印:");
if (null == shuiyin) {
shuiyin ="";//字符串为空内容
}else {//如果不是null
setTitle("画图程序(水印内容:[" +shuiyin+"])");//修改窗体标题
}
}
});
}//addlistener()结束
/*
* 添加水印
*/
private void addWatermark() {
if(!"".equals(shuiyin.trim())) {//如果水印字段不是空字符串
g.rotate(Math.toRadians(-30));//将照片旋转-30
Font font =new Font("楷体",Font.BOLD,72);//设置字体
g.setFont(font);//载入字体
g.setColor(Color.GRAY);//使用灰色
AlphaComposite alpha=AlphaComposite.SrcOver.derive(0.4f);//设置透明效果
g.setComposite(alpha);//使用透明效果
g.drawString(shuiyin,150,500);//绘制文字
canvas.repaint();//画板重绘
g.rotate(Math.toRadians(30));//将旋转的图片转回来
alpha =AlphaComposite.SrcOver.derive(1f);//不透明
g.setComposite(alpha);//使用不透明效果
g.setColor(foreColor);//画笔恢复之前颜色
}//if结束
}
添加简笔画
创建PictureWindow.java
package com.mr.draw;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JWindow;
import com.mr.util.BackgroundPanel;
/*
* 简笔画展示窗体
*/
public class PictureWindow extends JWindow {
private JButton changeButton; 更换图片按钮
private JButton hiddenButton; //隐藏按钮
private BackgroundPanel centerPanel;//展示图片的带背景图画板
File list[];//当前选中的图片索引
int index; //父窗体
DrawPictureFrame frame;
/*
* 构造方法
* @param frame父窗体
*/
public PictureWindow(DrawPictureFrame frame) {
this.frame =frame;//构造参数的值赋值给父窗口
setSize(400,460); //设置窗体宽高
init(); //初始化窗体组件
addListener(); //给组件添加监听
}//PictureWindow
/*
* 组件初始化方法
*/
private void init() {
Container c=getContentPane(); //获取窗体主容器
File dir =new File("src/img/picture"); //创建简笔画素材文件夹对象
list =dir.listFiles();//获取文件夹里的所有文件
//初始化背景面板,使用图片文件夹里的第一张简笔画
centerPanel =new BackgroundPanel(getListImage());
c.add(centerPanel,BorderLayout.CENTER);
FlowLayout flow =new FlowLayout(FlowLayout.RIGHT);//创建右对齐的流布局
flow.setHgap(20);//水平间隔20像素
JPanel southPanel =new JPanel();//创建南部面板
southPanel.setLayout(flow);//南部面板使用刚才创建好的流布局
changeButton =new JButton("更换图片");//实例化"更换图片"按钮
southPanel.add(changeButton);//南部面板添加按钮
hiddenButton =new JButton("隐藏");//实例化"隐藏"按钮
southPanel.add(hiddenButton);//南部面板添加按钮
c.add(southPanel,BorderLayout.SOUTH);//南部面板放到主容器的南部位置位置
}//init结束
/*
* 添加监听
*/
private void addListener() {
hiddenButton.addActionListener(new ActionListener() {//隐藏按钮添加动作监听
public void actionPerformed(ActionEvent e) {//单击时
setVisible(false);//本窗体不可见
frame.initShowPicButton();//父窗体还原简笔画按钮文本的内容
}
});//hiddenButton结束
changeButton.addActionListener(new ActionListener() {//隐藏按钮添加动作监听
public void actionPerformed(ActionEvent e) {//单击时
centerPanel.setImage(getListImage());//背景面板重新载入图片
}
});//changeButton.addActionListener结束
}//addListeners结束
/*
* 获取图片文件夹下的图片,每次调用此方法,都会获得不同的文件对象
*/
private Image getListImage() {
String imgPath =list[index].getAbsolutePath();//获取当前索引下的图片文件路径
ImageIcon image =new ImageIcon(imgPath);//获取此图片文件的图标对象
index++;//索引变量递增
if(index >=list.length) {//如果索引变量超过图片数量
index =0;//索引归零
}
return image.getImage();//获得图标对象的图片对象
}//getListImage结束
}//PictureWindow 结束
功能实现
按钮美化
DrawPictureFrame.java
package com.mr.draw;
/**
* 略略略略略略略
*/
import javax.swing.ImageIcon;
//后面的直接复制粘贴了
//引入窗体类
//alt+/ 快速导入
public class DrawPictureFrame extends JFrame implements FrameGetShape{//继承窗体类
//创建一个8位BGR颜色分量的图像
BufferedImage image =new BufferedImage(570,390,BufferedImage.TYPE_INT_BGR);
Graphics gs=image.getGraphics();//获得图像的绘画对象
Graphics2D g=(Graphics2D) gs; //获得绘画对象转换为Graphics2D类型
DrawPictureCanvas canvas =new DrawPictureCanvas();//创建画布对象
Color foreColor=Color.BLACK;//定义前景色 棕色
Color backgroundColor =Color.WHITE; //定义背景色 白色
//鼠标事件
int x=-1; //上次鼠标绘制点的横坐标
int y=-1; //上次鼠标绘制点的纵坐标
boolean rubber=false; //橡皮标识变量
private JToolBar toolBar;//工具栏
private JButton eraserButton;//橡皮
private JToggleButton strokeButton1;//细线按钮
private JToggleButton strokeButton2;//粗线按钮
private JToggleButton strokeButton3;//较粗按钮
private JButton backgroundButton;//背景色按钮
private JButton foregroundButton;//前背景色按钮
private JButton clearButton;//清除按钮
private JButton saveButton;//保存按钮
private JButton shapeButton;//图像按钮
boolean drawShape =false;//画图形标志变量
Shapes shape;//绘制图形
//菜单
private JMenuItem strokeMenuItem1;//细线菜单
private JMenuItem strokeMenuItem2;//粗线菜单
private JMenuItem strokeMenuItem3;//较粗
private JMenuItem clearMenuItem;//清除菜单
private JMenuItem foregroundMenuItem;//前景菜单
private JMenuItem backgroundMenuItem;
private JMenuItem eraserMenuItem;//橡皮菜单
private JMenuItem exitMenuItem;//跳出菜单
private JMenuItem saveMenuItem;//保存菜单
//水印
private JMenuItem shuiyinMenuItem;//水印菜单
private String shuiyin ="";//水印字符内容
//简笔画
private PictureWindow picWindow;//简笔画展示窗体
private JButton showPicButton;//展开简笔画
/**
* 构造方法,添加组件的初始化方法
*/
public DrawPictureFrame() {
setResizable(false); //窗体不能改变大小
setTitle("画图程序(水印内容:["+ shuiyin+ "])");//设置标题,添加水印内容
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭则停止程序
setBounds(500,100,574,460); //设置窗口位置 Bounds:边界
init(); //组件初始化 init();
addListener(); //添加组件监听
}//DrawPictureFrame()结束
/**
* 组件初始化
*/
private void init() {
g.setColor(backgroundColor);//用背景色设置绘图对象的颜色
g.fillRect(0, 0, 570, 390);//使用背景色填充整个画布
g.setColor(foreColor); //设置画布的图像
canvas.setImage(image);//设置画布的图像
getContentPane().add(canvas);//将画布添加到窗体容器默认布局的中部位置
toolBar =new JToolBar();//初始化工具栏
getContentPane().add(toolBar,BorderLayout.NORTH);//工具栏放至船体北方
//简笔画
//showPicButton =new JButton("展开简笔画");//初始化按钮对象,并添加文本内容
showPicButton =new JButton();
showPicButton.setToolTipText("展开简笔画");//设置鼠标悬停提示
showPicButton.setIcon(new ImageIcon("src/img/icon/展开.png"));//设置鼠标图案
toolBar.add(showPicButton);工具栏添加按钮
//saveButton=new JButton("保存");//初始化按钮对象,并添加文本内容
saveButton=new JButton();
saveButton.setToolTipText("保存");
saveButton.setIcon(new ImageIcon("src/img/icon/保存.png"));
toolBar.add(saveButton);//工具栏添加按钮
toolBar.addSeparator();//添加分割线
//初始化有选中状态的按钮对象,并添加文本
strokeButton1 =new JToggleButton();
strokeButton1.setToolTipText("细线");
strokeButton1.setIcon(new ImageIcon("src/img/icon/1像素线条.png"));
strokeButton1.setSelected(true);//细线按钮处于选中状态
toolBar.add(strokeButton1);//工具栏添加按钮
strokeButton2 =new JToggleButton();
strokeButton2.setToolTipText("粗线");
strokeButton2.setIcon(new ImageIcon("src/img/icon/2像素线条.png"));
toolBar.add(strokeButton2);//工具栏添加按钮
strokeButton3 =new JToggleButton();
strokeButton3.setToolTipText("较粗");
strokeButton3.setIcon(new ImageIcon("src/img/icon/4像素线条.png"));
//把上面三个按顺序,画笔粗细按钮组,保证同时只有一个按钮被选中
ButtonGroup strokeGroup =new ButtonGroup();
strokeGroup.add(strokeButton1);//按钮组添加按钮
strokeGroup.add(strokeButton2);
strokeGroup.add(strokeButton3);
toolBar.add(strokeButton3);//工具栏添加按钮
toolBar.addSeparator();//添加分割线
backgroundButton=new JButton("");//初始化按钮对象,并添加文本内容
backgroundButton.setToolTipText("背景颜色");
backgroundButton.setIcon(new ImageIcon("src/img/icon/背景色.png"));
toolBar.add(backgroundButton);//工具栏添加按钮
foregroundButton =new JButton();
foregroundButton.setToolTipText("画笔颜色");
foregroundButton.setIcon(new ImageIcon("src/img/icon/前景色.png"));
toolBar.add(foregroundButton);
toolBar.addSeparator();//添加分割线
shapeButton =new JButton();
shapeButton.setToolTipText("图形");
shapeButton.setIcon(new ImageIcon("src/img/icon/形状.png"));
toolBar.add(shapeButton);
clearButton =new JButton();
clearButton.setToolTipText("清除");
clearButton.setIcon(new ImageIcon("src/img/icon/清除.png"));
toolBar.add(clearButton);
eraserButton =new JButton();
eraserButton.setToolTipText("橡皮");
eraserButton.setIcon(new ImageIcon("src/img/icon/橡皮.png"));
toolBar.add(eraserButton);//工具栏添加按钮
//添加菜单栏
JMenuBar menuBar=new JMenuBar();//创建菜单栏
setJMenuBar(menuBar);//窗体载入菜单栏
//系统内容
JMenu systemMenu =new JMenu("系统");//初始化菜单对象,并添加文本内容
menuBar.add(systemMenu);//菜单栏添加菜单对象
shuiyinMenuItem =new JMenuItem("设置水印");
systemMenu.add(shuiyinMenuItem);
saveMenuItem=new JMenuItem("保存");
systemMenu.add(saveMenuItem);//菜单添加菜单项
//创建简笔画展示画笔,并将本类当作它的父窗体
picWindow =new PictureWindow(DrawPictureFrame.this);
systemMenu.addSeparator();//添加分割线
exitMenuItem =new JMenu("退出");//
systemMenu.add(exitMenuItem);
JMenu strokeMenu=new JMenu("线型");//初始菜单对象,并添加文本内容
menuBar.add(strokeMenu);//菜单添加菜单对象
strokeMenuItem1 =new JMenuItem("细线");
strokeMenu.add(strokeMenuItem1);
strokeMenuItem2 =new JMenuItem("粗线");
strokeMenu.add(strokeMenuItem2);
strokeMenuItem3 =new JMenuItem("较粗");
strokeMenu.add(strokeMenuItem3);
JMenu colorMenu =new JMenu("颜色");
menuBar.add(colorMenu);
foregroundMenuItem=new JMenuItem("画笔颜色");
colorMenu.add(foregroundMenuItem);
backgroundMenuItem=new JMenuItem("背景颜色");
colorMenu.add(backgroundMenuItem);
JMenu editMenu =new JMenu("编辑");
menuBar.add(editMenu);
clearMenuItem =new JMenuItem("清除");
editMenu.add(clearMenuItem);
eraserMenuItem =new JMenuItem("橡皮");
editMenu.add(eraserMenuItem);
}//init()结束
/**
* 为组件添加鼠标移动事件监听
*/
private void addListener() {
//画板添加鼠标移动事件监听
canvas.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent e) { //当鼠标拖拽时
if(x>0 && y>0) { //如果x和y存在鼠标记录
if(rubber) { //橡皮标识为true,表示使用橡皮
g.setColor(backgroundColor); //绘图工具使用背景色
g.fillRect(x, y,10,10);//在鼠标划过的位置画填充的正方形
}else {
g.drawLine(x, y,e.getX(),e.getY());//在鼠标划过的位置画直线
}
}//if结束
x=e.getX();
y=e.getY();
canvas.repaint(); //更新画布
}
public void mouseMoved(final MouseEvent arg0) {
if (rubber) {//如果使用橡皮
//设置鼠标指针的图形为图片
Toolkit kit = Toolkit.getDefaultToolkit();//获得系统默认的组件工具包
//使用工具包获得图片
Image img=kit.createImage("src/img/icon/鼠标橡皮.png");
//使用工具包创建一个自定义的光标对象
//参数为图片,光标热点写成0.0,和鼠标描述字符串
Cursor c =kit.createCustomCursor(img,new Point(0,0),"clear");
setCursor(c);//使用自定义的光标
}else {
//设置鼠标指针的形状为十字光体
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}//mouseMoved结束
});//addMouseMotion结束
toolBar.addMouseMotionListener(new MouseMotionAdapter() {//工具栏添加鼠标移动监听
public void mouseMoved(final MouseEvent arg0) {
//设置鼠标指针为默认光标
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});//toolBar.addMouseMotionListener结束
canvas.addMouseListener(new MouseAdapter() {//画板添加鼠标单击事件监听
public void mouseReleased(final MouseEvent arg0) {//当按键抬起时
x=-1; //将记录上一次鼠标绘制点的横坐标恢复成-1
y=-1; //将记录上一次鼠标绘制点的纵坐标恢复成-1
}//mouseReleased结束
//添加鼠标按下时触发的方法,图形
public void mousePressed(MouseEvent e) {
if (drawShape) {//如果此时我鼠标画的是图形
switch(shape.getType()) {//判断图形的种类
case Shapes.YUAN://如果是圆形
//计算坐标,让鼠标处于图形的中心位置
int yuanX =e.getX() -shape.getWidth()/2;
int yuanY =e.getY() -shape.getHeigth()/2;
//创建圆形,并指定坐标和宽高
Ellipse2D yuan=new Ellipse2D.Double(yuanX,yuanY,shape.getWidth(),shape.getHeigth());
g.draw(yuan);//画图工具画此圆形
break;
case Shapes.FANG:
//计算坐标,让鼠标处于图形的中心位置
int fangX =e.getX() -shape.getWidth()/2;
int fangY =e.getY() -shape.getHeigth()/2;
//创建方形,并指定坐标和宽高
Rectangle2D fang =new Rectangle2D.Double(fangX,fangY,shape.getWidth(),shape.getHeigth());
g.draw(fang);
break;
}
canvas.repaint();//更新画笔
//画图形标识变量为false ,说明选择鼠标画的是图形
drawShape=false;//画完图形之后,回到画笔状态
}
}//图形结束
});//结束canvas.addMouseListener
strokeButton1.addActionListener(new ActionListener() {//"细线“按钮添加动作监听
public void actionPerformed(final ActionEvent arg0) {//单击时
//声明画笔属性,粗细为1像素,线条末端无修饰,折线处呈尖角
BasicStroke bs =new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g.setStroke(bs);//画图工具使用此画笔
}
});
strokeButton2.addActionListener(new ActionListener() {//"细线“按钮添加动作监听
public void actionPerformed(final ActionEvent arg0) {//单击时
//声明画笔属性,粗细为2像素,线条末端无修饰,折线处呈尖角
BasicStroke bs =new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g.setStroke(bs);//画图工具使用此画笔
}
});
strokeButton3.addActionListener(new ActionListener() {//"细线“按钮添加动作监听
public void actionPerformed(final ActionEvent arg0) {//单击时
//声明画笔属性,粗细为3像素,线条末端无修饰,折线处呈尖角
BasicStroke bs =new BasicStroke(3,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g.setStroke(bs);//画图工具使用此画笔
}
});
//背景颜色
backgroundButton.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener
public void actionPerformed(final ActionEvent arg0) {
//单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色)
Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN);
if (bgColor !=null) {//如果选中的颜色不是空的
backgroundColor=bgColor;//将选中的颜色赋给背景色变量
}
//背景色按钮也更换为这种颜色
backgroundButton.setBackground(backgroundColor);
g.setColor(backgroundColor);//绘图工具使用颜色
g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布
g.setColor(foreColor);//画图工具使用前景色
canvas.repaint();//更新画布
}
});//backgroundButton.addActionListener结束
//画笔颜色--前景色
foregroundButton.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener
public void actionPerformed(final ActionEvent arg0) {
//单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色)
Color fColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN);
if (fColor !=null) {//如果选中的颜色不是空的
backgroundColor=fColor;//将选中的颜色赋给背景色变量
}
//背景色按钮也更换为这种颜色
foregroundButton.setBackground(foreColor);
g.setColor(foreColor);//绘图工具使用颜色
}
});
//清除与橡皮按钮事件实现
clearButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
g.setColor(backgroundColor);
g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布,实现清除功能
g.setColor(foreColor);//画图工具使用画笔颜色
canvas.repaint();//更新画布
}
});
eraserButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
if(rubber){//单击按钮,使用橡皮
eraserButton.setToolTipText("橡皮");//鼠标悬停显示
//设置鼠标图案
eraserButton.setIcon(new ImageIcon("src/img/icon/橡皮.png"));
eraserMenuItem.setText("橡皮");
g.setColor(foreColor);
rubber = false;
}else {
eraserMenuItem.setText("画图");
eraserButton.setToolTipText("画图");
//设置鼠标按钮
eraserButton.setIcon(new ImageIcon("src/img/icon/画笔.png"));
g.setColor(backgroundColor);
rubber =true;
}
}
});//橡皮结束
//图形
shapeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {//单击时
ShapeWindow shapeWindow=new ShapeWindow(DrawPictureFrame.this);//创建图形选择组件
int shapeButtonWidth = shapeButton.getWidth();//获取图形按钮宽度
int shapeWindowWidth = shapeWindow.getWidth();//获取图形按钮高度
int shapeButtonX =shapeButton.getX();//获取图形按钮横坐标
int shapeButtonY =shapeButton.getY();//获取图形按钮纵坐标
//计算图形组件横坐标,让组件与“图形”按钮居中对齐
int shapeWindowX =getX() +shapeButtonX-(shapeWindowWidth -shapeButtonWidth)/2;
//计算图形组件纵坐标,让组件与“图形”按钮下方
int shapeWindowY =getY()+shapeButtonY+80;
//设置图形组件坐标位置
shapeWindow.setLocation(shapeWindowX,shapeWindowY);
shapeWindow.setVisible(true);//图形可见
}
});//图形结束
//保存图片
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent argo) {//单击时
addWatermark();//添加水印
DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片
}
});
/**
* 菜单监听,基本和前面的一样,修改为saveMenuItem.
*/
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {//单击时
addWatermark();//添加水印
DrawImageUtil.saveImage(DrawPictureFrame.this,image);//打印图片:打印当前窗体(DrawPictureFrame.this)为图片
}
});
//设置水印
shuiyinMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {//单击时
//弹出对话框
shuiyin=JOptionPane.showInputDialog(DrawPictureFrame.this,"你想添加的水印:");
if (null == shuiyin) {
shuiyin ="";//字符串为空内容
}else {//如果不是null
setTitle("画图程序(水印内容:[" +shuiyin+"])");//修改窗体标题
}
}
});
//清除与橡皮按钮事件实现
clearMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
g.setColor(backgroundColor);
g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布,实现清除功能
g.setColor(foreColor);//画图工具使用画笔颜色
canvas.repaint();//更新画布
}
});
eraserMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
if(rubber) {
eraserButton.setToolTipText("橡皮");//鼠标悬停显示
eraserButton.setIcon(new ImageIcon("src/img/icon/橡皮.png"));
eraserMenuItem.setText("橡皮");
g.setColor(foreColor);
rubber =false;
}else {
eraserButton.setToolTipText("画图");//鼠标悬停显示
eraserButton.setIcon(new ImageIcon("src/img/icon/画笔.png"));
eraserMenuItem.setText("画图");
g.setColor(backgroundColor);
rubber =true;
}
}
});//橡皮结束
//背景颜色
backgroundMenuItem.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener
public void actionPerformed(final ActionEvent arg0) {
//单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色)
Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN);
if (bgColor !=null) {//如果选中的颜色不是空的
backgroundColor=bgColor;//将选中的颜色赋给背景色变量
}
//背景色按钮也更换为这种颜色
backgroundButton.setBackground(backgroundColor);
g.setColor(backgroundColor);//绘图工具使用颜色
g.fillRect(0,0,570,390);//画一个背景颜色的方形填满整个画布
g.setColor(foreColor);//画图工具使用前景色
canvas.repaint();//更新画布
}
});//backgroundButton.addActionListener结束
//画笔颜色--前景色
foregroundMenuItem.addActionListener(new ActionListener() {//背景色按钮添加动作监听:ActionListener
public void actionPerformed(final ActionEvent arg0) {
//单击时打开颜色对话框,参数依次为:父窗体,标题,默认选中的颜色(青色)
Color bgColor =JColorChooser.showDialog(DrawPictureFrame.this,"颜色对话框",Color.CYAN);
if (bgColor !=null) {//如果选中的颜色不是空的
backgroundColor=bgColor;//将选中的颜色赋给背景色变量
}
//背景色按钮也更换为这种颜色
foregroundButton.setBackground(foreColor);//画笔颜色也更换为这种颜色
g.setColor(backgroundColor);//绘图工具使用颜色
}
});
strokeMenuItem1.addActionListener(new ActionListener() {//"细线“按钮添加动作监听
public void actionPerformed(final ActionEvent arg0) {//单击时
//声明画笔属性,粗细为1像素,线条末端无修饰,折线处呈尖角
BasicStroke bs =new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g.setStroke(bs);//画图工具使用此画笔
strokeButton1.setSelected(true);//细线按钮为选中状态
}
});
strokeMenuItem2.addActionListener(new ActionListener() {//"细线“按钮添加动作监听
public void actionPerformed(final ActionEvent arg0) {//单击时
//声明画笔属性,粗细为2像素,线条末端无修饰,折线处呈尖角
BasicStroke bs =new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g.setStroke(bs);//画图工具使用此画笔
strokeButton2.setSelected(true);
}
});
strokeMenuItem3.addActionListener(new ActionListener() {//"细线“按钮添加动作监听
public void actionPerformed(final ActionEvent arg0) {//单击时
//声明画笔属性,粗细为3像素,线条末端无修饰,折线处呈尖角
BasicStroke bs =new BasicStroke(3,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g.setStroke(bs);//画图工具使用此画笔
strokeButton3.setSelected(true);
}
});//画笔结束
//简笔画
showPicButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean isVisible =picWindow.isVisible();//获取简笔画展示窗体可见状态
if(isVisible){//如果简笔画展示窗体是可见的
showPicButton.setToolTipText("展开简笔画");
showPicButton.setIcon(new ImageIcon("src/img/icon/展开.png"));
picWindow.setVisible(false);//隐藏简笔画展示窗体
}else {
showPicButton.setToolTipText("隐藏简笔画");
showPicButton.setIcon(new ImageIcon("src/img/icon/隐藏.png"));
//重新指定简笔画展示窗体的显示位置
//横坐标 =主窗体横坐标 -简笔画窗体宽度-5
//纵坐标 =主窗体纵坐标
picWindow.setLocation(getX()-picWindow.getWidth()-5,getY());
picWindow.setVisible(true);//简笔画展示窗体可见
}
}
});//showPicButton.addActionListener结束
}//组件监听结束
/*
* 恢复展开简笔画按钮的文本内容,此方法共简笔画画笔的”隐藏“按钮可调用
*/
public void initShowPicButton() {
showPicButton.setToolTipText("展开简笔画");
showPicButton.setIcon(new ImageIcon("src/img/icon/展开.png"));
}//initShowPicButton结束
/*
* 添加水印
*/
private void addWatermark() {
if(!"".equals(shuiyin.trim())) {//如果水印字段不是空字符串
g.rotate(Math.toRadians(-30));//将照片旋转-30
Font font =new Font("楷体",Font.BOLD,72);//设置字体
g.setFont(font);//载入字体
g.setColor(Color.GRAY);//使用灰色
AlphaComposite alpha=AlphaComposite.SrcOver.derive(0.4f);//设置透明效果
g.setComposite(alpha);//使用透明效果
g.drawString(shuiyin,150,500);//绘制文字
canvas.repaint();//画板重绘
g.rotate(Math.toRadians(30));//将旋转的图片转回来
alpha =AlphaComposite.SrcOver.derive(1f);//不透明
g.setComposite(alpha);//使用不透明效果
g.setColor(foreColor);//画笔恢复之前颜色
}//if结束
}
//FrameGetShape接口实现类,用于获得图形空间返回的被选中的图形
@Override
public void getShape(Shapes shape) {
this.shape =shape;//将反回的图形对象赋给类的全局变量
drawShape =true; //画图形标识变量为true,声明现在鼠标画的是图形,而不是线条
}//结束
public static void main(String[] args) {
DrawPictureFrame frame=new DrawPictureFrame();//创建窗体对象
frame.setVisible(true);//让窗口可见
}//main()结束
//主类结束
}
好啦,本次项目就做到这里啦,期待下一项吧~