2016-05-22 25 views
0

グリッド内の矩形の色を変更するのには助けが必要です。これまでは、四角形とグリッド(四角形を区切って描かれた線)があり、クリックしたときに一つの四角形の色を変更したいと思います。グリッド内の矩形の色を変更する

色が変更されるはずのループ内に "System.out.println(" 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

+0

ありがとう、これはうまくいきました。また、一度青色になると、Rectangleの色を白に戻す方法を知っていますか?再度、感謝します! – macc88392

0

これを試してみてください。

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

    } 
} 
0

あなたのpaintComponentメソッドで

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()); 
    } 
} 

を試すには、すべてのあなたのコードを読んでいないが、あなたは間違いなくの色を設定するように思えますあなたのライフフォームを赤色にします。つまり、レンダリングコードは実際にこのファクトを使用してLifeformを表示することはありません。あなたの四角形を描画する唯一の時間がpaintComponentにあるようです。このペイントは、再描画を行うたびに呼び出される必要があります。これを実現するには、JFrameまたはJPanelでrepaintを使用することができます。また、あなたが持っているレンダリングコードは今まで白い長方形

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

これはあなたの生命体[] []をループであるを表示するためにあるようです。代わりに、おそらく、すべてのライフフォームを取得し、それから描画するためにxとyと色を使用するdouble forループが必要です。次のようなものがあります。

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

また、ライフの名前は小文字の「l」である必要があります。それは、慣習なしで名前を見るのを混乱させる方法です。

関連する問題