项目总结——画板
一.整体思路
利用图形开发界面Java.awt包中相关类,创建窗体,图标,画布等一系列类,仿XP画图板将基本界面实现,并使用鼠标监听,重绘等实现画图的基本功能。
二.图形界面开发
1.创建基本的窗体
创建主类继承JFrame类,设置基本属性
public class MyDraw extends JFrame(){
public static void main(String[] ages){
//创建兑对象
MyDraw md=new MyDraw();
md.showUI();}
//显示窗体的方法
public void showUI(){
this.setTitle("我的画板");//设置标题
this.setSize(800, 600);//设置尺寸
this.setLocationRelativeTo(null);//设置初始位置
this.setDefaultCloseOperation(3);//程序关闭时,退出程序
this.setVisible(true);//设置组件可见
2.给窗体添加组件
根据需要创建按钮等对象并,添加至界面中。
//创建工具面板对象 ToolPanel tp=new ToolPanel(); //创建颜色面板对象 ColorPanel cp=new ColorPanel(); //创建画板对象 DrawPanel dp=new DrawPanel(queue); // 添加至画板中 this.add(tp,BorderLayout.WEST); this.add(cp,BorderLayout.SOUTH); this.add(dp,BorderLayout.CENTER);
3.修饰美化
根据XP画板的样子对组件进行合理的布局,并为工具按钮和标题栏添加图片
ImageIcon image=new ImageIcon("images/"+"icon.png"); Image img = image.getImage(); this.setIconImage(img);
给每个按钮加图片
JButton btn=new JButton(); ImageIcon icon=new ImageIcon("images/"+commands[i]+".jpg"); btn.setPreferredSize(new Dimension(icon.getIconWidth(),icon.getIconHeight())); btn.setIcon(icon);
三.监听器的使用
实时监听画板上的事件源上发生的事件,并进行相应的处理,当按钮被点击就执行相应语句。
首先,为画布添加监听器mouseListener,即自定义一个监听器去继承MouseAdapter,重写需要的方法,得到始末位置的坐标,并写出画图的算法。
public class MyMouseListener extends MouseAdapter { // 定义属性 String command; Graphics2D g; Color color = Color.black; ToolPanel tp; ColorPanel cp; /** 构造函数 */ public MyMouseListener(Graphics2D g, ToolPanel tp, ColorPanel cp) { this.g = g; this.cp = cp; this.tp = tp; } // 重写我们需要的方法 public void mousePressed(MouseEvent e) { command = tp.getCommand(); color = cp.getColor(); 。。。。。} public void mouseDragged(MouseEvent e) { } 。。 。。。 。。。。
再者,为各种工具和颜色按钮添加监听器ActionListener,得到动作命令,根据不同的动作命令执行相应语句。
例如给工具条颜色栏加监听器,通过内部类简化时间处理方式
//匿名内部类的方式创建监听器对象
ActionListener listener= new ActionListener(){
//实现抽象方法
public void actionPerformed(ActionEvent e){
//通过e获取事件源,返回object对象,强制转型为JButton
JButton btn=(JButton)e.getSource();
color =btn.getBackground();
}
};
//循环创建按钮对象
for (int i=0;i<10;i++){
//创建按钮,图像图标,添加图标,添加动作命令
JButton btn=new JButton();
btn.setPreferredSize(new Dimension(20,20));
btn.setBackground(colors[i]);
panel.add(btn);
btn.addActionListener(listener);
按照相同方式给工具条的每个按钮加上ActionListener。
四.重绘的基本原理与使用
重绘的目的在于保存画板上的图形,在界面最小化或拖动时图形不丢失。其主要的原理为利用一个自定义队列保存画板上的图形,并进行图形重绘。
1)自定义队列
补充:数组和队列
数组常用使用格式 数据类型 [] 数组名=new 数据类型(数组长度);或者数据类型[] 数组名称={};
队列 可以改变长度并实现数组的基本方法。
public class MyQueue { // 创建一个数组 private Object[] src = new Object[0]; // 在尾部添加一个对象 public void add(Object o) { // 创建一个新数组 Object[] a = new Object[src.length + 1]; // 将src数组重的对象赋给a数组 for (int i = 0; i < src.length; i++) { a[i] = src[i]; } // 将实参赋最后一位 a[src.length] = o; // 令src数组指向a数组 src = a; } // 获取队列的长度 public int size() { return src.length; } public Object get(int index) { return src[index]; } }
2)自定义队列后,将所画的图形保存到队列中。具体实现为,定义一个shape抽象类,将绘制不同图形的方法通过子类继承shape类实现。在监听器中,每要画图,都实例化一个shape对象,并添加至队列queue中,再调用shape中的绘图方法。
//画直线 if (command.equals("line")) { shape = new ShapeLine(x1,y1,x2,y2,cp.getColor(),1); queue.add(shape); shape.draw(g);
3)重写窗体paint(Graphics g)方法,当窗体改变时,程序重新从内存中获取新的数据并通过paint方法在屏幕上绘制出来,注,在什么地方获取的画布即在哪儿重绘。
public void paint(Graphics g){ super.paint(g);//调用父类中的重绘方法,显示窗体 Graphics2D g2d = (Graphics2D)g; //循环队列中的数据 for(int i=0;i<queue.size();i++){ //获取Shape对象 Shape shape = (Shape)queue.get(i);//强制转型为shape类型的 //调用画图形的方法 shape.draw(g2d); } }
五.相关类的总结
1)图形界面
JFrame JPanel JButton Graphics Graphics2D BaseStroke ImageIcon Image
2)监听器
MouseListener MouseListener ActionLisrener MouseListener
3)重绘
shape (shapeLine shapeOval shapeRect 。。。。) My queue
六.我的小结
画板是我们做的第一个具体的项目,虽然只是很基础的,很多功能还没有实现,但从中我首先意识到的是一个完整的项目或简单的一个应用程序所包含的东西之多,而且是按步骤一点点的增加功能,做任何程序对整体的把握是最重要的,细节填充就看个人的努力和细心。当然,以后更多的是团队协作,1019组,一起加油!