Java Gitternetz

Sicher ist in der Klasse Field ein Array, aber das Object field, worauf du zugreifst, ist ein Object der Klasse Field und nicht das Array. Du könntest es so machen.

Code:
import javax.swing.*; 
import java.awt.*; 
/** 
 * Write a description of class Field here. 
 *  
 * @author (your name)  
 * @version (a version number or a date) 
 */ 
public class Field extends JPanel 
{ 
    // instance variables - replace the example below with your own 
    private int length, width; 
    private boolean[][] field; 

    /** 
     * Constructor for objects of class Field 
     */ 
    public Field(int length, int width) 
    { 
        // initialise instance variables 
        this.length = length; 
        this.width = width; 
        field = new boolean[length][width]; 
                 
    } 
    
    public void getField(){
     return field;
   }
     
    public int getWidth() 
    { 
        return width; 
    } 
     
    public int getLength() 
    { 
        return length; 
    } 
     
    public int getNumberOfNeighbours(int x,int y) 
    { 
        return 2; 
    } 
}


Code:
field.getField()[i][j] = true;


Hast du dir mal das Beispiel mit der JTable angeschaut?

MFG

Sascha
 
das probier ich sofort mal aus :)


- ja hab ich getan, erscheint mir aber recht kompliziert in der Anwendung ?




habe es mal ausprobiert, liefert mir dann auch einen Fehler zurueck :
array required, but void found.
 
Zuletzt bearbeitet:
ok, den void Fehler habe ich gefunden. Logischerweise kann eine methode mit Rückgabewert nicht mit public void..... anfangen. aber irgendwie öffnet sich nichteinmal ein framefenster.........
 
Das mit der JTable ist eigentlich nicht kompliziert.
Es ist lediglich alles getrennt.

Das Model ist für die Datenhaltung zuständig und der Renderer für die Darstellung.

Das mit dem void war mein Fehler. Hatte es hier schnell hingetippt.

Code:
 for(int i = 0; i<20; i++){ 
            for(int j = 0; j<20;j++){ 
                field[i][j] = true; 
                panel.add(field[i][j]);       
            } 
        }

Das wird auch nicht funktionieren, du kannst kein boolean-Wert dem Panel hinzufügen. Dazu kommt noch, dass du nur eine Field-Instance hast. und wenn du das jedesmal hinzufügst, wirst du es trotzdem nur einmal sehen.

MFG

Sascha
 
ach verdammt..... das macht mir wieder alles zunichte :(...


ich suche eigentlich einfach gesgat nur eine Moeglichkeit aus diesem 2dimensionalen array, Werte in Zellen eines Gitters was ich hinterher in einem frame ausgeben moechte einzulesen...

Das muss doch irgendwie einfach moeglich sein. Ich haenge da jetzt seit 2 Tagen dran und hab schlichtweg gesagt noch nichts stehen.


Also nochmal von vorne:

Ich hab eine Klasse Simulator und eine Klasse field. In der Field Klasse moechte ich gerne das wenn ich ein Objekt der Klasse erstelle, das ich automatisch ein "field" sozusagen ein fieldArray habe, das ich am besten ueber set und get methoden in der Fieldklasse steuern kann. moeglich ?
Von der FIeldklasse brauch ich 2 Instanzen, 1 fuer den ersten Schritt, 1 fuer den 2. Schritt(field1, field2) field 1 soll dann in einer extrenen methode gelesen werden und die neuen werte werden berechnet und in das 2. Feld eingelesen.
Das 2. Feld mit den neuen Werten soll dann in das Gitter eingelesen und ausgegeben werden.


Das ist eigentlich das was ich am Ende gerne hätte. Bin für jede Idee offen... :)
 
Ich sage es nochmal, die JTable kann schon alles das was du machen möchtest.

Ich habe dir trotzdem mal ein Beispiel mit dem JPanel fertig gemacht.

Code:
public class PanelGridExample
    extends JFrame
{

  public PanelGridExample()
  {
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    boolean[][] b = {

    { false, false, false, false, false, false },
    { false, false, false, false, false, false }, 
    { false, false, true, false, false, false },
    { false, false, false, false, false, false }, 
    { false, false, false, true, false, false },
    { false, false, false, false, false, false }, 
    { false, false, false, false, false, false },

    };
    
    Field field = new Field(b);
    
    add(field, BorderLayout.CENTER);
    pack();
  }
  
  public static void main(String[] args)
  {
    new PanelGridExample().setVisible(true);
  }

}

Code:
class Field
    extends JPanel
{
  private Cell[][] cells = null;

  /**
   * Constructor for objects of class Field
   */
  public Field(boolean[][] cells)
  {

    this(createCellArray(cells));
  }

  public Field(Cell[][] cells)
  {
    setLayout(new GridLayout(cells.length, cells[0].length));

    this.cells = cells;

    for (int i = 0; i < cells.length; i++)
    {
      for (int j = 0; j < cells[i].length; j++)
      {
        Cell cell = cells[i][j];
        cell.setPreferredSize(new Dimension(50,50));
        add(cell);
      }
    }

  }

  public Cell getCell(int row, int column)
  {
    return cells[row][column];
  }

  public void setCell(Cell cell, int row, int column)
  {
    cells[row][column] = cell;
  }

  public int getColumnCount()
  {
    return cells.length;
  }

  public int getRowCount()
  {
    return cells[0].length;
  }

  private static Cell[][] createCellArray(boolean[][] bools)
  {
    Cell[][] c = new Cell[bools.length][bools[0].length];

    for (int i = 0; i < bools.length; i++)
    {
      for (int j = 0; j < bools[i].length; j++)
      {
        c[i][j] = new Cell(bools[i][j]);
      }
    }
    return c;
  }

}

Code:
class Cell
    extends JPanel
{
  private static final Color blue   = new Color(62, 101, 241);
  private static final Color yellow = new Color(247, 250, 137);
  
  private boolean alive = false;

  public Cell()
  {
    this(false);
  }

  public Cell(boolean alive)
  {
    super();
    setAlive(alive);
    
    setBorder(new LineBorder(Color.black));
  }

  public boolean isAlive()
  {
    return alive;
  }

  public void setAlive(boolean alive)
  {
    this.alive = alive;
    if(alive)
      setBackground(blue);
    else
      setBackground(yellow);
  }

}

MFG

Sascha
 
das sieht schonmal sehr sehr gut aus ! sehr verstaendlich vorallem....

dennoch frage ich mich grade onb das mit dem LineBorder doch gar nicht mein Programmierfehler war. Das funktioniert bei mirs chon die ganze Zeit nicht. Der Compiler kann, trotzdem ich alle wichtigen impot's drin habe damit nichts anfangen und wirft ne meldung dazu aus. :

can not find Symbol class - LineBorder


woran kann das dnen liegen ?

passiert auch in deinem beispiel (was mich irgendwie beruhigt ^^ )

wäre absolut super wenn du mir das noch eben erkaleren koenntest :\


Oh da haben sich grad direkt noch 2 Fragen eingeschlcihen die 1. ist warum benutzt du 2 konstruktoren (ich weiß der eine ist der überladene, aber fuer mich machen dann die inhalte keinen sinn ? )

PHP:
  public Cell()
  {
    this(false);
  }

  public Cell(boolean alive)
  {
    super();
    setAlive(alive);    
    setBorder(new LineBorder(Color.black));
  }

un din field :
PHP:
  public Field(boolean[][] cells)
  {

    this(createCellArray(cells));
  }

  public Field(Cell[][] cells)
  {
    setLayout(new GridLayout(cells.length, cells[0].length));

    this.cells = cells;

    for (int i = 0; i < cells.length; i++)
    {
      for (int j = 0; j < cells[i].length; j++)
      {
        Cell cell = cells[i][j];
        cell.setPreferredSize(new Dimension(50,50));
        add(cell);
      }
    }

  }

:) danke
 
Zuletzt bearbeitet:
hab den Fehler mit dem LineBorder gelöst....

Aber wenn ich es ausführe, dann startet gar kein Frame..... warum blos nicht :( ?

Benutze Bluej....


hat sich erleidgt, setVisible stand nich im Konstruktor :) ! jetzt laeufts :)
 
Zuletzt bearbeitet:
Die LineBorder wurde nicht gefunden, weil die Imports gefehlt hatten. Die hatte ich nicht mit gepostet.

warum benutzt du 2 konstruktoren (ich weiß der eine ist der überladene, aber fuer mich machen dann die inhalte keinen sinn ? )

Bei der Klasse Field sind 2 Konstruktoren, damit man wählen kann, wie man das Field erstellt. Du kannst entweder ein boolean-Array übergeben, oder ein Cell-Array.

Wenn du ein boolean-Array, wird ein Cell-Array erstellt und der andere Kontruktor aufgerufen. So schreibt man keinen doppelten Code.

Bei der Klasse Cell sind 2 Konstruktoren, damit man sich eventuell Programmieraufwand sparen kann. Erstellt man ein Object dieser Klasse mit dem Standard-Kontruktor wird der zweite Konstruktor mit false aufgerufen. Den zweiten Kontruktor kann man nutzen, um alive individuell zu setzen.

Das Thema mit der Groß- und Kleinschreibung hat sich aber noch nicht erledigt.

MFG

Sascha
 
Ist ja gut, kann man schonmal vergessen wenn man sonst nur klein schriebt ;)

Danke für die gute Erklärung ! Hab mein kleines Projekt schon umgebaut und erweitert :)

Wenn ich wiedermal haenge meld ich mich hier im thread, koennte schon morgen sein ! Bitte auflassen :)
 
Zurück