# Array grafisch darstellen



## McKay (11. Jun 2012)

Hallo Forums-mitglieder,

ich bin neu hier, ich benötige hilfe habe gerade googel glühen lassen und einige sachen ausprobiert bin aber zu keinem vernünftigen ergebnis gekommen.
Ich möchte das Game of Life programmieren, habe es auch soweit, dass alles richtig gezählt wird und habe nun ein 2D-Array mit 1en (lebende Zelle) und 0en (tote Zelle)
das sieht natürlich nicht schick aus.
Nun möcht ich das in bunten quadraten auf ein Panel bringen. kann mir bitte jemand erklären wie ich das am geschicktesten anstelle?

Danke McKay


----------



## XHelp (11. Jun 2012)

Wie hast du es denn schon versucht?


----------



## Network (11. Jun 2012)

Vieleicht sowas?


```
for( int i = 0; i < array.lenght; i++ ) {
     for( int j = 0; j < array[0].length; j++ ) {
          if( array[i][j] == 0 ) g.setColor( Color.white );
          else g.setColor( Color.black );
          g.drawRect( 10*i, 10*j, 10, 10 );
     }
}
```

Gruß
Net


----------



## McKay (11. Jun 2012)

ja so in der Art hatte ich mir das auch schon mal gedacht aber da wusste ich nicht wie ich dieser Klasse dann das Array übergeben.
Das sieht doch dann so aus oder?


```
public void paintComponent( Graphics g ){    
    	  for( int i = 0; i < s.length; i++ ) {
    		     for( int j = 0; j < s[0].length; j++ ) {
    		          if( s[i][j] == 0 ) g.setColor( Color.white );
    		          else g.setColor( Color.black );
    		          g.drawRect( 10*i, 10*j, 10, 10 );
    		     }
    		}
     }
```


----------



## vanny (11. Jun 2012)

Da gibt es mehrere Möglichkeiten.
Einmal wie Network es schon partiell dargelegt hat (einfach selbst zeichnen) oder du benutzt einfach JPanel und ein GridLayout und färbst dann einfach den Background.

Um die Logik kommst natürlich nicht herum.

Gruß
Vanny


----------



## McKay (11. Jun 2012)

Also das über ein JPanel zu machen war auch ein Gedanke und das GridLayout habe ich mir eben angeschaut aber irgenwie nutzen das alle nur als gitte für Buttons. Wie bekomme ich da ein einfaches buntes Feld entsprechend meines Array hin?


----------



## McKay (11. Jun 2012)

ProblemLösung gefunden...


```
for (int i=0; i<l; i++){
        	panel[i] = new JPanel[h+1];
			for (int j=0; j<h; j++){
				panel[i][j] = new JPanel();
				if (s[i][j] == 1){
					panel[i][j].setBackground(Color.green);
				}
				else{
					panel[i][j].setBackground(Color.red);
				}
				// JPanel dem Frame hinzufuegen
				myJFrame.add(panel[i][j]);
			}
		}
```


----------



## vanny (11. Jun 2012)

```
public class GridLayoutMitPaneln extends JPanel{
	
	private int x,y;
	private int[][] werte;
	private JPanel[][] panels;
	
	public GridLayoutMitPaneln(){
		x = 3;
		y = 3;
		
		
		werte = new int[x][y];
			werte[0][0] = 1; werte [0][1] = 0; werte[0][2] = 1;
			werte[1][0] = 0; werte [1][1] = 1; werte[1][2] = 0;
			werte[2][0] = 1; werte [2][1] = 0; werte[2][2] = 1;
		panels = new JPanel[x][y];
		this.setLayout(new GridLayout(x, y));
		
		
		for(int i = 0; i < x; i++){
			for(int j = 0; j < y; j++){
				panels[i][j] = new JPanel();
				this.add(panels[i][j]);
			}
		}
		
		for(int i = 0; i < x; i++){
			for(int j = 0; j < y; j++){
				if(werte[i][j] == 0){
					panels[i][j].setBackground(Color.BLACK);
				}else{
					panels[i][j].setBackground(Color.BLUE);
				}
			}
		}
		
	
	
		
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300, 300);
		frame.setLocationRelativeTo(null);
		
		frame.add(new GridLayoutMitPaneln());
		
		frame.setVisible(true);
	}

}
```

[EDIT]OK bin zwar zu spät, aber trenn das lieber, sodass du nur die Farbe in einer extra Methode änderst und nich immer neue JPanel erzeugst [/EDIT]


----------



## McKay (11. Jun 2012)

stimmt, danke.
aber wie muss ich es ganau trennen? Habe es gerade versucht aber das geht so leider gar nicht. wie wäre es sinnvoll?

Meine Variante:


```
public static JFrame zeichnePanel (int[][] s, int l, int h){
		
        // Erzeugung eines neuen Dialoges
        JFrame myJFrame = new JFrame();
        myJFrame.setTitle("Game of Life");
        
        myJFrame.setLayout(new GridLayout(h+1, l+1));    
        
    	 JPanel[][] panel = new JPanel[l+1][h+1]; 
    	 
        for (int i=0; i<l; i++){
        	panel[i] = new JPanel[h+1];
			for (int j=0; j<h; j++){
				panel[i][j] = new JPanel();
				if (s[i][j] == 1){
					panel[i][j].setBackground(Color.green);
				}
				else{
					panel[i][j].setBackground(Color.red);
				}
				// JPanel dem Frame hinzufuegen
				myJFrame.add(panel[i][j]);
			}
		}
		
        // Fenstergröße dem Inhalt anpassen
        myJFrame.pack();
		
        // Frame anzeigen
        myJFrame.setVisible(true);
        return myJFrame;
	}

public static void aktualisierePanel(int[][] s, int l, int h, JFrame myJFrame){
		 JPanel[][] panel = new JPanel[l+1][h+1]; 
    	 
	        for (int i=0; i<l; i++){
	        	panel[i] = new JPanel[h+1];
				for (int j=0; j<h; j++){
					panel[i][j] = new JPanel();
					if (s[i][j] == 1){
						panel[i][j].setBackground(Color.green);
					}
					else{
						panel[i][j].setBackground(Color.red);
					}
					// JPanel dem Frame hinzufuegen
					myJFrame.add(panel[i][j]);
				}
			}
			
	        // Fenstergröße dem Inhalt anpassen
	        myJFrame.pack();
			
	        // Frame anzeigen
	        myJFrame.setVisible(true);
}
```


----------



## vanny (11. Jun 2012)

Hab mein Beispiel nochmal geändert und die Trennung in Methoden ausgelagert:

```
public class GridLayoutMitPaneln extends JPanel{
	
	private int x,y;
	private int[][] werte;
	private JPanel[][] panels;
	
	public GridLayoutMitPaneln(){
		x = 3;
		y = 3;
		
		
		werte = new int[x][y];
			
		
		panels = new JPanel[x][y];
		this.setLayout(new GridLayout(x, y));
		
		//die Panel müssen nur einmal erzeugt werden ^^
		for(int i = 0; i < x; i++){
			for(int j = 0; j < y; j++){
				panels[i][j] = new JPanel();
				this.add(panels[i][j]);
			}
		}
		
                werteAndern();//LogikTeil
		farbenBerechnen();//FarbZuordnung
			
		
	
	
		
	}
	
	//hier werden abschliessend die BackGrounds gesetzt
	private void farbenBerechnen() {
		for(int i = 0; i < x; i++){
			for(int j = 0; j < y; j++){
				if(werte[i][j] == 0){
					panels[i][j].setBackground(Color.BLACK);
				}else{
					panels[i][j].setBackground(Color.BLUE);
				}
			}
		}
	}

	//hier kommt natürlich deine Logik für deinen 0 und 1 Werte rein
	private void werteAndern() {
		werte[0][0] = 1; werte [0][1] = 0; werte[0][2] = 1;
		werte[1][0] = 0; werte [1][1] = 1; werte[1][2] = 0;
		werte[2][0] = 1; werte [2][1] = 0; werte[2][2] = 1;
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300, 300);
		frame.setLocationRelativeTo(null);
		
		frame.add(new GridLayoutMitPaneln());
		
		frame.setVisible(true);
	}

}
```

Gruß Vanny

[EDIT]du könntest sogar farbenBerechnen(); als letzten Aufruf in werteAendern(); benutzen, dann wird nach jeder Berechnung die Farbe neu zugeteilt.[/EDIT]


----------

