tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
549
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    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();
            
            
        }
        
        
    }
     

  2. #2
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Du kannst doch beim GridBagConstraints die Eigenschaften anchor und fill setzten.
     

  3. #3
    Avatar von javaDeveloper2011
    javaDeveloper2011 javaDeveloper2011 ist offline Mitglied Brokat
    Registriert seit
    Feb 2011
    Beiträge
    445
    Blog-Einträge
    5
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    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
     

  4. #4
    SE Tutorials.de Gastzugang
    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.
     

  5. #5
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    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?
     

  6. #6
    starbug starbug ist offline Mitglied Gold
    Registriert seit
    Jan 2011
    Beiträge
    191
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    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;
     

  7. #7
    thunderwave thunderwave ist offline Rookie
    Registriert seit
    Apr 2007
    Beiträge
    6
    Wie wärs mit GridLayout(0,3) oder auch GridLayout(3,3)
    Damit sagst du es gibt pro Zeile 3 Elemente.
    Damit brauchst du einfach nur ein bf.add(button1), etc. machen
    du erhälst immer 3 Buttons pro Zeile.

    http://download.oracle.com/javase/tu...yout/grid.html
     

  8. #8
    Avatar von javaDeveloper2011
    javaDeveloper2011 javaDeveloper2011 ist offline Mitglied Brokat
    Registriert seit
    Feb 2011
    Beiträge
    445
    Blog-Einträge
    5
    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.
    Code java:
    1
    2
    
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    
    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
    Angehängte Grafiken Angehängte Grafiken  
     

  9. #9
    SE Tutorials.de Gastzugang
    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.
     

  10. #10
    Avatar von javaDeveloper2011
    javaDeveloper2011 javaDeveloper2011 ist offline Mitglied Brokat
    Registriert seit
    Feb 2011
    Beiträge
    445
    Blog-Einträge
    5
    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)
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    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ß
     

  11. #11
    SE Tutorials.de Gastzugang
    @ javaDev
    Na wie ich den GBC-Konstruktor verwende steht doch in meinem Blog =).
    Und das einzige was ich an deinem Beispiel noch ändern würde wäre das ganze mit Swing zu machen und nich mittem AWT ... aber ansonsten *bis auf den fehlenden ActionListener* ein kurzes knappes aber vollständiges und funktionierendes Beispiel.
     

Ähnliche Themen

  1. [C++] Snake Klon Spielfeld
    Von Asix im Forum C/C++
    Antworten: 10
    Letzter Beitrag: 04.06.09, 00:06
  2. GridBagLayout
    Von soa im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 09.08.07, 19:30
  3. Spielfeld mit JLabel Array, Null-Pointer-Exception beim Einfügen der JLabels
    Von lucas66 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 13.06.07, 12:25
  4. Antworten: 4
    Letzter Beitrag: 06.05.05, 20:39
  5. Spielfeld Generator
    Von Matthias Kannengiesser im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 28.01.03, 07:21