gpt4 book ai didi

java - 使用 bufferedimage java swing 绘制多个形状

转载 作者:行者123 更新时间:2023-12-02 11:07:48 25 4
gpt4 key购买 nike

我正在尝试使用 bufferdimage 在 jpanel 中绘制一些形状(直线、圆形、矩形)。所以我尝试了亲爱的代码。它可以缓冲形状,但问题是通过拖动鼠标它会像每个帧一样绘制形状。

/image/s7usN.jpg

这是代码`

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) {

}
}

}`

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

最佳答案

所以,主要问题是 BufferedImage 的使用,基本上,一旦你在上面画了一些东西,你就必须把 BufferedImage 想象成一个现实世界的 Canvas ,它将保留(直到您在其上绘画或清除它)。

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

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

例如:

关于java - 使用 bufferedimage java swing 绘制多个形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com