AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > JAVA编程

搭建Java桌面应用程序原型(三)

51自学网 2015-09-02 http://www.wanshiok.com

  在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不保证资料的完整性。
 

上一篇:JDBC基础教程之驱动设置  下一篇:搭建Java桌面应用程序原型(二)