Java Swing实现画板
https://github.com/nekoer723/drawpic
源码已上传
基本要求:
-
新建一个空白图形文件
-
打开或者保存一个图形文件
-
绘制基本图形
- 直线、矩形、圆、椭圆
-
任意线
-
添加文字
-
设定颜色与文字风格
优化:
- 设定画笔
- 橡皮擦
- 操作撤销
- 画线与图形的预览
1.面板UI设计与实现
1.设计
-
总窗口
- 布局flowlayout
- 设置关闭方式
- 窗体大小不变
-
菜单栏
-
3个面板(Jpanel),jp1,jp2,jp3
-
jp1(左侧按钮,15行,1列)
- 布局Gridlayout(rows:15,clos:1,hgap:10,vgap:10)
-
jp2(画板)
- 重构 paint函数
- 背景颜色白色
-
jp3(画笔颜色以及粗细)
- 布局GridLayout(1行,颜色数组的长度列)
- Jslider (滑块,调节画笔粗细)
-
2.实现
-
重构paint函数
public void paint(Graphics g1) { g=(Graphics2D)g1; //画船体 System.out.println("repaint"); super.paint(g); list = dl.list; for (Shape1 l : list) { l.draw(g); } } //public ArrayList<Shape1> list = new ArrayList<>();
list是一个shape1类的数组,里面储存有图像信息,通过对list里图像信息的重绘来实现画板的更新
-
注意为组件添加监听类
2.画板监听类
这个类实现了所有左侧按钮功能,以及对底部jp3中的颜色
定义了图形类,并实现了基本图形
1.画板监听
public class picListener implements ActionListener, MouseListener, MouseMotionListener{
private Color color = Color.BLACK;
private Graphics2D g; //画笔属性
private String str;//保存按钮上的字符串。区分不同的按钮
private int x1,y1,x2,y2;//坐标
private JButton nowColor;//当前颜色
private float width;//画笔粗细
private int flag1 = 0; //预显示
private Shape1 flag2 = new ImpLine(-1,-1,-1,-1,Color.WHITE,0);//用于撤销操作的标志
public static ArrayList<Shape1> list =new ArrayList<Shape1>();
撤销操作是我自己实现,读者可以尝试用undo函数,比较简单
@Override
public void actionPerformed(ActionEvent e) {
//判断是颜色按钮还是图形按钮
if ("".equals(e.getActionCommand())) {
JButton jb = (JButton) e.getSource();
color = jb.getBackground();
nowColor.setBackground(color);//处理当前颜色
} else {
str = e.getActionCommand();
if("文本框".equals(str)) {
pic2.paint.textin.setVisible(true);
System.out.println(pic2.paint.getDl().getG().getFont().getName());
} else if ("清空".equals(e.getActionCommand())) {
list.removeAll(list);
pic2.paint.jp2.repaint();
} else if ("撤销".equals(e.getActionCommand())) {
//list.remove(list.size() - 1);
int t =list.size();
int fff = 0;
for(int i = 1; i<=t ;i++) {
if(list.get(list.size() - i) == flag2) {
fff=1;
}
}
if(fff == 1){
for(int i = 0; i<t ;i++) {
if(list.get(list.size() - 1) == flag2){
list.remove(list.size() - 1);
System.out.println("撤销");
pic2.paint.jp2.repaint();
break;
}
else {
list.remove(list.size() - 1);
}
}
}
//list.remove(list.size() - 1);
//pic2.paint.jp2.repaint();
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
g.setColor(color);//改变画笔的颜色
x1=e.getX();//获取按下时鼠标的x坐标
y1=e.getY();//获取按下时鼠标的y坐标
if("画曲线".equals(str) ||"画直线".equals(str) ||"矩形".equals(str) ||"圆形".equals(str) ||"椭圆".equals(str)||"实心圆形".equals(str)
||"橡皮擦".equals(str)){
System.out.println("press");
list.add(flag2);
}
}
@Override
public void mouseReleased(MouseEvent e) {
//list.add(flag2);
if(flag1 > 0) {
System.out.println("removeflage");
list.remove