简易画图程序(实现橡皮筋功能)

/**
 * Author Zhao Xing
 */
package homeWoek;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * @author Administrator
 *
 */
public class DrawPad extends JFrame {
 private static final long serialVersionUID = 1L;

 private JButton colorButton, clearButton;
 private JLabel statusLabel, styleJLabel, strokeJLabel;
 private JComboBox shapeBox, styleComboBox;
 private JTextField inputField, strokeField;// 下拉框
 private JCheckBox fillCheckBox;// 是否填充
 private JPanel toolPanel, drawPanel, wordJPanel,northJPanel;
 private String namses[] = { "Line", "Oval", "Rect" }, fontNames[] = {
   "Serif", "SansSerif", "Monospaced" };
 private boolean fill = false;//填充标志
 private boolean clear = false, word = false;//清除和文字标记
 private final int LINE = 0, OVAL = 1, RECT = 2;
 private int shape = 0;// 默认直线
 private Color color = Color.black;// 当前颜色为黑色
 // private int R,G,B;//保存当前颜色
 private int topX, topY, x, y, height, width;
 private int size=3;//字体大小
 private String string = "",font="Serif";

 public DrawPad() {
  super("Drawing");

  shapeBox = new JComboBox(namses);
  shapeBox.setMaximumRowCount(3);
  shapeBox.addItemListener(new ItemListener() {
   public void itemStateChanged(ItemEvent event) {
    shape = shapeBox.getSelectedIndex();
   }
  });

  fillCheckBox = new JCheckBox("Fill");
  fillCheckBox.addItemListener(new ItemListener() {
   public void itemStateChanged(ItemEvent event) {
    if (event.getStateChange() == ItemEvent.SELECTED)// 如果选中
     fill = true;// 填充
    else
     fill = false;
   }
  });

  colorButton = new JButton("Color");
  colorButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    chooseColor();
   }
  });

  clearButton = new JButton("Clear");
  clearButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    clear();
   }
  });

  toolPanel = new JPanel();
  toolPanel.setLayout(new GridLayout(1, 4));
  toolPanel.add(shapeBox);
  toolPanel.add(fillCheckBox);
  toolPanel.add(colorButton);
  toolPanel.add(clearButton);

  drawPanel = new JPanel();
  drawPanel.setBackground(Color.white);

  statusLabel = new JLabel();

  inputField = new JTextField(10);
  inputField.addActionListener(new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent event) {
    // TODO Auto-generated method stub
    word = true;// 输入文字
    string = event.getActionCommand();
   }
  });
  
  styleJLabel=new JLabel("Word Style");
  
  styleComboBox=new JComboBox(fontNames);
  styleComboBox.addItemListener(new ItemListener() {
   
   @Override
   public void itemStateChanged(ItemEvent event) {
    // TODO Auto-generated method stub
    font=fontNames[styleComboBox.getSelectedIndex()];//得到选中的字体名字
   }
  });
  
  strokeJLabel=new JLabel("Stroke");
  
  strokeField=new JTextField(3);
  strokeField.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent event) {
    // TODO Auto-generated method stub
    size=Integer.parseInt(event.getActionCommand());
   }
  });

  wordJPanel=new JPanel();
  wordJPanel.setLayout(new FlowLayout());
  wordJPanel.add(inputField);
  wordJPanel.add(styleJLabel);
  wordJPanel.add(styleComboBox);
  wordJPanel.add(strokeJLabel);
  wordJPanel.add(strokeField);
  
  northJPanel=new JPanel();
  northJPanel.setLayout(new GridLayout(2,1));
  northJPanel.add(toolPanel);
  northJPanel.add(wordJPanel);
  
  Container container = getContentPane();
  container.add(northJPanel, BorderLayout.NORTH);
  container.add(drawPanel, BorderLayout.CENTER);
  container.add(statusLabel, BorderLayout.SOUTH);

  addMouseListener(new MouseHandler());// 注册鼠标和键盘事件
  addMouseMotionListener(new MouseMotionHandler());

  setSize(400, 400);
  setVisible(true);
 }

 public void paint(Graphics g) {
  super.paint(g);//关键步骤,如没有,则会产生一堆线条
  
  if (word) {
   g.setFont(new Font(font,Font.PLAIN,size));//设置字体
   g.drawString(string, topX, topY);
   word=false;
   return;
  }
  
  width = Math.abs(topX - x);
  height = Math.abs(topY - y);

  if (shape != LINE) {// 确定起点
   topX = Math.min(topX, x);
   topY = Math.min(topY, y);
  }

  if (shape != LINE && fill) {
   switch (shape) {
   case OVAL:
    g.setColor(color);
    g.fillOval(topX, topY, width, height);
    break;
   case RECT:
    g.setColor(color);
    g.fillRect(topX, topY, width, height);
    break;
   default:
    break;
   }
  } else {
   switch (shape) {
   case LINE:
    g.setColor(color);
    g.drawLine(topX, topY, x, y);
    break;
   case OVAL:
    g.setColor(color);
    g.drawOval(topX, topY, width, height);
    break;
   case RECT:
    g.setColor(color);
    g.drawRect(topX, topY, width, height);
    break;
   default:
    break;
   }
  }

  if (clear) {
   g.setColor(Color.white);
   g.fillRect(0, 0, getSize().width, getSize().height);
  }
 }

 private class MouseHandler extends MouseAdapter {// 侦听鼠标按下和松开
  public void mousePressed(MouseEvent event) {
   topX = event.getX();
   topY = event.getY();
  }

  public void mouseReleased(MouseEvent event) {
   x = event.getX();
   y = event.getY();

   repaint();// 刷新
  }
 }

 private class MouseMotionHandler extends MouseMotionAdapter {// 侦听鼠标移动
  public void mouseMoved(MouseEvent event) {
   statusLabel.setText("(" + event.getX() + "," + event.getY() + ")"
     + fill);
  }
  
  public void mouseDragged(MouseEvent event) {//产生橡皮筋效果
   x = event.getX();
   y = event.getY();

   repaint();// 刷新
  }
 }
 
 public void chooseColor() {
  color = JColorChooser.showDialog(this, "Choose a color", color);
  // R=color.getRed();//得到选中的颜色
  // G=color.getGreen();
  // B=color.getBlue();
 }

 public void clear() {
  color = color.black;
  fill = false;
  clear = true;

  repaint();
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  DrawPad application = new DrawPad();
  application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

}

你可能感兴趣的:(简易画图程序(实现橡皮筋功能))