首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用bufferimage java swing绘制多个形状

使用bufferimage java swing绘制多个形状
EN

Stack Overflow用户
提问于 2018-06-13 04:03:19
回答 1查看 130关注 0票数 0

我正在尝试使用bufferdimage在jpanel中绘制一些形状(直线,圆形,矩形)。所以我尝试了一下belove code.it在缓冲形状上的效果,但问题是通过拖动鼠标,它会像绘制每一帧一样绘制形状。

这是代码`

public class PanelClass extends JPanel {
BufferedImage img;
int x1,y1,x2,y2,StarterX,StarterY, h,w;
static int flag;
Graphics2D g2d ;

public PanelClass() {   

    MouseHandler handler = new MouseHandler();
    this.addMouseListener(handler);
    this.addMouseMotionListener(handler);

我在这里做了一个bufferdimage对象

    img = new BufferedImage(600, 600, BufferedImage.TYPE_INT_RGB);
    g2d = (Graphics2D) img.getGraphics();
}

这些部分只是因为获得了鼠标事件起始点的坐标。

public void starter(int oldX,int oldY){
    x1 = oldX;
    y1 = oldY;


}


public void finisher(int currentX,int currentY){
    x2 = currentX;
    y2 = currentY;
    if(x1 > x2){
        StarterX = x2;

    }
    else if(x2 > x1){
        StarterX = x1;

    }

    if(y1 > y2){
        StarterY = y2;

    }
    else if(y2 > y1){
        StarterY = y1;
    }
}    

   public int Diameter(int oldX,int oldY,int currentX,int currentY){


    return  (int) Math.sqrt (  (Math.pow(currentX - oldX, 2)) + (Math.pow(currentY - oldY, 2) ) ) ; 
}

此方法获取要绘制的坐标和顺序(这只是为了使代码更清晰,我在paintComponent()上使用了此方法)。

public void painter(){


    if(flag ==1){

      g2d.setColor(Color.ORANGE);
      g2d.setStroke(new BasicStroke(3.0f));
      g2d.drawOval(StarterX ,StarterY,Diameter(x1, y1, x2, y2),Diameter(x1, y1, x2, y2));
      g2d.setBackground(Color.YELLOW);

    }
    else if(flag == 2){
        //fill oval;
        g2d.setColor(Color.ORANGE);
        g2d.setBackground(Color.YELLOW);    
        g2d.fillOval(StarterX ,StarterY,Diameter(x1, y1, x2, y2),Diameter(x1, y1, x2, y2) );
    }
    else if (flag == 3){


         g2d.setColor(Color.ORANGE);
         g2d.setStroke(new BasicStroke(3.0f));
         g2d.drawRect(StarterX, StarterY,Math.abs(x2-x1) ,Math.abs(y2-y1));
         g2d.setBackground(Color.YELLOW);

    }
    else if (flag == 4){


         g2d.setColor(Color.ORANGE);
         g2d.fillRect(StarterX, StarterY,Math.abs(x2-x1) ,Math.abs(y2-y1));
         g2d.setBackground(Color.YELLOW);

    }
    else if (flag == 5){


         g2d.setColor(Color.ORANGE);
         g2d.setStroke(new BasicStroke(5.0f)); 
         g2d.drawLine(x1, y1,x2,y2);
         g2d.setBackground(Color.YELLOW);


    }


}


public void flagSetter(int flag){

    this.flag = flag;
}



at this method i used g.drawImage()

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g); 
    painter();
    g.drawImage(img, 0,0, null);

}











class MouseHandler implements MouseListener,MouseMotionListener{







    @Override
    public void mousePressed(MouseEvent e) {
         starter(e.getX(),e.getY());


    }

    @Override
    public void mouseReleased(MouseEvent e) {

        finisher(e.getX(),e.getY());
        g2d.drawImage(img,0,0 ,null);
        repaint();


        if(flag == 1){




        }
    }

    @Override
    public void mouseEntered(MouseEvent e) {

    } 

    @Override
    public void mouseExited(MouseEvent e) {


    }

    @Override
    public void mouseDragged(MouseEvent e) {

        finisher(e.getX(),e.getY() );
       // System.out.printf("%d   %d      ",currentX,currentY);
        repaint();


    }

    @Override
    public void mouseMoved(MouseEvent e) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }
}

}`

实际上,我不知道它为什么会这样

EN

回答 1

Stack Overflow用户

发布于 2018-06-13 04:31:34

所以,主要的问题是BufferedImage的使用,基本上,你必须把BufferedImage想象成一个真实世界的画布,一旦你在它上面画了什么,它就会一直存在(直到你在它上面画上画或清除它)。

总而言之,更好的解决方案是遵循custom painting路由,并将您想要绘制的信息存储在某种模型中。

这样,您可以更新到模型,安排绘制过程,并在调用paintComponent时绘制模型的当前状态。

例如:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50825035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档