Java实验-Swing 涂鸦板
实验要求:
涂鸦板是一个具有趣味性的小程序,它的实现原理是通过鼠标事件,控制鼠标移动结合画图功能实现。鼠标拖拽才开始绘制,松开鼠标则停止绘制。
代码:
--MyPaint画板类:
package com.junlin.exer6;
import javax.swing.JLabel;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
public class MyPaint extends JLabel {
private boolean is_painting = false; //判断是否正在绘制
private List<Curve> curves = new ArrayList<>(); //记录绘制过程中所有的曲线
//记录使用过的线条粗细,主要是为了保留之前绘制的效果,不会让改变线条粗细影响之前的绘制
private List<Float> lineSizes = new ArrayList<>();
//同上记录使用过的颜色
private List<Color> lineColors = new ArrayList<>();
private Float currentLineSize = 2.0f; //当前线条的粗细
private Color currentLineColor = Color.RED;
public MyPaint(){
//绑定事件
MyMouseListener handler = new MyMouseListener();
this.addMouseListener(handler);
this.addMouseMotionListener(handler);
}
public void setCurrentLineSize(float currentLineSize) {
this.currentLineSize = currentLineSize;
}
public void setCurrentLineColor(Color color) {
this.currentLineColor = color;
}
//下面这个方法在程序运行的时候被一直调用
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
//this.setOpaque(true);
//this.setBackground(Color.WHITE); //为什么这行代码不起作用就是因为没有写上面设置透明度的代码
// System.out.printf("%d %d\n", width, height);
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
//g.setFont(new Font("宋体", Font.BOLD, 200));
Graphics2D g2 = (Graphics2D)g; //g是Graphics对象
g2.setStroke(new BasicStroke(currentLineSize));
g2.setPaint(currentLineColor);
//从曲线集合中进行绘制
for(int i = 0;i < curves.size();i++) {
Curve curve = curves.get(i);
g2.setStroke(new BasicStroke(lineSizes.get(i)));
g2.setPaint(lineColors.get(i));
if(curve.points.size() >= 2) {
Point p1 = curve.points.get(0);
for(int j = 1;j < curve.points.size();j++){
Point p2 = curve.points.get(j);
g.drawLine(p1.x,p1.y,p2.x,p2.y);
p1 = p2;
}
}
}
}
//清空画板
public void clearPaint() {
this.curves.clear();
this.lineSizes.clear();
this.lineColors.clear();
repaint();
}
//监听内部类
public class MyMouseListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
is_painting = true;
lineSizes.add(currentLineSize);
lineColors.add(currentLineColor);
Curve curve = new Curve();
curve.points = new ArrayList<>();
curves.add(curve);
}
@Override
public void mouseReleased(MouseEvent e) {
is_painting = false;
}
@Override
public void mouseDragged(MouseEvent e) {
//如果表示正在绘制
if(is_painting) {
//取出曲线集合中的最后一条曲线(就是当前正在绘制的曲线)
Curve curve = curves.get(curves.size() - 1);
curve.points.add(e.getPoint()); //将当前的点加入曲线中
repaint(); //重新绘制
}
}
}
//曲线内部类,其属性就是曲线上的点的集合
public class Curve {
List<Point> points;
}
}
MyFrame窗体类:
package com.junlin.exer6;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class MyFrame extends JFrame {
public MyFrame(){
super("涂鸦板");
JPanel root = new JPanel();
root.setLayout(null);
this.add(root);
//自定义画板控件
MyPaint paint = new MyPaint();
paint.setBounds(250,10,600,600);
root.add(paint);
//清除画板按钮
JButton clearBtn = new JButton("清空画板");
clearBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
paint.clearPaint();
}
});
clearBtn.setBounds(70,40,95,40);
root.add(clearBtn);
//文本标签
JLabel lineSizeLabel = new JLabel("选择线条粗细:");
lineSizeLabel.setBounds(10,300,100,20);
lineSizeLabel.setFont(new Font("宋体", Font.BOLD, 14));
root.add(lineSizeLabel);
//线条粗细列表
JComboBox<String> LineTypeField = new JComboBox<>();
for(int i = 2;i <= 12;i += 2) {
LineTypeField.addItem(i+"");
}
LineTypeField.setBounds(120,300,100,30);
LineTypeField.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
// 选择的下拉框选项
System.out.println(e.getItem() instanceof String);
float size = Float.parseFloat(String.valueOf(e.getItem()));
paint.setCurrentLineSize(size);
}
}
});
root.add(LineTypeField);
//文本控件
JLabel lineColorLabel = new JLabel("选择线条颜色:");
lineColorLabel.setBounds(10,200,100,20);
lineColorLabel.setFont(new Font("宋体", Font.BOLD, 14));
root.add(lineColorLabel);
//颜色选择列表
JComboBox<String> LineColorField = new JComboBox<>();
LineColorField.addItem("红色");
LineColorField.addItem("蓝色");
LineColorField.addItem("粉红色");
LineColorField.addItem("橙色");
LineColorField.addItem("绿色");
LineColorField.setBounds(120,200,100,30);
LineColorField.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
// 选择的下拉框选项
Color color;
switch (String.valueOf(e.getItem())) {
case "红色":
color = Color.RED;
break;
case "蓝色":
color = Color.BLUE;
break;
case "粉红色":
color = Color.PINK;
break;
case "橙色":
color = Color.ORANGE;
break;
case "绿色":
color = Color.GREEN;
break;
default:
color = Color.BLACK;
break;
}
paint.setCurrentLineColor(color);
}
}
});
root.add(LineColorField);
this.setSize(1000,700);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
--JavaMain主类:
package com.junlin.exer6;
public class JavaMain {
public static void main(String[] args) {
new MyFrame();
}
}
你只管出发,旅途自有风景~~