gpt4 book ai didi

Java Paint 程序绘制形状

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

我的java代码有问题。我想做一个画家程序,但每当我选择一个形状并绘制它时之前绘制的所有形状都变得与此形状相同。这是代码。我知道问题出在 paintComponent 中的 for 语句,但我可以用什么替换它?

class inner extends JPanel implements MouseListener,MouseMotionListener{
private int oldx,oldy,newx,newy;
private Point point1,point2;
private Shape newRec,line1;
Rectangle currRec;
private Vector shape;
private boolean status,status1;
private int count=0;
private Object line;
inner(){
point1=point2=new Point(0,0);
shape = new Vector();
addMouseListener(this);
addMouseMotionListener(this);
}

public void mouseDragged(MouseEvent event) {

point2=event.getPoint();
newx = point2.x;
newy = point2.y;
if(Universal==7){
line = new Object(oldx,oldy,newx,newy);
status = true;
repaint();
}


currRec = new Rectangle(Math.min(point1.x,point2.x),Math.min(point1.y,point2.y),Math.abs(point1.x-point2.x),Math.abs(point1.y-point2.y));
status = true;
repaint();

}

@Override
public void mouseMoved(MouseEvent arg0) {}
public void mouseClicked(MouseEvent arg0) {}
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}


public void mousePressed(MouseEvent event) {

point1=event.getPoint();
oldx=event.getX();
oldy=event.getY();
}

@Override
public void mouseReleased(MouseEvent event) {

point2=event.getPoint();
newx=event.getX();
newy=event.getY();
//count++;


if(Universal==7){
line1 = new Shape(point1.x,point1.y,point2.x,point2.y);
shape.add(line1);
//Graphics g = getGraphics();
//g.setColor(colour);
//g.drawLine(point1.x,point1.y,point2.x,point2.y);

count++;
repaint();
}
else if(Universal==1||Universal==2||Universal==3||Universal==4||Universal==5||Universal==6){
newRec = new Shape(Math.min(point1.x,point2.x),Math.min(point1.y,point2.y),Math.abs(point1.x-point2.x),Math.abs(point1.y-point2.y));
shape.add(newRec);
count++;
repaint();
}
}

///// the problem is in here
public void paintComponent(Graphics g){
super.paintComponent(g);
Shape c;
g.setColor(colour);
for(int i=0;i<shape.size();i++){
c = (Shape) shape.get(i);

if(Universal==1){

g.drawRect(c.x, c.y, c.w, c.h);
if(status){
g.drawRect(currRec.x, currRec.y, currRec.width, currRec.height);
}
}

if(Universal==2){
g.fillRect(c.x, c.y, c.w, c.h);

if(status){
g.fillRect(currRec.x, currRec.y, currRec.width, currRec.height);

}
}

if(Universal==3){
g.drawRoundRect(c.x, c.y, c.w, c.h, c.w/4, c.h/4);

if(status){
g.drawRoundRect(currRec.x, currRec.y, currRec.width, currRec.height,currRec.width/4,currRec.height/4);

}
}

if(Universal==4){
g.fillRoundRect(c.x, c.y, c.w, c.h, c.w/4, c.h/4);

if(status){
g.fillRoundRect(currRec.x, currRec.y, currRec.width, currRec.height,currRec.width/4,currRec.height/4);

}
}

if(Universal==5){

g.drawOval(c.x, c.y, c.w, c.h);

if(status){
g.drawOval(currRec.x, currRec.y, currRec.width, currRec.height);
}
}

if(Universal==6){

g.fillOval(c.x, c.y, c.w, c.h);

if(status){
g.fillOval(currRec.x, currRec.y, currRec.width, currRec.height);
}
}

if(Universal==7){

g.drawLine(c.x, c.y, c.w, c.h);

if(status){
g.drawLine(line1.x, line1.y, line1.w,line1.h);
}
}

if(Universal==8){
shape.clear();
}
}
}

最佳答案

Universal 只会在任何给定时间成为给定值。

油漆不是累积性的,而是具有破坏性的。

也就是说,每次调用 paintComponent 时,所有以前的内容都会被删除/删除干净,并且您需要“重新绘制”内容。

您不应依赖单个标志,而应将 Shape 添加到某种 List 中,并在 paintComponent 时重新绘制它们。叫做。同样,您可以简单地将“类型”(int) 添加到 List 并在每次重绘时处理该列表

看看Painting in AWT in Swing油漆过程的解释

关于Java Paint 程序绘制形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16426823/

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