Swing Von 2 dimensionalem Array auf JTextfield schließen und färben

Nikon23

Mitglied
Moinmoin,

ich hab ein kleines Problem mit einem 4gewinnt Spiel, das ich programmieren soll.
Ich bin soweit, dass alles läuft, auch die Überprüfung, ob man gewonnen hat ist kein Problem. Das einzige was mir sorgen macht ist die grafische Darstellung.

Ich habe es so gelöst, dass ich ein 2 dimensionales Array habe und ich JTextfields habe (vorgabe des Lehrers), die sich färben sollen, wenn ein Spieler einen Stein in das jeweilige Feld geworfen hat. Mein Problem ist nun, dass ich 42 if-Abfragen machen müsste,wenn mir keine schlaue Schleife einfällt.

Mein Ansatz sieht so aus:
Man bekommt x als Wert übergeben, sprich in welche Spalte der Stein fallen soll. Dann überprüfe ich in welche Zeile er muss (i) und dann soll er dieses JTextfield färben.
Ich hab die JTextFields so genannt, wie das Array sie quasi vorgibt, also feld00 ist ganz unten links, feld01 ist ein drüber etc. saz ist in diesem Fall der Wert, ob Spieler 1 oder 2 den Stein wirft.
[Java]
public void wert (int x, int saz){
for (int i=0; i < 6; i++){
if (feld[x] == 0){
feld[x] = saz;
String a = (new Integer(x)).toString();
String b = (new Integer(i)).toString();
String c = "feld"+a+b;
c.Background(Color.RED);

return;
}
}
}
[/Java]

Ich weiß, dass es mit c.Background.. nicht funktioniert, aber das ist so meine Idee, sprich meine Frage ist, ob man aus diesem String c wieder einen namen für das JTextfield machen könnte, dass ich den Befehl so verwenden kann.
Ich würde ungern den ganzen Quellcode umschreiben, da wir auch noch nicht so viel zu Java gelernt haben. (Informatik 13. Klasse)

Ich hoffe jemand hat eine zündende Idee 🙂.

Danke schonmal im voraus

Gruß Nikon
 
Zuletzt bearbeitet:
Hm google war da jetzt nicht wirklich mein Freund. Ich finde keine Anleitung wie man ein 2-dimensionales JTextField Array baut und die dann auch noch in der grafischen Oberfläche verschieben kann, so dass daraus ein 4gewinnt Spielfeld wird.

Ich denke mal man initialisiert das auch wieder so:

JTextField[][] textfeld = new JTextField[7][6];

Erstens ist meine Frage nun, wie ich in der grafischen Oberfläche diese 42 Textfelder verschiebe/einteile und zweitens wie ich die Felder färbe an Hand meiner for Schleife, denn
textfeld[x].Background(Color.RED);
oder
textfeld[x].setBackground(Color.RED);
ergibt nur Fehler 🙂
 
Zuletzt bearbeitet:
Du musst die einzelnen Textfelder natürlich noch instantiieren, also:
Java:
textfeld[x][i] = new JTextField();
du erstellst hier nur ein array, das Textfelder aufnehmen kann.
 
Also mein Code sieht jetzt wie folgt aus:
[Java]
public class viergewinnt extends JFrame {
int[][] feld = new int[7][6];
JTextField[][] textfeld = new JTextField[7][6];
String spieler1;
String spieler2;
int saz = 1; // SpielerAmZug

...

// Anfang Komponenten

feld00.setBounds(80, 224, 33, 24);
feld00.setText("");
cp.add(feld00);
textfeld[0][0] = new JTextField();
textfeld[0][0] = feld00;

[/Java]

Was auch ohne Probleme läuft. Wenn ich nun aber die Hintergrundfarbe ändern möchte in der Schleife mit:

[Java]textfeld[x].Background(Color.RED);[/Java]

krige ich als Fehlermeldung:
[Java]
Compiliere C:\Users\Nikon\Downloads\viergewinnt\viergewinnt.java mit Java-Compiler
viergewinnt.java:134:24: cannot find symbol
symbol : method Background(java.awt.Color)
location: class javax.swing.JTextField
textfeld[x].Background(Color.RED);
^
1 error
[/Java]

Ist das nur ein falscher Syntax oder wo muss die Instanzierung hin? Mir bringt das ja nichts in der for-Schleife, da ich dann zwar das Feld befülle aber ich dann keine feld00, feld01, feld02 etc. dem Array vorher zuweisen kann oder?

EDIT:
Ah, ok mit einem setBackgroundcolor löst sich alles in Wohlgefallen auf 😉.

Naja fast alles^^

[Java]
feld00.setBounds(80, 224, 33, 24);
feld00.setText("");
cp.add(feld00);
textfeld[0][0] = new JTextField();
textfeld[0][0] = feld00;

feld01.setBounds(80, 192, 33, 24);
feld01.setText("");
cp.add(feld01);
textfeld[0][1] = new JTextField();
textfeld[0][1] = feld01;

feld02.setBounds(80, 160, 33, 24);
feld02.setText("");
cp.add(feld02);
textfeld[0][2] = new JTextField();
textfeld[0][2] = feld02;

feld03.setBounds(80, 128, 33, 24);
feld03.setText("");
cp.add(feld03);
textfeld[0][3] = new JTextField();
textfeld[0][3] = feld03;

feld04.setBounds(80, 96, 33, 24);
feld04.setText("");
cp.add(feld04);
textfeld[0][4] = new JTextField();
textfeld[0][4] = feld04;

feld05.setBounds(80, 64, 33, 24);
feld05.setText("");
cp.add(feld05);
textfeld[0][5] = new JTextField();
textfeld[0][5] = feld05;
[/Java]

Da hat nicht zufällig jemand ne Idee das schlau und schön zu machen? :/
 
Zuletzt bearbeitet:
Das wird

textfeld[0][0] = new JTextField();
textfeld[0][0] = feld00;

wohl schiefgehen. Da wird wohl erst das Array mit dem JTextfield belegt und dann gleich mit dem feld überschrieben. Wenn dann bräuchstest du 2 zweidimensionale Array. Das eine hält dein Feld, das andere dein JTextField.

Eine andere Lösung ist eine ein Klasse Feld zu entwerfen, die alle Infos für ein Feld enthält
- JTextField
- Spieler
- Wert
- Farbe
- Größe
- .....

Diese Klasse kannst du dann in einem 2 dim. Array halten.
Ersatzweise auch in einer ArrayList, in dem du eine Umrechnung von den 2 dim Koordinaten (X und Y) in ein 1 dim Liste vornimmst. Hast du ein 5 x 5 Feld errechnet sich die Position in der Liste - je nach dem wie du die Daten in die Liste geschrieben hat (X/Y) - bsp mit (x*5)+Y
 
Hm also so wie ich es geschrieben hab funktioniert es auf jeden Fall, die Frage ist halt nur, ob das schöner/schmaler geht. Aber da ist wohl der Ansatz zu verkorkst für 😀.

Auf jeden Fall danke für die Hilfe und das Thema ist damit erledigt. 🙂
 

Neue Themen


Zurück
Oben