1.项目介绍
画图板项目是我初学JAVA接触到的第一个项目,也是很重要的一步,让我对JAVA和面向对象的编程思想有了更深的认识,算是JAVA的入门。其中涉及到的参数的传递,GUI的设计以及类的继承等知识,对于很多初学者来说可能有些难度,现在我将这个小项目的编程思路整理出来供初学者参考,老鸟勿喷,直接忽略就可以了。这个项目实现的功能很简单,能够选取图形的形状和画笔的颜色,在绘图区域进行画图,阅读者可以自行添加更多更复杂的功能,比如更加复杂的形状,铅笔图形,保存图片等等。
2.项目设计
这个项目一共有三个类,一个主类,一个鼠标监听类,一个绘图动作监听类。主类的功能是绘制界面,包括按钮区和绘图区,然后给各区域加上监听器。鼠标监听类是用来监听鼠标按下的动作,鼠标在按钮去点击了什么,将它传递给绘图监听类,绘图监听类拿到各种颜色和形状的值之后,再监听到动作,也就是鼠标的点击释放,获取点击释放的坐标,在配合形状,颜色,,绘制相应颜色的图形。
(1)主类
package com_3; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * 2015.9.13 * @author Hanzhi Zhang */ public class jframe extends JFrame{ private ButListener b; private ButListener c; public static void main(String[] args) { jframe jf = new jframe();//新建界面对象 jf.initUI();//初始化 } /** * 初始化界面,绘制出按钮区,给按钮和绘图区域加上监听器 */ public void initUI(){ this.setTitle("画图板");//名字 this.setSize(600,600);//尺寸 this.setDefaultCloseOperation(3);//关闭时自动退出 this.setLocationRelativeTo(null);//相对位置居中 addWestPanel();//添加形状按钮区 addColorPanel();//添加颜色按钮区 this.setVisible(true);//窗体可见 Graphics g = this.getGraphics();//获取当前对象的画笔 DrawListener l = new DrawListener(g,b,c);//根据获取到的形状,颜色,画笔构建动作监听器对象 this.addMouseListener(l);//添加 } /** * 按钮区之形状选择区 */ public void addWestPanel(){ JPanel westPanel = new JPanel(); westPanel.setPreferredSize(new Dimension(80, 0)); westPanel.setBackground(Color.lightGray); String[] str = {"直线","矩形","椭圆","铅笔"}; b = new ButListener(); for(int i=0;i<str.length;i++){ JButton jb = new JButton(str[i]); jb.addActionListener(b);//给按钮对象添加动作监听器方法 westPanel.add(jb); } this.add(westPanel,BorderLayout.WEST); } /** * 按钮区之颜色选择区 * */ public void addColorPanel(){ JPanel colorPanel = new JPanel(); colorPanel.setPreferredSize(new Dimension(0, 80)); colorPanel.setBackground(Color.GRAY); Color[] color = {Color.BLACK,Color.BLUE,Color.RED,Color.GREEN,Color.CYAN,Color.YELLOW,Color.MAGENTA}; c=new ButListener(); for(int i=0;i<color.length;i++){ JButton colorBut = new JButton(); colorBut.setPreferredSize(new Dimension(30,30)); colorBut.setBackground(color[i]); colorPanel.add(colorBut); colorBut.addActionListener(c); } this.add(colorPanel,BorderLayout.SOUTH); } }
(2)鼠标监听类
package com_3; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; public class ButListener implements ActionListener{ private String s; private Color c; public String getS(){ return s;//返回获得到的按钮上的文字 } public Color getC(){ return c;//获得按钮上的颜色值 } public void actionPerformed(ActionEvent e) { s= e.getActionCommand(); JButton j =(JButton)e.getSource(); c=j.getBackground(); } }
(3)动作监听类
package com_3; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class DrawListener implements MouseListener{ private int x1,y1,x2,y2;//定义按下,释放时的点的坐标 private String str;//用来接收按钮按下时获得的字符串 private Color color;//用来接收按钮按下时获得的颜色值 //用来接收按钮事件类的对象 private Graphics g;//画笔对象 private ButListener b;//对应于形状按钮区 private ButListener c;//对应于颜色按钮区 /* * 构造方法,将jframe类的参数传递过来,对应于jframe类的 * DrawListener l = new DrawListener(g,b,c); */ public DrawListener(Graphics g,ButListener b,ButListener c){ this.g = g; this.b = b; this.c= c; } //鼠标按下 public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); str = b.getS(); color=c.getC(); g.setColor(color); } //鼠标释放 public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); if(str.equals("直线")){ g.drawLine(x1, y1, x2, y2); }else if(str.equals("矩形")){ g.drawRect(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1)); }else if(str.equals("椭圆")){ g.drawOval(Math.min(x1,x2),Math.min(y1,y2), Math.abs(x2-x1),Math.abs(y2-y1)); }else if(str.equals("铅笔")){ } } //鼠标进入 public void mouseEntered(MouseEvent e) { } //鼠标退出 public void mouseExited(MouseEvent e) { } //鼠标点击 public void mouseClicked(MouseEvent e) { } }