Swing Mein swingender Pokertisch macht Probleme

Hallo alle zusammen! Das ist mein erster Post hier im Forum und ich bin wirklich begeistert was man hier alles findet, großes Lob an euch!:applaus:

Ich schreibe derzeit ein Pokerprogramm, aber die GUI will nicht so wie ich es gerne hätte. Ich hatte mir einen Plan gemacht (für GridBagLayout):





Ich weiß, dass es nicht genau passt, aber weil die Elemente ja alle einzeln reingeladen werden, sollte es einigermaßen klargehen. Das Ergebnis ist aber zum ;(


1503,ergjpgX76XR.jpg



Ich hatte es mir so gedacht, dass ein Stuhl im Grid 1x1 Zellen wegnimmt, der Tisch hingegen 5x3. Die Positionen könnt ihr dem Raster entnehmen.

Java:
private void draw() {
		
		Stuhl s[] = new Stuhl[6];
		for(int i = 0; i < 6; i++){
			s[i] = new Stuhl();
			s[i].setAktiv(true);
		}
		
		Tisch t = new Tisch();
		
		this.setLayout(new GridBagLayout());
		
		GridBagConstraints gbcSLi = new GridBagConstraints();
		GridBagConstraints gbcSRe = new GridBagConstraints();
		GridBagConstraints gbcSLo = new GridBagConstraints();
		GridBagConstraints gbcSLu = new GridBagConstraints();
		GridBagConstraints gbcSRo = new GridBagConstraints();
		GridBagConstraints gbcSRu = new GridBagConstraints();
		GridBagConstraints gbcT = new GridBagConstraints();
		
		gbcSLi.gridx = 0;
		gbcSLi.gridy = 2;
		gbcSLi.gridwidth = 1;
		gbcSLi.gridheight = 1;
		
		gbcSRe.gridx = 6;
		gbcSRe.gridy = 2;
		gbcSRe.gridwidth = 1;
		gbcSRe.gridheight = 1;
		
		gbcSLo.gridx = 2;
		gbcSLo.gridy = 0;
		gbcSLo.gridwidth = 1;
		gbcSLo.gridheight = 1;
		
		gbcSLu.gridx = 2;
		gbcSLu.gridy = 4;
		gbcSLu.gridwidth = 1;
		gbcSLu.gridheight = 1;
		
		gbcSRo.gridx = 4;
		gbcSRo.gridy = 0;
		gbcSRo.gridwidth = 1;
		gbcSRo.gridheight = 1;
		
		gbcSRu.gridx = 4;
		gbcSRu.gridy = 4;
		gbcSRu.gridwidth = 1;
		gbcSRu.gridheight = 1;
		
		gbcT.gridx = 1;
		gbcT.gridy = 1;
		gbcT.gridwidth = 5;
		gbcT.gridheight = 3;
		
		this.add(s[0], gbcSLo);
		this.add(s[1], gbcSRo);
		this.add(s[2], gbcSRe);
		this.add(s[3], gbcSRu);
		this.add(s[4], gbcSLu);
		this.add(s[5], gbcSLi);
		this.add(t, gbcT);
		this.setOpaque(false);
	}

Stuhl und Tisch erben jeweils vom JPanel und werden überschrieben, damit das Bild angezeigt wird.
PreferredSize-Werte:
Stuhl 125x125
Tisch 650x350

Einzeln geht alles und per BoarderLayout bekommt man mit ein wenig Mogeln auch das richtige Ergebnis, aber ich möchte natürlich gerne ein richtiges Ergebnis haben.

Wisst Ihr woran das liegen könnte? Langsam aber sicher bin ich doch recht verzweifelt.. GUI bauen ist einfach nichts für mich :D

Braucht ihr noch mehr Infos oder reicht euch das?
Es scheint mir so als würde der Tisch einige Zellen dehnen, obwohl ich das nicht so angefordert hatte. Oder bin ich da auch aufm Holzweg?
Wär echt klasse wenn mir jemand helfen könnte :)

Die Grafiken, abgesehen vom BG baue ich per ImageIcon ein.
 

ARadauer

Top Contributor
schon mal das GridLayout angsehen?

Ich find GridBagLayout hat mehr mit Masochismus zu tun als mit Sofware entwicklung ;-)
 
Hat keiner ne Idee dazu? Andere LayoutManager könnte natürlich auch probieren, aber das ändert meine Verwunderung über das Ergebnis nicht. Außerdem gefällt mir GridBagLayout eigentlich am besten.
 

Ebenius

Top Contributor
Die Größe der einzelnen Zellen des Grid eines GridBagLayouts bestimmt sich durch den Inhalt der Zellen und die eingestellten Gewichte. Die Spalten/Zeilen sind nicht gleich groß. Das Layout kann in Deinem Fall beispielsweise gar nicht wissen wie groß die Spalten 1, 3 und 5 sein sollen. Die Spalten 1 und 3 werden deswegen null Pixel breit. Und daraus folgend muss die Spalte 5 den restlichen Platz auffuttern, so dass der Tisch in den Verbund [1-5] passt. Vertikal hast Du exakt das gleiche Problem.

Nimm lieber ein GridLayout und füge Platzhalter dort ein wo nichts ist, das macht wesentlich weniger Kopfschmerzen. Mit GridBagLayout ist das ganze nur über Tricks zu erreichen (Platzhalter die die Spalten und Zeilen konditionieren und alle anderen Komponenten mit null-Gewichten). Das will man sich sparen!

Ebenius
 

Marco13

Top Contributor
Die andere Möglichkeit: GARkein Layout, und die Bildchen selbst da hin malen wo sie hin sollen. Spätestens wenn du die Karten auf dem Tisch auch noch in irgendein Layout pressen willst, wird's nämlich schwierig... ;)
 
@Marco: Weil ich Tisch ja als eigenständiges Panel habe sollte es kein Problem werden darauf noch etwas vernünftig zu platzieren, weil ich das auch nicht als ImageIcon einbinde, sondern indem ich die paintComponent überschreibe. Ich muss die Elemente auch einzeln haben, damit ich die Stühle auch als besetzt kennzeichnen kann (Der Stuhl ist grau wenn keiner dort sitzt). Damit man sieht wer noch im Spiel ist werden dann die verdeckten Karten des Gegners auf dem Stuhl platziert :)
Also brauche ich die Elemente einzeln, damit ich nicht großartig überlegen muss wenn ich was drauf platziere. Oder hab ich dich falsch verstanden?:oops:

@Ebenius: GridLayout alleine wird da nicht reichen oder? Weil, soweit ich weiß, immer nur ein Element pro Zelle möglich ist, wird das mit dem Tisch ne Sache der Unmöglichkeit. Oder gibt es eine Möglichkeit zu sagen, dass dieses Element jetzt 5x3y Plätze einnehmen soll?
Sonst kann ich es natürlich per BorderLayout organisieren, dann die Stühle oben und unten in ein GridLayout packen.
Aber das hatte ich vorher und empfand das als geschummelt :) Aber wenn du sagst, dass es beim gbl nicht anders geht, dann vertraue ich deinem fachkundigen Rat - ist ja auch einleuchtend mit der 0px Geschichte.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Hm, das ḱommt davon, wenn man nur halb mitdenkt, entschuldige. Also ist ein GridBagLayout wohl doch der richtige LayoutManager. Ich schreib Dir mal fix was ...

Ebenius
 

Ebenius

Top Contributor
Ich hab Dir mal eben einen LayoutManager gebastelt der für Deinen Pokertisch besser funktionieren sollte...

Java:
public class GridConstraints implements java.io.Serializable {

  public final int column;
  public final int row;
  public final int colspan;
  public final int rowspan;

  public GridConstraints(int column, int row) {
    this(column, row, 1, 1);
  }

  public GridConstraints(int column, int row, int colspan, int rowspan) {
    this.column = column;
    this.row = row;
    this.colspan = colspan;
    this.rowspan = rowspan;
  }
}

Java:
public class SpanningGridLayout
  implements LayoutManager2, java.io.Serializable {

  private final Map<Component, GridConstraints> constraints =
        new HashMap<Component, GridConstraints>();

  private int rows;
  private int columns;

  public void layoutContainer(Container parent) {
    synchronized (parent.getTreeLock()) {
      final Insets ins = parent.getInsets();
      int w = parent.getWidth() - ins.left - ins.right;
      int h = parent.getHeight() - ins.top - ins.bottom;
      if (this.rows == 0 || this.columns == 0) {
        return;
      }
      final int cellW = w / this.columns;
      final int cellH = h / this.rows;
      final int x0 = (w - cellW * this.columns) / 2 + ins.left;
      final int y0 = (h - cellH * this.rows) / 2 + ins.top;
      for (int i = 0; i < parent.getComponentCount(); i++) {
        final Component comp = parent.getComponent(i);
        final GridConstraints con = this.constraints.get(comp);
        if (con == null) {
          comp.setBounds(0, 0, 0, 0);
        } else {
          final int x = x0 + cellW * con.column;
          final int y = y0 + cellH * con.row;
          comp.setBounds(x, y, cellW * con.colspan, cellH * con.rowspan);
        }
      }
    }
  }

  public void invalidateLayout(Container target) {}

  public Dimension preferredLayoutSize(Container parent) {
    synchronized (parent.getTreeLock()) {
      final Insets ins = parent.getInsets();
      if (this.rows == 0 || this.columns == 0) {
        return new Dimension(0, 0);
      }
      int cellW = 0;
      int cellH = 0;
      for (int i = 0; i < parent.getComponentCount(); i++) {
        final Component comp = parent.getComponent(i);
        final GridConstraints con = this.constraints.get(comp);
        if (con != null) {
          final Dimension dim = comp.getPreferredSize();
          final int colspan = con.colspan;
          final int rowspan = con.rowspan;
          cellW = Math.max(cellW, (dim.width + colspan - 1) / colspan);
          cellH = Math.max(cellH, (dim.height + rowspan - 1) / rowspan);
        }
      }
      return new Dimension(ins.left + ins.right + cellW * this.columns,
            ins.top + ins.bottom + cellH * this.rows);
    }
  }

  public Dimension minimumLayoutSize(Container parent) {
    return new Dimension(0, 0);
  }

  public Dimension maximumLayoutSize(Container target) {
    return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
  }

  public float getLayoutAlignmentX(Container target) {
    return 0.5f;
  }

  public float getLayoutAlignmentY(Container target) {
    return 0.5f;
  }

  public void addLayoutComponent(String name, Component comp) {
    throw new UnsupportedOperationException(
          "LayoutManager2 uses addLayoutComponent(Component, Object)");
  }

  public void addLayoutComponent(Component comp, Object constraints) {
    if (!(constraints instanceof GridConstraints)) {
      throw new IllegalArgumentException(
            "Wrong type: GridConstraints expected");
    }
    final GridConstraints con = (GridConstraints) constraints;
    this.constraints.put(comp, con);
    this.rows = Math.max(this.rows, con.row + con.rowspan);
    this.columns = Math.max(this.columns, con.column + con.colspan);
  }

  public void removeLayoutComponent(Component comp) {
    final GridConstraints con = this.constraints.remove(comp);
    if (con != null
          && (con.row + con.rowspan == this.rows || con.column
                + con.colspan == this.columns)) {
      this.rows = 0;
      this.columns = 0;
      for (GridConstraints c : this.constraints.values()) {
        this.rows = Math.max(this.rows, c.row + c.rowspan);
        this.columns = Math.max(this.columns, c.column + c.colspan);
      }
    }
  }
}
Hilft das?

Ebenius
 
Hi!
Sehr interessant was du da gemacht hast, obwohl ich stellenweise sagen muss, dass ich nicht ganz verstanden hab was grad genau passiert :)
Es funktioniert jetzt nicht, aber ich bin mir nicht sicher ob ich das überhaupt richtig verwendet habe:

Java:
public class Spielflaeche extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3688965726149009662L;
	
	public Spielflaeche() {
		// TODO Auto-generated constructor stub
		draw();
	}

	private void draw() {
		// TODO Auto-generated method stub
		
		SpanningGridLayout sgl = new SpanningGridLayout();
		this.setLayout(sgl);
		
		Stuhl s[] = new Stuhl[6];
		for(int i = 0; i < 6; i++){
			s[i] = new Stuhl();
			s[i].setAktiv(true);
			s[i].setPreferredSize(new Dimension(130,130));
		}
		Tisch t = new Tisch();
		
		GridConstraints sol = new GridConstraints(0,2);
		GridConstraints sor = new GridConstraints(0, 4);
		GridConstraints sli = new GridConstraints(2, 0);
		GridConstraints sre = new GridConstraints(2, 6);
		GridConstraints sul = new GridConstraints(4, 2);
		GridConstraints sur = new GridConstraints(4, 4);
		GridConstraints tt = new GridConstraints(1, 1, 5, 3);
		
		sgl.addLayoutComponent(s[0], sol);
		sgl.addLayoutComponent(s[1], sor);
		sgl.addLayoutComponent(s[2], sre);
		sgl.addLayoutComponent(s[3], sur);
		sgl.addLayoutComponent(s[4], sul);
		sgl.addLayoutComponent(s[5], sli);
		sgl.addLayoutComponent(t, tt);
		
		
		this.setPreferredSize(new Dimension(910, 610));
		
		this.setOpaque(false);
	}
	

}

Die Werte habe ich wie in dem Bild von mir eingesetzt.
1502,gridjpgZ78C8.jpg


Ich seh gar nichts, also geh ich mal davon aus, dass ich was falsch gemacht hab bzw etwas nicht gemacht habe, was ich hätte machen müssen :) Tausend Dank für deine tolle Arbeit!

Weil du die Div by zero abgefangen hast, hatte ich die Idee alle Werte die ich reingebe zu inkrementieren (Hab ich dann im Konstruktor der Constraints Klasse gemacht - weniger Arbeit), damit keine Nullen mehr dabei sind. Aber das funktioniert leider auch nicht.
Also was mach ich falsch? :)
 

Ebenius

Top Contributor
Du verwendest den LayoutManager falsch. Ruf [c]addLayoutComponent(...)[/c] nicht selbst auf, sondern füge einfach die Komponenten mit [c]this.add(component, constraint);[/c] dem Panel zu (wie Du es mit dem GridBagLayout auch gemacht hast).
Weil du die Div by zero abgefangen hast, hatte ich die Idee alle Werte die ich reingebe zu inkrementieren (Hab ich dann im Konstruktor der Constraints Klasse gemacht - weniger Arbeit), damit keine Nullen mehr dabei sind. Aber das funktioniert leider auch nicht.
Also was mach ich falsch? :)
Ne, da haste was falsch verstanden. Die Division durch null würde passieren, wenn keine Zellen belegt sind. [c]rows[/c] wird ja aus [c]row + rowspan[/c] berechnet (columns entsprechend). [c]rowspan[/c] und [c]colspan[/c] sollten normaler Weise nicht kleiner 1 sein.

Ebenius
 
Zuletzt bearbeitet:
oh man ich bin auch bescheuert :D Danke :)

Ich hatte es jetzt schon anders umgesetzt, werds aber auch nochmal so machen. Besten Dank!


---------

Bringt leider auch nichts. Ich sehe immer noch nichts.. hab ich noch was falsch gemacht?

Ich habs jetzt mit BorderLayout und GridLayout gemacht und die Lücken mit Panels gefüllt deren Größe ich aus den anderen Elementen berechne und das funktioniert einwandfrei :)

Trotzdem wäre deine Variante wesentlich erstrebenswerter, weil einfach cool :D:toll:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
B JavaFX Wo liegt mein Gedankenfehler ??? KeyEvent geht nicht ... AWT, Swing, JavaFX & SWT 8
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
S Oracle's neue Sicherheitseinstellungen zerstoeren mein Applet. Was tun? AWT, Swing, JavaFX & SWT 3
R JavaFX Mein SceneBuilder Projekt AWT, Swing, JavaFX & SWT 3
N LookAndFeel Wie kann ich mein eigenes LookAndFeel machen? AWT, Swing, JavaFX & SWT 6
J Swing Warum wird mein Jpeg nicht angezeigt? AWT, Swing, JavaFX & SWT 4
T SWT Warum ist mein 1.Tree Node selektiert? AWT, Swing, JavaFX & SWT 11
M Warum funktioniert mein Applet nicht? AWT, Swing, JavaFX & SWT 6
P AWT Wie kann mein listener den Inhalt eines anderen Textfelds ändern? AWT, Swing, JavaFX & SWT 10
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
L Mein Kopf dreht sich... Brauche Hilfe beim GUI gestalten AWT, Swing, JavaFX & SWT 10
G LookAndFeel SwingUtilities.updateComponentTreeUI(frame) <- wie heißt mein Frame? AWT, Swing, JavaFX & SWT 5
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
R Japaner koennen mein Programm nicht nutzen..? AWT, Swing, JavaFX & SWT 11
K Mein Informatikprojekt läuft aus dem Ruder Hilfe. F1 ^^ AWT, Swing, JavaFX & SWT 5
J SwingX-Demo - mein Waterloo AWT, Swing, JavaFX & SWT 9
hdi mein layout verählt sich komisch AWT, Swing, JavaFX & SWT 4
M4nuel Warum überlagert JDesktopPane mein JMenuBar? AWT, Swing, JavaFX & SWT 5
C Komme nicht an mein textfeld AWT, Swing, JavaFX & SWT 3
P JRadioButton in Schleife erstellen > wo liegt mein Fehler AWT, Swing, JavaFX & SWT 2
P Ignoriert mein setSize()? AWT, Swing, JavaFX & SWT 2
R JFilechooser: gewählte Datei in mein FileReader übergeben AWT, Swing, JavaFX & SWT 18
C Mein erstes kleines Swing-Projekt - Probleme AWT, Swing, JavaFX & SWT 8
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
V Verstehe mein Druckproblem nicht AWT, Swing, JavaFX & SWT 2
M Wo bleibt mein ScrollPane? AWT, Swing, JavaFX & SWT 3
G Mein JFrame aktualisiert sich nicht richtig AWT, Swing, JavaFX & SWT 3
P Warum braucht mein kleines Programm 20 MB Speicher? AWT, Swing, JavaFX & SWT 13
Q Mein erstes GUI - Probleme AWT, Swing, JavaFX & SWT 2
K mein keyListener scheint Konflict haben mit mouseListener AWT, Swing, JavaFX & SWT 6
E warum wird mein bild nicht angezeigt? AWT, Swing, JavaFX & SWT 6
Z Look&Feel-Wechsel bringt mein GUI durcheinander AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben