2016-05-22 115 views
0

我需要帮助更改网格中矩形的颜色。到目前为止,我有矩形和网格(它们是划分矩形的线条),我想在单击矩形时更改单个矩形的颜色。更改网格中矩形的颜色

我在颜色应该改变的循环中添加了一行“System.out.println(”Something“)”,并且它总是返回“Something”。这就是我困惑的原因。感谢您的帮助!

类网格:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.ArrayList; 
import javax.swing.Timer; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Grid extends JPanel{ 

private int a = 50; 
private int b = 50; 
private Lifeform[][] Life; 
private boolean[][]life = new boolean[a][b]; 
private Timer t; 

Grid(){ 
//creates grid of rectangles 
    Life = new Lifeform[a][b]; 

    int ypos = 0; 
    for(int i = 0; i < Life.length; i++){ 
     int xpos = 0; 
     for(int j = 0; j < Life[0].length; j++){ 

      Rectangle r = new Lifeform(); 
      r.setBounds(xpos, ypos, 50, 50); 
      Life[i][j] = (Lifeform) r; 
      xpos += 50; 
     } 
     ypos += 50; 
    } 
    t = new Timer(64, new Movement()); 
    this.addMouseListener(new mouse()); 
} 

public void paintComponent(Graphics g){ 

    for(Lifeform[] n : Life){ 
//makes rectangles white 
     g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight()); 
     g.setColor(Color.white); 
    } 
    for (int i = 0; i <= 25; i++){ 
     g.drawLine(0, 50*i, 1500, 50*i); 
     g.setColor(Color.black); 
    } 
    for (int i = 0; i <= 25; i++){ 
     g.drawLine(50*i, 0, 50*i, 750); 
     g.setColor(Color.black); 
    } 
} 

private JFrame createGrid(){ 

    JFrame frame = new JFrame("Alveolate"); 
    frame.add(this); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(700,700); 
    frame.setVisible(true);  
    return frame; 
} 

public class mouse implements MouseListener{ 
//colors rectangles (it doesn't work) 
    public void mouseClicked(MouseEvent e) { 
     Point p = new Point(e.getX(),e.getY()); 
     for(int i = 0; i < Life.length; i++){ 
      for(int j = 0; j < Life[i].length; j++){ 
       Lifeform spot = Life[i][j]; 

       if (spot.contains(p)){ 
        spot.setColor(Color.red); 
        System.out.println("Something"); 

       } 
      } 

     } 

    } 

    public void mousePressed(MouseEvent e) {} 
    public void mouseReleased(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {}  
    public void mouseExited(MouseEvent e) {} 

} 

public class Movement implements ActionListener{ 
    public void actionPerformed (ActionEvent e){ 

     for (int i = 0; i < Life.length; i++){ 
      for (int j = 0; j < Life[i].length; j++){ 
       if(Life[i][j].getColor().equals(Color.black)){ 
        life[i][j] = true; 
       } 
       else{ 
        life[i][j] = false; 
       } 

      }  

     } 

     repaint(); 

    } 

} 

public void startTimer(){ 
    t.start(); 
} 

public void stopTimer(){ 
    t.stop(); 
} 

public static void main(String[] args) { 

    Grid ABC = new Grid(); 
    ABC.createGrid(); 
    ABC.startTimer(); 
} 
} 

类生命形式:

进口java.awt.Color中; import java.awt.Rectangle;

public class Lifeform extends Rectangle { 
    private Color c; 
    public Lifeform() { 
     c = Color.WHITE; 
    } 
    public Color getColor() { 
     return c; 
    } 

    public boolean setColor(Color c) { 
     boolean rtn = false; 
     if(c != null) { 
      this.c = c; 
      rtn = true; 
     } 

     return rtn; 
    } 

    } 

回答

0

尝试

for(Lifeform[] n : Life){ 
    for(Lifeform lf : n){ 
     g.setColor(lf.getColor()); 
     g.fillRect((int)lf.getX(), (int)lf.getY(), (int)lf.getWidth(), (int)lf.getHeight()); 
    } 
} 

在你的paintComponent方法

+0

谢谢,这工作得很好。一旦它是蓝色的,你会不会知道如何将矩形的颜色改回白色?再次感谢! – macc88392

0

试试这个:

for(int i = 0; i < 50; i++){ 
    for(int j = 0; j < 50; j++){ 
    .... 

    } 
} 
0

没看过你的代码,但它似乎是你绝对设置的颜色你的生命形式变红。这意味着你的渲染代码永远不会使用这个事实来显示Lifeform。这似乎是唯一一次绘制矩形的地方在paintComponent中。每次你想重画都需要调用这个画图。您可以在您的JFrame或JPanel上使用重绘来实现此目的。此外,您所拥有的渲染代码似乎只能显示白色矩形

g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight()); 
g.setColor(Color.white); 

这是通过您的Lifeform [] []进行循环。相反,你应该有一个double for循环来获得每个Lifeform,并使用x和y以及颜色来绘制。例如:

g.fillRect(Life[i][j].getX(), Life[i][j].getY(), ..., ..., Life[i][j].getColor()) 

此外,生活应该命名为小写'l'的生活。看到没有约定的名字会让人困惑。