Spielfeld mit GridBagLayout

starbug

Erfahrenes Mitglied
Hallo allerseits,

ich habe eine Aufgabe bekommen bei der ich ein Tic Tac Toe Spielfeld erstellen soll. Als erstes soll das Spielfeld aus neun Buttons bestehen welche alle die gleiche Grösse haben sollen. Dies soll mithilfe eines GridBagLayouts geschehen. Ich habe hier mal einen Code für einen Button geschrieben aber leider steht der Button nicht oben links wie es sein soll, sondern zentriert und relativ klein. Kann mir jemand sagen was ich falsch mache?

Code:
import java.awt.*;

public class Buttons {
	
	public void buttonFenster()
	{
	
	// Fenster erstellen
	
	Frame bf = new Frame("Tic Tac Toe");
	bf.setSize(500,500);
	
	// Panel erstellen
	
	Panel p = new Panel();
		
	// Buttons erstellen
	
		
	Button b1 = new Button("B");
	GridBagConstraints eigenschaftenB1 = new GridBagConstraints();
	eigenschaftenB1.gridx = 0;
	eigenschaftenB1.gridy = 0;
	eigenschaftenB1.gridheight = 1;
	eigenschaftenB1.gridwidth = 1;
	
	p.add(b1,eigenschaftenB1);
	
	bf.add(p);
	bf.setVisible(true);
	

	}
	
	public static void main(String args[])
	{
		Buttons b = new Buttons();
		b.buttonFenster();
		
		
	}
	
	
}
 
Hi starbug,

was sollen denn die GridBagConstraints ausrichten, wenn du gar kein GridBagLayout gesetzt hast?
+ du musst schon sagen in welche Ecke der Button soll!
+ ...

der Funktionierende Code:
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Button;
import java.awt.Frame;
 
public class ButtonFrame {
    
    public void buttonFenster() {
	    // Fenster erstellen
	    Frame bf = new Frame("Tic Tac Toe");
	    bf.setSize(500, 500);
	    
	    GridBagLayout gbl = new GridBagLayout();
	    bf.setLayout(gbl);
	        
	    // Buttons erstellen    
	    Button b1 = new Button("B");
	    GridBagConstraints eigenschaftenB1 = new GridBagConstraints();
	    eigenschaftenB1.gridx = 0;
	    eigenschaftenB1.gridy = 0;
	    eigenschaftenB1.gridheight = 1;
	    eigenschaftenB1.gridwidth = 1;
	    eigenschaftenB1.anchor = GridBagConstraints.NORTHWEST;
	    eigenschaftenB1.weightx = 1;
	    eigenschaftenB1.weighty = 1;
	    
	    gbl.setConstraints(b1, eigenschaftenB1);
	    bf.add(b1);
	    
	    bf.setVisible(true);
    }
    
    public static void main(String args[]) {
        ButtonFrame b = new ButtonFrame();
        b.buttonFenster(); 
    }
  
}

javaDeveloper2011
 
Also JD's Ansatz ist schon richtig. Du musst auch erstmal das GBL setzen um damit arbeiten zu können. Ich würde hier allerdings GBC.anchestor auf CENTER belassen. Dessweiteren würde ich nicht für jeden Button ein neues GBC erstellen sondern mit einem arbeiten und anstatt bei Container.add() das GBC zu übergeben würde ich es über GBL.setConstraints(Component, GBC) setzen. Natürlich ist nur ein Button dann zentriert. Der Effekt der richtig ausgerichteten Buttons ensteht erst wenn alle 9 Buttons hinzugefügt wurden.
Schau dir in meinem Blog *siehe Signatur* mal das Anlegen des Spielfeldes an. Dort ist genau beschrieben wie man sowas mit einem GBL machen kann.
 
Danke schon mal für die Tipps. Das bedeutet also auch das ich die Buttons direkt ins Fenster setzen kann und nicht erst noh ein Label erstellen muss, richtig?
 
So ich hab das mal getestet und mit 3 Buttons geht das auch noch ganz gut aber wenn ich den 4 einfüge hängt der schon wieder irgendwo in der Luft :). Ich muss doch eigentlich nur die gridx und gridy Werte ändern oder? Hier mal wie ich die 4 Buttons erstellt habe.

Code:
Button b1 = new Button("1");
	GridBagConstraints eigenschaftenB1 = new GridBagConstraints();
	eigenschaftenB1.gridx = 0;
	eigenschaftenB1.gridy = 0;
	eigenschaftenB1.gridheight = 1;
	eigenschaftenB1.gridwidth = 1;
	eigenschaftenB1.anchor = GridBagConstraints.NORTHWEST;
	eigenschaftenB1.weightx = 1;
	eigenschaftenB1.weighty = 1;
	eigenschaftenB1.fill = GridBagConstraints.BOTH;
	
	Button b2 = new Button("2");
	GridBagConstraints eigenschaftenB2 = new GridBagConstraints();
	eigenschaftenB2.gridx = 1;
	eigenschaftenB2.gridy = 0;
	eigenschaftenB2.gridheight = 1;
	eigenschaftenB2.gridwidth = 1;
	eigenschaftenB2.anchor = GridBagConstraints.NORTH;
	eigenschaftenB2.weightx = 1;
	eigenschaftenB2.weighty = 1;
	eigenschaftenB2.fill = GridBagConstraints.BOTH;
	
	Button b3 = new Button("3");
	GridBagConstraints eigenschaftenB3 = new GridBagConstraints();
	eigenschaftenB3.gridx = 2;
	eigenschaftenB3.gridy = 0;
	eigenschaftenB3.gridheight = 1;
	eigenschaftenB3.gridwidth = 1;
	eigenschaftenB3.anchor = GridBagConstraints.NORTHEAST;
	eigenschaftenB3.weightx = 1;
	eigenschaftenB3.weighty = 1;
	eigenschaftenB3.fill = GridBagConstraints.BOTH;
	
	Button b4 = new Button("4");
	GridBagConstraints eigenschaftenB4 = new GridBagConstraints();
	eigenschaftenB3.gridx = 0;
	eigenschaftenB3.gridy = 1;
	eigenschaftenB3.gridheight = 1;
	eigenschaftenB3.gridwidth = 1;
	eigenschaftenB3.anchor = GridBagConstraints.WEST;
	eigenschaftenB3.weightx = 1;
	eigenschaftenB3.weighty = 1;
	eigenschaftenB3.fill = GridBagConstraints.BOTH;
 
Hi,

@thunderwave: du hast völlig recht, nur glaub ich muss das GBL verwendetwerden.
Dies soll mithilfe eines GridBagLayouts geschehen.

@SPiKEe: das mit dem einen GBC hab ich jetzt auch umgesetzt, aber das adden war denk ich mal eh schon richtig.
Java:
gbl.setConstraints(b1, eigenschaftenB1);
bf.add(b1);

@starbug:
die unsaubere Darstellung kam wohl nur weil noch nicht alle Buttons drin waren,
hier nochmal ein Code, dessen Ausgabe auch im Anhang ist:
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Button;
import java.awt.Frame;
 
public class ButtonFrame {
    
    public void buttonFenster() {
	    // Fenster erstellen
	    Frame bf = new Frame("Tic Tac Toe");
	    bf.setSize(500, 500);
	    
	    GridBagLayout gbl = new GridBagLayout();
	    bf.setLayout(gbl);
	    
	    GridBagConstraints eigenschaften = new GridBagConstraints();
	    eigenschaften.gridx = 0;
	    eigenschaften.gridy = 0;
	    eigenschaften.gridheight = 1;
	    eigenschaften.gridwidth = 1;
	    eigenschaften.anchor = GridBagConstraints.NORTHWEST;
	    eigenschaften.weightx = 1;
	    eigenschaften.weighty = 1;
	        
	    // Buttons erstellen    
	    Button b1 = new Button("B1");
	    gbl.setConstraints(b1, eigenschaften);
	    bf.add(b1);
	    
	    Button b2 = new Button("B2");
	    eigenschaften.gridx = 1;
	    eigenschaften.anchor = GridBagConstraints.NORTH;
	    gbl.setConstraints(b2, eigenschaften);
	    bf.add(b2);
	    
	    Button b3 = new Button("B3");gbl.setConstraints(b3, eigenschaften);
	    eigenschaften.gridx = 2;
	    eigenschaften.anchor = GridBagConstraints.NORTHEAST;
	    gbl.setConstraints(b3, eigenschaften);
	    bf.add(b3);
	    
	    Button b4 = new Button("B4");
	    eigenschaften.gridx = 0;
	    eigenschaften.gridy = 1;
	    eigenschaften.anchor = GridBagConstraints.WEST;
	    gbl.setConstraints(b4, eigenschaften);
	    bf.add(b4);
	    
	    Button b5 = new Button("B5");
	    eigenschaften.gridx = 1;
	    eigenschaften.anchor = GridBagConstraints.CENTER;
	    gbl.setConstraints(b5, eigenschaften);
	    bf.add(b5);
	    
	    Button b6 = new Button("B6");
	    eigenschaften.gridx = 2;
	    eigenschaften.anchor = GridBagConstraints.EAST;
	    gbl.setConstraints(b6, eigenschaften);
	    bf.add(b6);
	    
	    Button b7 = new Button("B7");
	    eigenschaften.gridx = 0;
	    eigenschaften.gridy = 2;
	    eigenschaften.anchor = GridBagConstraints.SOUTHWEST;
	    gbl.setConstraints(b7, eigenschaften);
	    bf.add(b7);
	    
	    Button b8 = new Button("B8");
	    eigenschaften.gridx = 1;
	    eigenschaften.anchor = GridBagConstraints.SOUTH;
	    gbl.setConstraints(b8, eigenschaften);
	    bf.add(b8);
	    
	    Button b9 = new Button("B9");
	    eigenschaften.gridx = 2;
	    eigenschaften.anchor = GridBagConstraints.SOUTHEAST;
	    gbl.setConstraints(b9, eigenschaften);
	    bf.add(b9);
	    	    
	    bf.setVisible(true);
    }
    
    public static void main(String args[]) {
        ButtonFrame b = new ButtonFrame();
        b.buttonFenster(); 
    }
  
}

javaDeveloper2011
 

Anhänge

  • screenshot.GIF
    screenshot.GIF
    7,3 KB · Aufrufe: 259
javaDev zeigt wie es richtig geht. *Von meinem Blog abgeschrieben oder selber gewusst ? xD*

Was ich noch zu bemängeln hätte wäre der Konstruktor und das umständliche Zuweisen der GridBagConstraints. Ich persönlich bevorzuge den langen Konstruktor und übergeben diesem meine gewünschten default-Werte. Dadurch erreiche ich das ich auch wirklich nur die Werte manipulieren muss mit denen ich auch wirklich arbeite. Aber das ist eigentlich nur eine Frage des Schreibaufwandes den man sich selbst machen will.

Dem Vorschlag von thunderwave mit dem GridLayout kann ich mich allerdings auch anschließen. Ich selber habe es noch nicht verwendet ... aber aus vielen anderen Codes habe ich gelesen das dies für genau das was du willst dann doch das einfachere ist. Erklärung dazu müsstest du dir aber von den anderen geben lassen oder aus der DOC lesen.
 
Hi,

@SPiKEe: ich hab in nen paar alten Codes von mir nachgeschaut!
wie würdest du den Konstruktor noch verkürzen
(ich setze immer nur die Wert die auch wirklich verändert werden müssen)

Hier jetzt noch ne Lösung mit GridLayout + Einsatz von globalem Array + Konstruktor + ...
(25 statt 88 Zeilen)
Java:
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
 
public class TicTacToeShortCode extends Frame {
	
	private Button[] button;
	
	public TicTacToeShortCode() {
		super("Tic Tac Toe");
		setLayout(new GridLayout(3, 3));
		button = new Button[9];
	    for(int i=0; i<button.length; i++){
	    	button[i] = new Button("B"+(i+1));
	    	add(button[i]);
	    }    	    
	    setVisible(true);
		setSize(500, 500);
	}
    
    public static void main(String args[]) {
        new TicTacToeShortCode();
    }
  
}

Gruß
 

Neue Beiträge

Zurück