2012-12-28 138 views
1

我正在练习Java swing。我创建了一个矩阵作为Rectangle2D对象的二维数组。我已经设置了MouseListener来绘制被点击的方块。我已经设置了用于检查哪个方块被点击的for循环。当我点击一个正方形时,它被涂成蓝色。事情是,当我点击另一个广场时,第一个变成白色,另一个变成蓝色。我的问题是,如何保持第一次点击广场的颜色?在Java中绘制方形矩阵

这里的Matrica(Matrix)类(这是我的母语的代码,crtanjeMatrice意味着drawMatrixduzinalength

public class Matrica extends JPanel implements MouseListener { 
Rectangle2D[][] matrica = new Rectangle2D[8][8]; 
Color boja = Color.white; 
int a = 0; 
int b = 0; 

    public Matrica() { 
     addMouseListener(this); 
    } 

    public void paint(Graphics g){ 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.clearRect(0, 0, this.getWidth(), this.getHeight()); 
     crtanjeMatrice(g2); 
     g2.setColor(boja); 
     g2.fill(matrica[a][b]); 

    } 




    private void crtanjeMatrice(Graphics2D g2){ 
     g2.setColor(Color.black); 
     int startX = 0; 
     int startY =0; 
     int duzina = 50; 
     for(int i=0; i < matrica.length; i++){ 
      for(int j = 0; j < matrica.length; j++){ 
       matrica[i][j] = new Rectangle2D.Double(startX,startY,duzina,duzina); 
       g2.draw(matrica[i][j]); 
       startX = startX + duzina; 
      } 
      startY = startY + duzina; 
      startX = 0; 
     } 

    } 


    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     int m,n; 
     int x = e.getX(); 
     int y = e.getY(); 
     for(int i = 0; i < matrica.length; i++) 
     for(int j =0; j < matrica.length; j++) 
      if(matrica[i][j].contains(x, y)){ 
       boja = Color.blue; 
       a = i; 
       b = j; 
       repaint(); 
      } 
    } 


    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    } 

} 
+3

你可以发布你的代码的相关部分? – MAK

+0

你可以显示一些代码吗?否则,解决方案是将点击时的颜色存储到临时变量中。 –

回答

0

您正在画一个单一基质细胞在paint方法:

g2.fill(matrica[a][b]); 

但您需要“记住”哪个矩形已被点击。为此,可以使用简单的List o存储已经点击的矩形的索引。基于Point类的课程提供了将行列索引信息存储在列表中的好方法。

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.clearRect(0, 0, this.getWidth(), this.getHeight()); 
    crtanjeMatrice(g2); 
    for (MyRowColumn index : indexList) { // MyRowColumn based on Point 
    g2.setColor(Color.blue); 
    g2.fill(matrica[index.x][index.y]); 
    } 
} 

旁白:,不使用覆盖paint,覆盖paintComponent反而记得打电话super.paintComponent渲染子组件。

+0

谢谢。有用。 – Balthazar