2015-04-23 58 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); 
      } 
     } 
    }