在paint()外部进行绘制
Swing组件的绘制通常都是在paint()内部进行或者在paint()内部调用绘制方法。当用鼠标在屏幕上绘制一个对象,可是,你不想重绘其他组件,因为这将引起应用程序运行效率低下。例如,用户用铅笔进行绘制,每个鼠标事件都让应用绘制一个小线段。在MOUSE_PRESSED和MOUSE_RELEASED之间有上百个MOUSE_DRAGGED事件。
当用户在屏幕仅仅绘制了一些图形时,重绘PaintView组件几百次这样的事情是不能被接受的。注意一下,PaintView处理大多数的绘制操作并且一个repaint需要所有注释包括文本注释进行重绘。正确的解决方案是当每个鼠标事件被处理时在paint()外部利用getGraphics()获得图形上下文。
protected void toolAction(MouseEvent e) { e.consume(); Graphics2D g2 = (Graphics2D) getGraphics(); float zoomFactor = model.getZoomFactor(); g2.scale(zoomFactor, zoomFactor); float x = e.getX() / zoomFactor; float y = e.getY() / zoomFactor; currentTool.action(e.getID(), x, y, g2); g2.dispose(); } |
PaintView组件利用鼠标监听去处理鼠标事件。上面的方法被每一个事件所调用,委托绘制currentTool对象。当鼠标释放的时候,repaint()被调用去请求整个组件的刷新。因此,用户完成图形对象绘制后paint()仅仅被调用一次。这是注册鼠标监听的代码:
protected void registerListeners() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { requestFocus(); currentTool = model.createTool(AbstractTool.DRAW_STYLE); toolAction(e); } }
public void mouseReleased(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { toolAction(e); model.setLastTool(currentTool); currentTool = null; repaint(); } } });
addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) toolAction(e); } });
... } |
PaintView类的完整代码将在以后的文章中讲述。上面代码片段仅仅展示了怎么利用原型去做技术决定。
总结
原型在应用程序开发过程中有着重要的角色,允许你测试你的想法并且尽早的获得用户反馈。我没有把原型看成是当“真正”开发开始时可以被丢弃的代码片段。反而,原型应该是你产品或者着应用的基础。这意味着你应该小心的对它进行编码,尽管你的类或方法在以后要被重写。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |