<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Picses' sky

    Picses' sky
    posts - 43, comments - 29, trackbacks - 0, articles - 24

    在Swing中繪制二維圖[zz]

    Posted on 2007-07-23 09:30 Matthew Chen 閱讀(569) 評論(5)  編輯  收藏 所屬分類: Swing and AWT
    作者: sitinspring  
    主頁: http://m.tkk7.com/sitinspring/

    在Swing中繪制二維圖,并有拖曳,縮放,鏈接,輸出功能,主要有幾大技術要點
    1.繪畫時的閃爍問題,解決方法是先將所有圖元畫到一張后臺圖上,在將后臺圖一次性畫到面板上,請見public void paint(Graphics g)的處理.
    2.鼠標響應:解決方法是添加面板的鼠標點擊,鼠標拖曳處理,以鼠標的位置來確定圖元的處理,請見函數public void mousePressed(MouseEvent e),public void mouseDragged(MouseEvent e)和public void mouseClicked(MouseEvent e).
    3.單個圖元處理:每個圖元繼承Actor2D類,它需要記住當前圖元的起始位置和縮放比例.
    4.多個圖元處理:當大圖元移動時,直線/折線圖元需要根據大圖元確定自己的位置,這時需要訪問圖元列表,以便知道那條直線在自身上.
    5.輸出圖片:這個相對簡單,看函數public boolean saveImage(String imagePath)的處理就可以了.
    先寫道這里,細節以后再整理,大家有興趣先看看代碼吧.

    public class PaintBoard extends JPanel implements MouseListener,
        MouseMotionListener, KeyListener 
    {

      
    // 背景圖
      private Image bgImage;
      
    private Graphics bg;

      
    // 畫板上的二維圖元列表
      private ArrayList drawList=new ArrayList();

      
    // 畫板幾何尺寸
      private int myWidth;
      
    private int myHeight;
      
      
    // 繪畫圖元時的偏移尺寸
      private int xOffset, yOffset;

     
    // 構造函數 
     public PaintBoard(MakeSqlToolbar toolbar) {
        
    super();
        
    this.toolbar = toolbar;
        
    this.addMouseListener(this);
        
    this.addMouseMotionListener(this);
        
    this.addKeyListener(this);
      }


     
    // 調整畫面大小時的處理
      private void resizePaintBoard() {
        
    if (myWidth != this.getSize().width
            
    || myHeight != this.getSize().height) {
          bgImage 
    = null;
          myWidth 
    = this.getSize().width;
          myHeight 
    = this.getSize().height;
        }

      }


     
    // 重新調整背景 
     private void reArrangeBg() {
        
    if (bgImage == null{
          bgImage 
    = this.createImage(myWidth, myHeight);
          bg 
    = bgImage.getGraphics();
        }

      }


      
    // 繪圖的關鍵函數
      public void paint(Graphics g) {
        resizePaintBoard();
        reArrangeBg();

        
    // 設置背景
        bg.setColor(Color.white);
        bg.fillRect(
    00, myWidth, myHeight);

       
    // 在背景圖繪畫圖元 
       if (drawList != null{
          
    for (Iterator it = drawList.iterator(); it.hasNext();) {
            Actable actor 
    = (Actable) it.next();
            actor.paint(bg);
          }

        }


        
    // 將背景圖畫在面板上
        g.drawImage(bgImage, 00this);
      }


      
    private boolean mousePressActorTest(Actor2D actor, int x, int y) {
        
    if (actor.isInRect(x, y)) {
          actor.setStatus(Actor2D.Status_Active);
          xOffset 
    = x - actor.getLeft();
          yOffset 
    = y - actor.getTop();

          
    if(!(actor instanceof ActorTable)){
            
    return true;
          }

          ActorTable actorTable
    =(ActorTable)actor;
          
          
    for (Iterator it = drawList.iterator(); it.hasNext();) {
            Actor2D actorTmp 
    = (Actor2D) it.next();

            
    if (actorTmp instanceof ActorLine) {
              ActorLine actorLine 
    = (ActorLine) actorTmp;
              ActorPoint currPoint;
              
              currPoint
    =actorLine.getStartPt();
              currPoint.setInner(actorTable.isInColumns(currPoint.getLeft(),currPoint.getTop()));
              
              currPoint
    =actorLine.getEndPt();
              currPoint.setInner(actorTable.isInColumns(currPoint.getLeft(),currPoint.getTop()));
            }

          }


          
    return true;
        }
     
        
        
    return false;   
      }


      
    public void mousePressed(MouseEvent e) {
        
    for (Iterator it = drawList.iterator(); it.hasNext();) {
          Actor2D actor 
    = (Actor2D) it.next();

          
    if (actor instanceof ActorLine) {
            ActorLine actorLine 
    = (ActorLine) actor;
            actorLine.setStatus(Actor2D.Status_Sleep);
          }
     else {
            actor.setStatus(Actor2D.Status_Sleep);
          }

        }


        
    for (Iterator it = drawList.iterator(); it.hasNext();) {
          Actor2D actor 
    = (Actor2D) it.next();

          
    if (actor instanceof ActorLine) {
            ActorLine actorLine 
    = (ActorLine) actor;
            
    if (mousePressActorTest(actorLine.getStartPt(), e.getX(), e
                .getY()))
              
    break;
            
    if (mousePressActorTest(actorLine.getEndPt(), e.getX(), e
                .getY()))
              
    break;
          }
     else {
            
    if (mousePressActorTest(actor, e.getX(), e.getY()))
              
    break;
          }

        }


        repaint();
      }


      
    private boolean mouseClickActorTest(Actor2D actor, int x, int y) {
        
    if (actor.isInRect(x, y)) {
          actor.setStatus(Actor2D.Status_Active);
          
    return true;
        }
     else {
          
    return false;
        }

      }


      
    public void mouseClicked(MouseEvent e) {
        
    this.requestFocusInWindow();

        
    for (Iterator it = drawList.iterator(); it.hasNext();) {
          Actor2D actor 
    = (Actor2D) it.next();

          
    if (actor instanceof ActorLine) {
            ActorLine actorLine 
    = (ActorLine) actor;
            actorLine.setStatus(Actor2D.Status_Sleep);
          }
     else {
            actor.setStatus(Actor2D.Status_Sleep);
          }

        }


        
    for (Iterator it = drawList.iterator(); it.hasNext();) {
          Actor2D actor 
    = (Actor2D) it.next();

          
    if (actor instanceof ActorLine) {
            ActorLine actorLine 
    = (ActorLine) actor;
            
    if (mouseClickActorTest(actorLine.getStartPt(), e.getX(), e
                .getY()))
              
    break;
            
    if (mouseClickActorTest(actorLine.getEndPt(), e.getX(), e
                .getY()))
              
    break;
          }
     else {
            
    if (mouseClickActorTest(actor, e.getX(), e.getY()))
              
    break;
          }

        }


        repaint();
      }


      
    private void mouseDragActorTest(Actor2D actor, int x, int y) {
        
    if (!actor.isActive()) return;
        
        Actor2D actorTest
    =new Actor2D(actor.getLeft(),actor.getTop(),actor.getWidth(),actor.getHeight());
        actorTest.setLeft(x 
    - xOffset);
        actorTest.setTop(y 
    - yOffset);      
        makeActorInBound(actorTest);
        
        
    int xChanged=actor.getLeft()-actorTest.getLeft();
        
    int yChanged=actor.getTop()-actorTest.getTop();
        
        
    if(actor instanceof ActorTable){
          ActorTable actorTable 
    = (ActorTable) actor;
          
          
    for (Iterator it = drawList.iterator(); it.hasNext();) {
            Actor2D actorTmp 
    = (Actor2D) it.next();
            
            
    if(actorTmp instanceof ActorLine){
              ActorLine actorLine
    =(ActorLine)actorTmp;
              ActorPoint currPoint;
              
              currPoint
    =actorLine.getStartPt();
              
    if(actorTable.isInColumns(currPoint.getLeft(),currPoint.getTop()) && currPoint.isInner()){
                currPoint.setLeft(currPoint.getLeft()
    -xChanged);
                currPoint.setTop(currPoint.getTop()
    -yChanged);
              }

              
              currPoint
    =actorLine.getEndPt();
              
    if(actorTable.isInColumns(currPoint.getLeft(),currPoint.getTop()) && currPoint.isInner()){
                currPoint.setLeft(currPoint.getLeft()
    -xChanged);
                currPoint.setTop(currPoint.getTop()
    -yChanged);
              }

            }

          }

        }
       
        
        actor.setLeft(actor.getLeft()
    -xChanged);
        actor.setTop(actor.getTop()
    -yChanged);    
      }


      
    public void mouseDragged(MouseEvent e) {
        
    for (Iterator it = drawList.iterator(); it.hasNext();) {
          Actor2D actor 
    = (Actor2D) it.next();

          
    if (actor instanceof ActorLine) {
            ActorLine actorLine 
    = (ActorLine) actor;
            mouseDragActorTest(actorLine.getStartPt(), e.getX(), e.getY());
            mouseDragActorTest(actorLine.getEndPt(), e.getX(), e.getY());
          }
     else {        
            mouseDragActorTest(actor, e.getX(), e.getY());
          }

        }


        repaint();
      }


      
    private void keyPressedActorTest(Actor2D actor, int x, int y) {
        
    if (actor.isActive()) {
          actor.setLeft(actor.getLeft() 
    + x);
          actor.setTop(actor.getTop() 
    + y);
          makeActorInBound(actor);
        }

      }


      
    public void keyPressed(KeyEvent e) {
        
    int keyCode = e.getKeyCode();

        
    int xMicroOffset = 1, yMicroOffset = 1;

        
    if (keyCode == KeyEvent.VK_RIGHT) {
          yMicroOffset 
    = 0;
        }
     else if (keyCode == KeyEvent.VK_LEFT) {
          xMicroOffset 
    = -xMicroOffset;
          yMicroOffset 
    = 0;
        }
     else if (keyCode == KeyEvent.VK_UP) {
          yMicroOffset 
    = -yMicroOffset;
          xMicroOffset 
    = 0;
        }
     else if (keyCode == KeyEvent.VK_DOWN) {
          xMicroOffset 
    = 0;
        }


        
    for (Iterator it = drawList.iterator(); it.hasNext();) {
          Actor2D actor 
    = (Actor2D) it.next();

          
    if (actor instanceof ActorLine) {
            ActorLine actorLine 
    = (ActorLine) actor;
            keyPressedActorTest(actorLine.getStartPt(), xMicroOffset,
                yMicroOffset);
            keyPressedActorTest(actorLine.getEndPt(), xMicroOffset,
                yMicroOffset);
          }
     else {
            keyPressedActorTest(actor, xMicroOffset, yMicroOffset);
          }

        }


        
    if (keyCode == KeyEvent.VK_DELETE) {
          
    for (int i = 0; i < drawList.size(); i++{
            Actor2D actor 
    = (Actor2D) drawList.get(i);

            
    if (actor instanceof ActorLine) {
              ActorLine actorLine 
    = (ActorLine) actor;

              
    if (actorLine.getStartPt().isActive()) {
                
    if (ComDlgUtils
                    .popupConfirmCancelDialog(
    "Do you wanna remove the Line:"
                        
    + actor.getName() + "?"== true{
                  drawList.remove(i);
                }

              }


              
    if (actorLine.getEndPt().isActive()) {
                
    if (ComDlgUtils
                    .popupConfirmCancelDialog(
    "Do you wanna remove the Line:"
                        
    + actor.getName() + "?"== true{
                  drawList.remove(i);
                }

              }

            }
     else {
              
    if (actor.isActive()) {
                
    if (ComDlgUtils
                    .popupConfirmCancelDialog(
    "Do you wanna remove the table:"
                        
    + actor.getName() + "?"== true{
                  drawList.remove(i);
                }

              }

            }

          }

        }


        repaint();
      }


      
    private void makeActorInBound(Actor2D Actor) {
        
    if (Actor.getLeft() < 0{
          Actor.setLeft(
    0);
        }


        
    if (Actor.getTop() < 0{
          Actor.setTop(
    0);
        }


        
    if (Actor.getRight() > myWidth) {
          Actor.setLeft(myWidth 
    - Actor.getWidth());
        }


        
    if (Actor.getBottom() > myHeight) {
          Actor.setTop(myHeight 
    - Actor.getHeight());
        }

      }


      
    public void mouseMoved(MouseEvent e) {
        toolbar.setMousePos(e.getX(), e.getY());
      }


      
    public boolean saveImage(String imagePath) {
        
    try {
          FileOutputStream out 
    = new FileOutputStream(imagePath);
          JPEGImageEncoder encoder 
    = JPEGCodec.createJPEGEncoder(out);
          BufferedImage tag 
    = new BufferedImage(myWidth, myHeight,
              BufferedImage.TYPE_INT_RGB);
          tag.getGraphics().drawImage(bgImage, 
    00, myWidth, myHeight, null);
          encoder.encode(tag);
          out.close();
          
    return true;
        }
     catch (Exception e) {
          ComDlgUtils.popupErrorDialog(e.getMessage());
          
    return false;
        }

      }

      
      
    public ArrayList getDrawList() {
        
    return drawList;
      }


      
    public void setDrawList(ArrayList drawList) {
        
    this.drawList = drawList;
      }


      
    public void keyTyped(KeyEvent e) {
      }


      
    public void keyReleased(KeyEvent e) {

      }


      
    public void mouseEntered(MouseEvent e) {
      }


      
    public void mouseExited(MouseEvent e) {
      }


      
    public void mouseReleased(MouseEvent e) {

      }

    }

    Feedback

    # re: 在Swing中繪制二維圖[zz]  回復  更多評論   

    2007-07-23 12:46 by sitinspring
    我的東西發表在http://m.tkk7.com/junglesong上又給轉到這了.

    # re: 在Swing中繪制二維圖[zz]  回復  更多評論   

    2007-07-24 08:56 by Matthew Chen
    sorry,平時很少上,剛看到你的評論,已經加上出處了。

    # re: 在Swing中繪制二維圖[zz]  回復  更多評論   

    2007-07-25 08:44 by sitinspring
    感謝樓主轉載.

    # re: 在Swing中繪制二維圖[zz]  回復  更多評論   

    2007-11-16 01:43 by oeoele
    不好意思,有完整可以執行的代碼嗎?謝謝

    # re: 在Swing中繪制二維圖[zz]  回復  更多評論   

    2012-03-23 23:23 by 李俊
    而且這個耗內存,無論內存多大都是不能容忍的。

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: a级片免费观看视频| 国产亚洲日韩在线三区| 四虎国产精品永久免费网址| 亚洲日韩看片无码电影| 久久精品亚洲一区二区三区浴池 | 国产亚洲精品美女久久久| 国产中文字幕免费| 午夜男人一级毛片免费 | 亚洲精品中文字幕无乱码麻豆| 亚洲精品无码专区在线在线播放| 国产片免费在线观看| 成人性生交大片免费看午夜a| 99久久99久久免费精品小说| 91免费在线视频| 又大又硬又粗又黄的视频免费看| 亚洲GV天堂GV无码男同| 国产精品高清视亚洲一区二区 | 69式互添免费视频| 无码专区AAAAAA免费视频| 97人妻精品全国免费视频 | 国产精品jizz在线观看免费| 一二三四免费观看在线视频中文版 | 少妇人妻偷人精品免费视频| a级毛片免费全部播放无码| 一级特黄aaa大片免费看| 十八禁的黄污污免费网站| 无忧传媒视频免费观看入口| 最新亚洲人成无码网站| 国产精品亚洲综合| 免费观看亚洲人成网站| 香港经典a毛片免费观看看| 婷婷亚洲综合一区二区| 国产精品亚洲一区二区三区在线观看 | 国产黄在线播放免费观看| 一区二区三区免费高清视频| 九九视频高清视频免费观看| 美女网站在线观看视频免费的| av成人免费电影| 中文字幕无码日韩专区免费| 一区二区三区观看免费中文视频在线播放 | 又黄又爽一线毛片免费观看|