package drawpaint;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 定义一个画图的主界面类,该类继承自JFrame;那么DrawingBorder就是窗体了
*
* @author Administrator
*
*/
public class DrawingBorder extends JFrame {
/**
* 主函数
*/
public static void main(String[] args) {
// 实例化一个DrawingBorder类的对象
DrawingBorder db = new DrawingBorder();
// 调用初始化界面的方法
db.initUI();
}
/**
* 初始化界面的方法
*/
private void initUI() {
this.setTitle("简单画板");
this.setSize(600, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setLayout(new BorderLayout());
/**
* 实例化一个放置在北边的面板对象,该面板对象上要放置图形和颜色按钮
*/
JPanel panelNorth = new JPanel();
// 实例化按钮对象
JButton btnLine = new JButton("Line");
JButton btnRect = new JButton("Rect");
JButton btnOval = new JButton("Oval");
JButton btnfill = new JButton("Fill");
JButton btnColor = new JButton("Color");
// 将按钮添加到panelNorth
panelNorth.add(btnLine);
panelNorth.add(btnRect);
panelNorth.add(btnOval);
panelNorth.add(btnColor);
panelNorth.add(btnfill);
// 给按钮添加动作监听器方法,绑定事件处理类的对象al
btnLine.addActionListener(al);
btnRect.addActionListener(al);
btnOval.addActionListener(al);
btnColor.addActionListener(al);
btnfill.addActionListener(al);
// 将panelNorth添加到窗体的北边
this.add(panelNorth, BorderLayout.NORTH);
/**
* 实例化一个放置在中间的面板对象,该面板是用来绘图的
*/
JPanel panelCenter = new JPanel();
// 设置按钮的背景色为白色
panelCenter.setBackground(Color.WHITE);
// 将panelCenter添加到窗体的中央
this.add(panelCenter, BorderLayout.CENTER);
this.setVisible(true);
//要再窗体可见之后才能获取画布对象
Graphics g = panelCenter.getGraphics();
//实例化一个DrawingListener类的对象,并且传递参数
DrawingListener dl = new DrawingListener(this,g);
//给panelCenter添加鼠标监听器方法,绑定事件处理类对象dl
panelCenter.addMouseListener(dl);
}
/**
* 此处使用匿名内部类
*/
private ActionListener al = new ActionListener() {
/**
* 事件处理方法
*/
public void actionPerformed(ActionEvent e) {
// 判断当前点击的按钮是否是Color
if (e.getActionCommand().equals("Color")) {
// 弹出一个颜色界面,让用户选择颜色,然后把用户选择的颜色赋给color变量
color = JColorChooser.showDialog(null, "颜色选择", Color.BLACK);
} else {// 此处就表示选择的是其他的图形按钮
value = e.getActionCommand();
}
}
};
// 声明一个颜色属性
public Color color = Color.BLACK;
// 声明一个图形属性
public String value = "Line";
}
package drawpaint;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* 定义一个鼠标事件的处理类,该类要实现MouseListener接口
* @author Administrator
*
*/
public class DrawingListener implements MouseListener {
private DrawingBorder db;//db对象是用来获取颜色和图形的
private Graphics g;//g对象是用来画图形的
private int x1,y1,x2,y2,x3,x4,y3,y4,x5,y6;;//用来存储按下和释放时的坐标值
int X3[]= new int[10000];
int Y3[]= new int[10000];
int X4[]= new int[10000];
int Y4[]= new int[10000];
int i=0;
/**
* 构造函数
* @param db对象是用来获取颜色和图形的
* @param g对象是用来画图形的
*/
public DrawingListener(DrawingBorder db,Graphics g){
this.db = db;
this.g = g;
}
/**
* 鼠标在事件源上按下的时候,执行的方法
*/
public void mousePressed(MouseEvent e) {
//获取鼠标在事件源上按下时的坐标值
x1 = e.getX();
y1 = e.getY();
}
/**
* 鼠标在事件源上释放的时候,执行的方法
*/
public void mouseReleased(MouseEvent e) {
//获取鼠标在事件源上释放时的坐标值
x2 = e.getX();
y2 = e.getY();
//设置要画图形的颜色
g.setColor(db.color);
//判断当前选择的图形是否是Line
if(db.value.equals("Line")){
//调用画布对象中的drawLine方法根据四个坐标来绘制一条直线
g.drawLine(x1, y1, x2, y2);
}
else if(db.value.equals("Rect")||db.value.equals("Oval")){
//坐标的判断
x3=x1<x2?x1:x2;
y3=y1<y2?y1:y2;
x4=x1>x2?x1:x2;
y4=y1>y2?y1:y2;
X3[i]=x3;
Y3[i]=y3;
X4[i]=x4;
Y4[i]=y4;
if(db.value.equals("Rect")){
//画矩形
g.drawRect(x3, y3, x4-x3, y4-y3);
}
if(db.value.equals("Oval")){
//画椭圆
g.drawOval(x3, y3, x4-x3, y4-y3);
}
i++;
// g.drawRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}
}
/**
* 当鼠标进入事件源的那一刻,会执行该方法
*/
public void mouseEntered(MouseEvent e) {
}
/**
* 当鼠标离开事件源的那一刻,会执行该方法
*/
public void mouseExited(MouseEvent e) {
}
/**
* 当鼠标在事件源上按下并且释放时(并按下和释放必须在同一个点上),会执行该方法
*/
public void mouseClicked(MouseEvent e) {
if(db.value.equals("Fill")){
x5=e.getX();
y6=e.getY();
for(int i=0;i<X3.length;i++){
if(X3[i]<x5&&x5<X4[i]&&Y3[i]<y6&&y6<Y4[i]){
g.fillRect(X3[i], Y3[i], X4[i]-X3[i], Y4[i]-Y3[i]);}
}
}
}
}