java画图板

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]);}
    }
  }
 
  
 }

}

你可能感兴趣的:(java)