Hallöle,
vielen Dank für diese Codeidee.
Dass man das ganze in Methoden mit mehreren Integern auslagern kann, ist mir bewusst, das hab ich erst einmal bewusst nicht gemacht, damit ich erstmal kompakt und an einer Codestelle mir das Arbeiten mit dem GridBagLayout erlernen kann. Ich werde das aber nun fortan umsetzen, ich glaube verstanden zu haben, wie das ganze funktioniert.
Ich habe Deinen Code eingebaut und es funktioniert hervorragend, mein Testprojekt, vielen Dank!
Ich habe nur noch ein paar Änderungen vorgenommen, um es besser in meine eigene Philosophie anzugliedern.
Beispielsweise hab ich ein paar Klassen und Methoden umbenannt, da ich das Projekt immer eher in Deutsch als in Englisch programmiere. Wenn ich versuchen würde Englische Worte mit meiner Sprache einzubauen, wäre die Blamage perfekt.
Also das ganze sieht nun vorerst so aus, Korrekturen in Lesbarkeit und Codeverbesserung werden noch folgen.
Meine Hauptklasse CafeMain
:
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
public class CafeMain {
// System
protected static String OS = System.getProperty("os.name").toLowerCase();
protected static String dateipfad = new File("").getAbsolutePath();
protected static String programmname = "Café International";
protected static JFrame spielframe = new JFrame(programmname);
// Spieler
protected static int spieler = 1;
protected static String[] spielername = new String[2];
protected static int[] punktespieler = new int[2];
protected static List<Gastkarte> kartenspieler1 = new ArrayList<Gastkarte>();
protected static List<Gastkarte> kartenspieler2 = new ArrayList<Gastkarte>();
// Spielkarten
protected static List<Gastkarte> gastkarten = new ArrayList<Gastkarte>();
protected static List<Laenderkarte> laenderkarten = new ArrayList<Laenderkarte>();
// Spielfeld
protected static List<Tisch> tische = new ArrayList<Tisch>(12);
protected static List<Stuhl> stuehle = new ArrayList<Stuhl>(24);
protected static int[] tischex = new int[12];
protected static int[] tischey = new int[12];
protected static int anzahlbarplaetze = 21;
// Sonstiges
protected static boolean spielernamenkorrekt = false;
protected static GridBagLayout gridlayout = new GridBagLayout();
public CafeMain() throws IOException {
spielframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
spielframe.setLocationRelativeTo(null);
//Spielfeld spielfeld = new Spielfeld();
//spielframe.add(spielfeld);
spielframe.setPreferredSize(new Dimension(600, 600));
//spielframe.setSize(600,600);
spielframe.setResizable(false);
spielframe.setIconImage(Toolkit.getDefaultToolkit().getImage("./src/spiel/demo_DE.jpg"));
spielframe.setVisible(false);
//======
Container contentPane = spielframe.getContentPane();
contentPane.setLayout(gridlayout);
//======
spielframe.add(AufbauHilfe.createRandomBackgroundLabel("LINKSOBEN"), AufbauHilfe.createGridBagConstraints(0, 0, 1, 1, 1, 1));
spielframe.add(AufbauHilfe.createRandomBackgroundLabel("LINKSUNTEN"), AufbauHilfe.createGridBagConstraints(0, 1, 1, 1, 1, 1));
spielframe.add(AufbauHilfe.createRandomBackgroundLabel("RECHTSOBEN"), AufbauHilfe.createGridBagConstraints(2, 0, 1, 1, 1, 1));
spielframe.add(AufbauHilfe.createRandomBackgroundLabel("RECHTSUNTEN"), AufbauHilfe.createGridBagConstraints(2, 1, 1, 1, 1, 1));
Spielfeld spielpanel = new Spielfeld(4, 4);
spielframe.add(spielpanel, AufbauHilfe.createGridBagConstraints(1, 0, 1, 2, 3, 3));
spielframe.pack();
ablauf();
}
public static void ablauf() {
/*do{
Spielstart.namensfrage();
} while(spielernamenkorrekt == false);*/
Spielstart.gastkartenmischen();
Spielstart.laenderkartenmischen();
Spielstart.spielfeldgenerieren();
spielframe.setVisible(true);
}
public static void main(String[] args) throws IOException {
new CafeMain();
}
}```
Ist eben noch ein kleines bisschen anderes Zeuchs drin, alles an Code, was noch nie in diesem Thema erwähnt wurde, ist jetzt zu vernachlässigen. ;)
Deine beiden Hilfsklassen, wo die Methoden drinstecken habe ich einfach ausgelagert in die Datei Spielfeld, wo früher mal mein altes JPanel drin war, was ich nicht mehr brauche.
```package spiel;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JLabel;
import javax.swing.JPanel;
class Spielfeld extends JPanel {
public Spielfeld(int rows, int columns) {
setLayout(new GridLayout(rows, columns));
for (int i=0; i<rows*columns; i++) {
add(AufbauHilfe.createRandomBackgroundLabel(String.valueOf(i)));
}
}
}
class AufbauHilfe {
public static GridBagConstraints createGridBagConstraints(int x, int y, int width, int height, int weightX, int weightY) {
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = x;
constraints.gridy = y;
constraints.gridwidth = width;
constraints.gridheight = height;
constraints.weightx = weightX;
constraints.weighty = weightY;
return constraints;
}
public static JLabel createRandomBackgroundLabel(String text) {
Random rand = new Random();
JLabel label = new JLabel(text);
label.setBackground(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));
label.setOpaque(true);
return label;
}
}```
Das ganze sieht nun so aus:
Ich hab bewusst mal den ganzen Bildschirm genommen, weil sich noch ein weiteres Problem ergibt. Der setzt mein Fenster nicht mehr in die Mitte des Bildschirms. Es muss irgendetwas geben, was mein `spielframe.setLocationRelativeTo(null);` erfolgreich aushebelt. Hab ich schon öfter mal nach Codeänderungen gehabt, kann ich nicht nachvollziehen, wieso das so ist, wie es ist.
======
Der Rest sieht erstmal korrekt aus.
Jeder dieser 5 Bereiche ist nun ein Einzelbereich, wo ich weitere Elemente hinzufügen werde. Mein Focus liegt erstmal im Mittleren Bereich, wo jetzt das 4 mal 4 hinkommt, soll irgendwann einmal das hier entstehen:
Die weißen sind ohne Funktion und die Roten sowie Orangenen haben je die gleiche Funktion mit ActionListener beim Anklicken.
Ich schau mal, wie ich das Codetechnisch am besten hinbekommen sollte zu generieren. Ergibt sich sicherlich die Tage.
======
Letzte Sache, mal so zum Verständnis:
```constraints.gridx = x;
constraints.gridy = y;
constraints.gridwidth = width;
constraints.gridheight = height;
constraints.weightx = weightX;
constraints.weighty = weightY;```
Das war wohl der Grund, warum ich da immer noch nicht so ganz durchgesehen habe.
Kann mir einer sagen, ob folgender Gedankengang richtig ist?
`x` und `y` stellen einfach die Position im Raster fest, wobei oben Links 0,0 ist und das dann nach links und unten weiterzählt.
`width` & `height` legt die "Positionslänge" fest. Also ich meine, das Teil in der Mitte ist beispielsweise nur ein einzelnes X, aber erstreckt sich senkrecht über gleich 2 Ypsilon. Also 1,2.
`weightX` & `weightY` sind irgendetwas mit Extraplatz, was ich aber noch nicht so nachvollziehen kann.
Schöne Grüße und Danke im Voraus für die Beantwortung meiner Fragen.
Gruß
Lukas