Hallöle,
ich habe da ein etwas größeres Problemchen.
Mein Projekt sieht folgendermaßen aus (siehe Bild):
In der Mitte das Blaue ist ein Element meines GridLayoutes.
Das GridLayout selbst sieht so aus:
spielframe.setPreferredSize(new Dimension(1400,800));
spielframe.setMinimumSize(new Dimension(1050,600));
spielframe.setResizable(true);
spielframe.setIconImage(Toolkit.getDefaultToolkit().getImage(new URL(BaseURL.getJarBase(Spielfeld.class), "./favicon.png")));
Container contentPane = spielframe.getContentPane();
contentPane.setLayout(new GridBagLayout());
spielframe.add(new Barkartenecke(), new GridBagFelder(0, 0, 1, 1, 0.15, 0.5));
spielframe.add(new Uebersichtsecke(), new GridBagFelder(0, 1, 1, 1, 0.15, 0.5));
spielframe.add(new Spielfeld(), new GridBagFelder(1, 0, 1, 2, 0.67, 1.0)); //Das hier ist das angesprochene Feld
spielframe.add(new Spielkartenecke(), new GridBagFelder(2, 0, 1, 1, 0.18, 0.6));
spielframe.add(new Bildecke(), new GridBagFelder(2, 1, 1, 1, 0.18, 0.4));
spielframe.pack();
spielframe.setLocationRelativeTo(null);```
Das Element `spielfeld` ist das angesprochene.
Der Inhalt dieses Spielfeldes ist folgender:
```package spiel;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
public class Spielfeld extends JPanel {
private Spielzelle spielfeldzelle[][] = new Spielzelle[11][11];
private static JLabel meldungsbox = new JLabel();
private static ArrayList<Spielzelle> spielfeldtisch = new ArrayList<Spielzelle>(12);
private static ArrayList<Spielzelle> spielfeldstuhl = new ArrayList<Spielzelle>(24);
private int aktstuhlnummer;
protected Spielfeld() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
for(int y=0;y<11;y++) {
for(int x=0;x<11;x++) {
gbc.gridx = x;
gbc.gridy = y;
if(y<10) {
spielfeldzelle[x][y] = new Spielzelle(Spielzelle.Typ.Leer);
spielfeldzelle[x][y].setBackground(new Color(0,255,255));
spielfeldzelle[x][y].setOpaque(true);
add(spielfeldzelle[x][y], gbc);
} else if(y==10) {
gbc.gridwidth = 11;
meldungsbox.setBackground(new Color(0,255,255));
meldungsbox.setOpaque(true);
meldungsbox.setHorizontalAlignment(SwingConstants.CENTER);
add(meldungsbox, gbc);
break;
}
}
}
feldmalen();
}
private void feldmalen() {
int[] tischkoordx = {4,5,6,7,8,7,6,5,4,3,2,3};
int[] tischkoordy = {3,2,3,4,5,6,7,8,7,6,5,4};
for(int i=0;i<12;i++) {
spielfeldtisch.add(spielfeldzelle[tischkoordx**][tischkoordy**]);
spielfeldzelle[tischkoordx**][tischkoordy**].setTyp(Spielzelle.Typ.Tisch);
}
int[] stuhlkoordx = {4,5,6,7,8,7,6,5,4,3,2,3,4,5,6,9,8,7,6,5,4,3,2,1};
int[] stuhlkoordy = {4,1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,7,8,9,8,7,6,5};
for(int i=0;i<24;i++) {
final int j = i;
spielfeldstuhl.add(spielfeldzelle[stuhlkoordx**][stuhlkoordy**]);
spielfeldzelle[stuhlkoordx**][stuhlkoordy**].setTyp(Spielzelle.Typ.Stuhl);
spielfeldzelle[stuhlkoordx**][stuhlkoordy**].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(Spielkartenecke.getAkthandkartnum()!=-1) {
new Spielzuege().legegastkarte(Spielkartenecke.getAkthandkartnum(),j);
}
}
});
}
}
protected static ArrayList<Spielzelle> getSpielfeldtisch() {
return spielfeldtisch;
}
protected static void setSpielfeldtisch(ArrayList<Spielzelle> spielfeldtisch) {
Spielfeld.spielfeldtisch = spielfeldtisch;
}
protected static ArrayList<Spielzelle> getSpielfeldstuhl() {
return spielfeldstuhl;
}
protected static void setSpielfeldstuhl(ArrayList<Spielzelle> spielfeldstuhl) {
Spielfeld.spielfeldstuhl = spielfeldstuhl;
}
protected int getAktstuhlnummer() {
return aktstuhlnummer;
}
protected void setAktstuhlnummer(int aktstuhlnummer) {
this.aktstuhlnummer = aktstuhlnummer;
}
protected static JLabel getMeldungsbox() {
return meldungsbox;
}
}```
Also zuerst mache ich da ein 11 mal 10 Feld rein und danach auf die gesamte untere Zeile ein JLabel zur Anzeige.
Also sozusagen wie ein 11 mal 11 Feld, wo das unten verschmolzen ist.
Und hier liegt nun das Problem.
Wie ihr seht, ist in der Meldungsbox massig Platz. Man schaue nur dieses poplige "Startzeit: xxxx" an. (gibt an, wie lange mein Programm in Millisekunden lädt). Da ist Unmengen Platz zur Anzeige.
Aber Java macht etwas, was ich überhaupt nicht verstehe.
Wenn ich den Text in der Box verändere, verschiebt sich das gesamte Layout.
```.getMeldungsbox().setText("Die Nationalität dieses Gastes stimmt nicht mit der Tischnationalität überein.")```
Dann sieht es so aus:
Das JLabel krallt sich also immer mehr Platz, obwohl es eigentlich genug hatte, um den Text anzuzeigen.
Ich möchte gerne, dass das JLabel genau so groß bleibt, wie es jetzt ist und rein gar nichts das negativ beeinflussen kann.
Ich komme da nicht weiter. Ich hoffe ich habe mein Problem logisch verständlich erläutern können.
Danke im Voraus für eure Hilfe.
Gruß
Lukas
=====
PS: Mein gesamtes Projekt sieht man hier:
https://github.com/Dabendorf/Caf-International-Grafik-/tree/master/src/spiel
Falls sich jemand damit beschäftigt und den Fehler möglicherweise woanders auffindet.
PS#2: Das Layout ist Resizable. D. h. beim verändern der Größe durch den Nutzer muss das JLabel weiterhin auch seine Proportion im Vergleich zum Rest behalten. Was es bisher auch tut. Nur als kleine Anmerkung, falls jemand etwas gefunden hat.