Java Gitternetz

yeronimo

Erfahrenes Mitglied
Einen schönenguten Abend,

ich möchte ein Gitternetz erstellen (auf einem frame zeichnen) und einzelne Zellen aus diesem Gitter ansprechen können und füllen. (dabei sollte es moeglich sein durch die einzelnen zellen iterieren zu können und auch gezielt bestimmte zellen anzusoprechen um mit zufallsgenerierten Zellenkoordinaten arbeiten zu können)

Meine idee war evtl. einzelne quadrate direkt nebeneinander zeichnen zu lassen?
oder ist es moeglich ein GridLayout zu benutzen und die linien sichtbar zu machen und da die einzelnen felder gezielt zu füllen ?

oder vieleicht ist es besser eine Cell und Field klasse zu bauen in der einen das Feld erstellen zu lassen und die einzelnen Zellen als Objekte zu behandeln ?!

ich boin für jede Hilfe dankbar :)


danke
 
Naja über gridLayout ist das Natürlich möglich.
Erstelle halt ne eigene Klasse Field, die du von JLabel oder JPanel ableitest. da kannst du ja dann eigene Implementierungen vornehmen und eben die Ränder setzen.
Schön ist das nicht, geht aber:p

Hmm Zugriffsfrage:
Speichere die Felder in einem 2dimensionalen Array ab und lade sie der Reihenfolge nach in dein Gridlayout, dann kannst du sie über die Stelle im Array abfragen!

Am schönsten ist da vermutlich die Verwendung einer JTable oder?
Grüße,
Orbit
 
Zuletzt bearbeitet:
hi , danke das du geantworet hast :)


deine idee mit dem array gefällt mir sehr gut, jedoch besteht da noch das problem mit dem gezielten einlesen nachkoordinaten.
soweit ich das gelesen habe muss ich doch erstmal ein constraint erstellen um ueber x und y koordinaten etwas in das gridBagLayout einlesen zu koennen. meiner meinung nach ein recht komplizierter weg.
Ist das beim gridLayout auch der Fall oder gibt es da einfachere Lösungen ?
Hast du evtl. sogar ein Besipiel ?

hab auch direkt noch eine neue frage, ist es moeglich bei dem gridLayout die grenzen(also die border der zellen) sichtbar zu machen ? so das man das Grid auch erkennt ^^


wäre für jede antwort dankbar :) !
 
Hallo,
Also GridBag würde ich nicht verwenden, es sei denn du hast Zellen, die zwei Zellen in Ansprich nehmen. Wenn alle zellen exakt gleich groß sind, verwende GridLayout.

Das geht ziemlich simpel (vorsicht schreibe den Code nur so hin, teste ihn nicht aus):
Code:
JPanel panel = new JPanel(new GridLayout(20, 20)); // 20 * 20 Zellen
// Ich gehe davon aus dass du eine Klassie Field hast, die von JLabel bzw Panel erbt
Field[][] fields = new Field[20][20];
for(int i = 0; i<20; i++){
     for(int j = 0; j<20;j++){
          field[i][j] = new Field(irgendwelche Daten);
          panel.add(field[i][j]);      // Um dies zu können, muss field von JPanel o. ä. abgeleitet sein
     }
}

So ich hoffe der ist nicht zuu verbuggt aber ich denke das prinzip sollte klar sein. Du speicherst deine Fields einmal im Array und fügst sie gleich zum Panel hinzu. Da du dem Panel ein GridLayout zugewiesen hast, richtet dies die Fields gleich aus.

in Field sollte irgendwo stehen:
Code:
...
this.setPreferredSize(new Dimension(10,10));     // deine Größe angeben
this.setBorder(new LineBorder(Color.black));      // dies ist später als Gitternetz sichtbar!
...

Hoffe, ich konnte dir weiterhelfen,
Orbit

EDIT:
jetzt kannst du in deinem Array über fields[x][y] geziehlt ein field erfragen; diese sind genauso gespeichert wie sie im Layout angeordnet sind!
 
das hilft mir schonmal mega weiter

letzte frage dazu, in field muesste ich doch dann in der theorie nur ein gridLayout mit einer bestimmten größe erstellen(koennte ih doch auch als parameter an den konstruktor uebergeben) und dann field als objekt der klasse erstellen, was dann automatisch ein gridLayout ist. soweit richtig ?

und dann ist nochdie frage der ausgabe offen. wenn ich das auf einem frame ausgeben will, also das field objekt mit allen inhalten, wie genau koennte ich das am simpelsen anstellen ?
Im moment stehen ja quasi nur die daten.


danke schonmal :) !
 
das hilft mir schonmal mega weiter

letzte frage dazu, in field muesste ich doch dann in der theorie nur ein gridLayout mit einer bestimmten größe erstellen(koennte ih doch auch als parameter an den konstruktor uebergeben) und dann field als objekt der klasse erstellen, was dann automatisch ein gridLayout ist. soweit richtig ?

und dann ist nochdie frage der ausgabe offen. wenn ich das auf einem frame ausgeben will, also das field objekt mit allen inhalten, wie genau koennte ich das am simpelsen anstellen ?
Im moment stehen ja quasi nur die daten.


danke schonmal :) !




sry habs einfach nicht mit diesen layouts und bin noch ziemlich neu in der materie...
 
So wies im Code ist, werden die Daten schon angezeigt:)
Da fehlt jetzt nur noch sowas wwie JFrame frame = new JFrame();
frame.add(panel);

Du musst die Fields auch weiter nicht mit dem GridLayout belasten; die ordnen sich von selbst an. Dadurch, dass du schreibst
JPanel panel = new JPanel(new GridLayout(20,20));
und dann
panel.add(Field irgendwas);
fügst du es einerseits dem panel hinzu und andererseits ordnest du es bereits ins Layout ein!

Das ist ja der Vorteil von LayoutManagern, dass die alles selbst schön rechteckig anordnen!
Wenn du das GridBagLayout verwenden würdest (wovon ich abrate) müsstest du noch an den Objekten herumschrauben. Mit GridLayout funktioniert das alles mit panel.add(field);

ich bin mir grad nicht sicher, aber ich glaube dass die Felder zeilenweise eingefügt werden.
Also der erste AUfruf von panel.add(filed1) fügt field1 in x=1 und y=1 ein, der zweite in x=2, y=1 usw.
(könnte auch spaltenweise sein, glaube ich aber eher nicht).

also zu den obigen Codes fehlt nur noch
Code:
Jframe f = new JFrame(new BorderLayout());
f.add(panel, BorderLayout.CENTER);
f.setVisible(true);

Grüße,
Orbit

letzte frage dazu, in field muesste ich doch dann in der theorie nur ein gridLayout mit einer bestimmten größe erstellen(koennte ih doch auch als parameter an den konstruktor uebergeben) und dann field als objekt der klasse erstellen, was dann automatisch ein gridLayout ist. soweit richtig ?
nein; ein hinzugefügtes field ist automatisch genau eiune zelle deines Gitternetzes! Aber ein field ist ein Objekt der Klasse Field; dieses wird in der Zeile

Code:
field[i][j] = new Field(irgendwelche Daten);


erstellt. irgendwelche Daten könnten zum beispiel ein text sein, aber du musst wie gesagt nix mehr hinzufügen um das Layout zum laufen zu bringen.
 
Zuletzt bearbeitet:
ich glaube ich kriegs hin wollte es aber eigentlich andersherum haben :D
ich erklaer nochmal eben:

wenn ich ein neues field objekt erstelle sollte es ein neues feld sein (ich wollte es spaeter benutzen um feld1 und feld 2, alo 2 feld objekte und somit eigentlich auch 2 komplette felder, zu vergleichen. also die werte in den jeweiligen feldern) in meinem späteren programm waren 2 klassen geplant :

1 . Simulator
2 . Field

in simulator sollte der frame erstellt werden, vergleichmethoden usw. in field sollte ein neues feld erstellt werden.

ach shit, ich glaube genau jetzt habe ich verstanden wie du das meinst... :D

in field werden laut dem oberen code nur die 2 dimensionalen arrays erstellt was das eigentliche field objekt ist. das gridLayout dagegen existiert aber nur genau einmal (in simulator bei mir dann) und zwar wenn es eingelesen wird richtig ?

demnach brauch ich das adden von dem panel znd die forschleifen zum einlesen der daten nachdem ich die beiden feldobjektze verglichen hab. kann das ja auch die arrays direkt vergleichen.
 
Hallo,

mir stellt sich gerade die Frage warum du nicht eine JTable verwendest?

Du hast direkt schon ein Gitter-Netz. Du kannst definieren wie eine Zelle aussieht (CellRenderer), du kannst definieren welche Daten in einer Zelle dargestellt werden(TableModel), du kannst über alle Zellen iterieren bzw jede Zelle ansprechen.

Du hast also bei einer JTable alles was du brauchst, also warum es nochmal selbst implementieren?

MFG

Sascha
 
Der erste Code den ich geschrieben habe, ist sozusagen in deiner Klasse Simulator. Der Verwaltet alle Felder im Array. Die Klassie Field wäre das zweite Codebeispiel!
Du kannst auf deine Fields einfach zugreifen:
fields[2][3].tueIrgendwas();
du kannst auch 40 * 40 felder im Array haben und immer zwei vergleichen und dann welche einfach nicht mit
panel.add(fields[x][y]);
zur GUI hinzufügen.
Eine JTable hat den Vorteil, dass du die Zellen einfach selber ansprechen könntest, du würdest dir dein Array und dein Layout sparen.
Aber soviel Code ist das nicht (in o.g. Beispiel ist ja fast alles drin); bevor du da mit deiner Klasse CellRenderer usw was man noch so alles braucht fertig bist, kannst du das andere schon verkaufen:p
JTable braucht wie jede vorgefertigte GUI einfach zu viel Quelltext:-D (wäre aber natürlich schöner programmiert!)
Grüße,
Orbit
 

Neue Beiträge

Zurück