2015-04-23 61 views
-2

我一直在研究Java Paint应用程序的实践;然而,我现在卡在的部分是如何改变我的笔的颜色而不改变我之前绘制的任何东西的颜色?我被建议创建另一个ArrayList并将其合并到我的paintComponent中,但现在我感到困惑和不确定该怎么做。谁能帮我?我没有包括我的测试者类,但它已经创建了按钮,这正是我的代码所做的。Java Paint应用程序

package drawing; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 

public class Drawing extends JPanel { 

private final ArrayList<Point> points = new ArrayList<>(); 
private boolean drawingInProgress; 
private Color shapeColor = Color.BLACK; 

public void setShapeColor(Color color) 
{ 
this.shapeColor = color; 
} 

public Drawing(){ 
setBackground(Color.white); 
drawingInProgress = false; 
addMouseListener(
    new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent ev) 
    { 
     if(!drawingInProgress) 
    { 
     drawingInProgress = true; 
    } else { 
      drawingInProgress = false; 
     }    
    }   

    } 
);  

addMouseMotionListener(
new MouseMotionAdapter(){ 
@Override 
public void mouseMoved(MouseEvent event) 
{ 
    if (drawingInProgress){ 
     points.add(event.getPoint()); 
     repaint(); 
    } else {   
    } 

} 
}  
);  
} 

@Override 
public void paintComponent(Graphics g) 
{ 
super.paintComponent(g); 
//g.setColor(shapeColor); What I had before that was wrong. 
for (Point point: points) 
g.fillOval(point.x, point.y, 8, 8); 
} 

public void red() { 
    shapeColor = Color.RED; 
repaint(); 
} 

public void blue() { 
shapeColor = Color.BLUE; 
repaint(); 

} 

public void green() { 
shapeColor = Color.GREEN; 
repaint(); 
} 

} 

回答

0

一条路可走。将创建一个像MyShape一类由点的名单(您已经有)和颜色。

对于整个绘画,你会有一个这样的MyShape对象的列表。

现在,无论用户何时开始绘制线条(即鼠标向下),您都将使用当前颜色创建一个新的MyShape对象,并收集对象点列表中的所有鼠标移动,直至鼠标移至上方。

repaint中,您将绘制所有MyShape的形状列表,每个形状都有自己的颜色。

1

您可以创建虚拟“形”携带不只是需要把它漆成自己的信息,而且颜色(和任何其他属性)

public interface PaintShape { 
    public Rectangle getBounds(); 
    public Color getColor(); 
    public void paint(Graphics2D g2d); 
} 

然后您可以创建什么都塑造你想要...

public abstract class AbstractPaintShape implements PaintShape { 

    private final Rectangle bounds; 
    private final Color color; 

    public AbstractPaintShape(Rectangle bounds, Color color) { 
     this.bounds = bounds; 
     this.color = color; 
    } 

    @Override 
    public Rectangle getBounds() { 
     return bounds; 
    } 

    @Override 
    public Color getColor() { 
     return color; 
    } 

} 

public class OvalPaintShape extends AbstractPaintShape { 

    private Ellipse2D oval; 

    public OvalPaintShape(Rectangle bounds, Color color) { 
     super(bounds, color); 
     oval = new Ellipse2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight()); 
    } 

    @Override 
    public void paint(Graphics2D g2d) { 
     g2d.setColor(getColor()); 
     g2d.fill(oval); 
    } 

} 

或类似的东西

你应该采取在2D Graphics定睛一看,Working with Geometry更多的IDE as

0

在这种情况下,如果您存储点并重新绘制点列表,则必须将每个Point的颜色与点信息一起保存,然后在绘图时询问每个点是什么颜色。也许创建一个类别ColoredPoint也有Color

for (ColoredPoint cp : points) { 
    g.setColor(cp.getColor()); 
... 
0

您可以重构这个存储形状分开绘制它们。

public class Shape { 

    private final ArrayList<Point> points = new ArrayList<>(); 
    public final Color color; 

    public Shape() { 
     this(Color.BLACK); 
    } 

    public Shape(final Color color) { 
     this.color = color; 
    } 

    public void addPoint(final Point point) { 
     this.points.add(point); 
    } 

    public List<Point> getPoints() { 
     return points; 
    } 
} 

绘图类将不得不

public class Drawing extends JPanel { 
    private final List<Shape> shapes = new ArrayList<>(): 

    // ... 
    // a mouse listener that creates shapes and gives them points 
    // ... 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Shape shape: shapes 
      g.setColor(shape.color); 
      for (Point point: shape.getPoints()) { 
       g.fillOval(point.x, point.y, 8, 8); 
      } 
     } 
    }