# 4 Gewinnt fertig (Kritik, Fragen etc. erwünscht)



## Neolity (26. Jun 2006)

Hallo,

Ich hab vor ein paar Tagen schon einen Thread eröffnet, doch mittlerweile bin ich registriert und habe das Problem gelöst. Ich hab keine Ahnung, wie man einen bereits erstellten Thread hier modifizieren kann und wollte nicht den mit einem Problem überschriebenen Thread (bei dem ich auch keine Antworten erhalten habe => es ist zu erwarten, dass sich für den Thread einfach keiner mehr interessiert  ) zur Vorstellung meines fertigen Programms nutzen. 
Ich hoffe das ist kein Problem, sonst einfach den alten Thread löschen. Ich gelobe schon mal Besserung! 

Das Problem habe ich gelöst, in dem ich aus den 2 Klassen 1 Klasse gemacht habe!

Nun würde ich gerne von euch Kritik aller Art erhalten (natürlich lieber positive als negative  ), da der ganze Code und die gewinn Methode im speziellen wohl noch nicht optimal sind.  Auch über Anregungen wie man so eine Klasse in mehrere Unterklassen unterteilt würde ich mich freuen.

Hier aber erst mal der Code:
neueste Version siehe Post 3! 

P.S.: Wie macht man aus dem Code denn eine ausführbare Datei? Welches Format sollte die Datei haben, damit doe Kompatibilität zu anderen Betriebssystemen von Java nicht verloren geht. Ich hab gelesen ne .exe ist dazu nicht geeignet...


----------



## foobar (26. Jun 2006)

- Die Beschriftungen in der GUI Buton1 - Button-N sind ungünstig gewählt.

- Warum machst du alles static? Das hat nichts mit OOP zu tun.

- Du solltest den Code besser auf mehrere Klassen verteilen z.b. Playground, Player, KI, MainFrame, ControlPanel etc.

- Ich war etwas irrietiert, daß der Computer immer genau dahin gesetzt hat, wo ich zuvor einen Stein hin gesetzt habe, bis ich gemerkt habe, daß es gar keine KI gibt ;-)

- Implementier doch eine simple KI die erstmal per Random einen Stein setzt. Oder du machst daraus eine Client-Server-Anwendung mit der man übers LAN gegeneinander spielen kann.

- Das Spielfeld gefällt mir sehr gut  Durch einschalten des Antialising würden die Spielsteine aber noch schöner aussehen.

- Warum deklarierst du deine Variablen immer vor der For-Schleife anstatt im Schleifenkopf? Brauchst du die Vars auch ausserhalb?

Viele Grüße
foobar


----------



## Neolity (27. Jun 2006)

Hallo,

erstmal vielen Dank für deine Antwort! 

- Was genau ist an den Button Namen ungünstig? Ich hab das ganze Spielfeld jetzt auf diese Buttonlänge angepasst...

- Die static Variablen sind jetzt nicht mehr static. (Ich weiß selber nicht warum ich das gemacht habe, hatte aber in Erinnerung, dass es sonst nicht ging. Was ist daran nicht Objektorientiert? )

- Wie verteile ich den Code denn auf mehrere Klassen? Mein Problem dabei ist, dass ich, wenn ich beispielsweise die ganze Grafik inklusive der actionPerformed Methode auslagere natürlich eine Meldung erhalte, dass Spielzug nicht gefunden wurde etc. Es scheitert etwas an der Synchronisation der Klassen untereinander. Ich hoffe man versteht was ich meine. 

- Ki bzw. Netzwerk fände ich sehr reizvoll, aber von letzterem hab ich nicht im geringsten einen Plan.  Da müsste ich mich erst komplett neu reinlesen. Ist aber denkbar, dass ich das mal machen werde.

- AntiAlising ist angeschaltet (Die Chips sehen jetzt etwas runder aus! Hab die Zeile aber nur aus "Java ist auch eine Insel". So wirklich einen Plan hab ich davon noch nicht was da genau passiert! )

Ansonsten ist die gewinn() Methode nochmal überarbeitet worden, weil es in Ausnahefällen zu Fehlern bei der Gewinnerermittlung gekommen ist. Ich hoffe, das gehört jetzt der Vergangenheit an. Wie ist die eigentlich so allgemein? Ist die zu kompliziert? Die macht ja praktisch den größten Teil meines Programms aus... 

Als nächstes wollte ich eigentlich erstmal Textfelder einbauen, in die Spieler 1 und 2 ihre Namen eingeben können und dass dann nicht mehr Spieler 1 bzw. Spieler 2 gewinnt, sondern XYZ gewinnt auf dem Bildschirm ausgegeben wird!
Dabei bin ich jedoch auf Probleme mit meinen verwendeten Layout Managern gestoßen. Da werd ich morgen nochmal schauen, sonst werd ich hier fragen. 

Hier aber erstmal die neue Version:
rapidshare.de/files/24218302/VierGewinnt.java.html


----------



## Beni (27. Jun 2006)

> - Was genau ist an den Button Namen ungünstig? Ich hab das ganze Spielfeld jetzt auf diese Buttonlänge angepasst...


Ein Array "JButton[] buttons" wäre wohl einfacher: mit ein paar Schleifen kann das meiste (Buttons hinzufügen, Buttons beschriften...) automatisch erledigt werden.



> - Die static Variablen sind jetzt nicht mehr static. (Ich weiß selber nicht warum ich das gemacht habe, hatte aber in Erinnerung, dass es sonst nicht ging. Was ist daran nicht Objektorientiert? )


"Static" sorgt dafür, dass eine Variable unabhängig von einem Objekt ist. Die Variable wird global, und sie existiert nur ein einziges mal im Programm. Aber OOP verlangt das umgekehrte, jede Variable ist abhängig von einem Objekt, und kann dementsprechend mehr als einmal existieren.



> - Wie verteile ich den Code denn auf mehrere Klassen? Mein Problem dabei ist, dass ich, wenn ich beispielsweise die ganze Grafik inklusive der actionPerformed Methode auslagere natürlich eine Meldung erhalte, dass Spielzug nicht gefunden wurde etc. Es scheitert etwas an der Synchronisation der Klassen untereinander. Ich hoffe man versteht was ich meine.


Von einem Objekt zum anderen



> Ansonsten ist die gewinn() Methode nochmal überarbeitet worden, weil es in Ausnahefällen zu Fehlern bei der Gewinnerermittlung gekommen ist. Ich hoffe, das gehört jetzt der Vergangenheit an. Wie ist die eigentlich so allgemein? Ist die zu kompliziert? Die macht ja praktisch den größten Teil meines Programms aus...


Man sagt, dass eine Methode auf einem Bildschirm Platz haben sollte. Also Methoden mit mehr als 100 Zeilen sind zu lang (natürlich gibt es Ausnahmen).

Ansonsten: sieht hübsch aus.


----------



## foobar (27. Jun 2006)

> - Was genau ist an den Button Namen ungünstig? Ich hab das ganze Spielfeld jetzt auf diese Buttonlänge angepasst...


Du könntest z.b. ein nettes Icon wie einen Pfeil der nach unter zeigt auf den Button setzen und in den Tooltip schreibst du dann was passiert, wenn man auf den Button klickt.




> Wie verteile ich den Code denn auf mehrere Klassen? Mein Problem dabei ist, dass ich, wenn ich beispielsweise die ganze Grafik inklusive der actionPerformed Methode auslagere natürlich eine Meldung erhalte, dass Spielzug nicht gefunden wurde etc. Es scheitert etwas an der Synchronisation der Klassen untereinander. Ich hoffe man versteht was ich meine.


Bevor du anfängst zu coden mußt du dir erstmal ein paar Gedanken darüber machen welche Klassen es gibt. Teile den Code doch erstmal in GUI und Geschäftslogik auf, dann wird es schon wesentlich übersichtlicher.


----------



## Neolity (27. Jun 2006)

Hallo, danke für die Antworten schon mal.

Ich hab im Augenblick gar keine Zeit, werd es mir aber auf jeden Fall später genauer anschauen.
Insbesondere Beni`s Link macht einen sehr interessanten Eindruck!


----------



## Leroy42 (27. Jun 2006)

Neolity hat gesagt.:
			
		

> - Ki bzw. Netzwerk fände ich sehr reizvoll



Du könntest als KI-Engine z.B. eines der bekannten Algs wie 
den MiniMax-Algorithmus nehmen. Für den Anfang geht's aber
auch einfacher. Ich hatte in meinem ersten 4-Gewinnt Prog
(in Fortran  :autsch: ) eine selbstgestrickte, abgestufte KI
geschrieben, die doch ziemlich gut abschnitt, in dem ich
jeweils alle Spalten (hintereinander) auf folgendes getestet habe:

1. Kann Computer direkt gewinnen? ==> Spalte nehmen.
2. Kann Spieler direkt gewinnen? ==> Spalten nehmen (Gewinn verhindern).
3. Kann Spieler direkt gewinnen, wenn Compi Spalte i nimmt?
==> Spalte i als für Compi _unerlaubten_ Zug markieren
4. Kann Computer einen direkt folgenden Doppelgewinn ermöglichen?
(also eine Spalte bewirkt, daß der Compi im nächsten Zug an zwei Stellen
eine Gewinnmöglichkeit hat) ==> Spalte nehmen
5. Kann Spieler einen direkt folgenden Doppelgewinn ermöglichen wenn Compi
Spalte i nimmt? (umgekehrt zu 4) ==> Spalte i für Compi sperren.

Das Spielchen kann man beliebig weitertreiben, aber diese 5 Regeln
reichen schon mal aus. Falls keine Regel greift:

n. Wähle Zufallsspalte aus nicht verbotenen Spalten
Falls alle Spalten verboten sind, prahle ein bischen mit der
_Intelligenz_ deines Programms und sag dem Gegner daß
Compi nicht mehr gewinnen kann (falls Spieler nicht allzu blöd)
und frag den Spieler ob er dennoch weiterspielen will


----------



## raven (27. Jun 2006)

Dein Spiel ist nicht schlecht. Aber wenn ich deine Quelltextdatei compaliere bekomme ich 25 Warnings. Haben die was besonderes zu sagen. Spielen kann man es trotzdem.

Hier die warnings:


```
warning: unmappable character for encoding UTF8
Die Klasse enth�lt alle Methoden und die grafische Benutzeroberfl�che f�r ein Vier Gewinnt
               ^
VierGewinnt.java:9: warning: unmappable character for encoding UTF8
Die Klasse enth�lt alle Methoden und die grafische Benutzeroberfl�che f�r ein Vier Gewinnt
                                                                 ^
VierGewinnt.java:9: warning: unmappable character for encoding UTF8
Die Klasse enth�lt alle Methoden und die grafische Benutzeroberfl�che f�r ein Vier Gewinnt
                                                                       ^
VierGewinnt.java:38: warning: unmappable character for encoding UTF8
        - Fenster der Gr��e 1024 * 768
                        ^
VierGewinnt.java:38: warning: unmappable character for encoding UTF8
        - Fenster der Gr��e 1024 * 768
                         ^
VierGewinnt.java:86: warning: unmappable character for encoding UTF8
        Definition von Fuktionalit�ten f�r die Buttons
                                  ^
VierGewinnt.java:86: warning: unmappable character for encoding UTF8
        Definition von Fuktionalit�ten f�r die Buttons
                                        ^
VierGewinnt.java:109: warning: unmappable character for encoding UTF8
                        setTitle("Button1 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:116: warning: unmappable character for encoding UTF8
                        setTitle("Button2 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:123: warning: unmappable character for encoding UTF8
                        setTitle("Button3 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:130: warning: unmappable character for encoding UTF8
                        setTitle("Button4 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:137: warning: unmappable character for encoding UTF8
                        setTitle("Button5 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:144: warning: unmappable character for encoding UTF8
                        setTitle("Button6 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:151: warning: unmappable character for encoding UTF8
                        setTitle("Button7 wurde gedr�ckt");
                                                    ^
VierGewinnt.java:159: warning: unmappable character for encoding UTF8
        F�llt das Spielfeld zuf�llig mit 1 oder 2; diente ausschlie�lich Testzwecken
         ^
VierGewinnt.java:159: warning: unmappable character for encoding UTF8
        F�llt das Spielfeld zuf�llig mit 1 oder 2; diente ausschlie�lich Testzwecken
                               ^
VierGewinnt.java:159: warning: unmappable character for encoding UTF8
        F�llt das Spielfeld zuf�llig mit 1 oder 2; diente ausschlie�lich Testzwecken
                                                                   ^
VierGewinnt.java:198: warning: unmappable character for encoding UTF8
        Methode, die ausgehend von einem ge�nderten Feldeintrag �berpr�ft, ob der entsprechende
                                           ^
VierGewinnt.java:198: warning: unmappable character for encoding UTF8
        Methode, die ausgehend von einem ge�nderten Feldeintrag �berpr�ft, ob der entsprechende
                                                                ^
VierGewinnt.java:198: warning: unmappable character for encoding UTF8
        Methode, die ausgehend von einem ge�nderten Feldeintrag �berpr�ft, ob der entsprechende
                                                                      ^
VierGewinnt.java:401: warning: unmappable character for encoding UTF8
        Methode, die �berpr�ft, ob ein Spielbrett voll ist, d.h. die oberste Reihe komplett besetzt ist
                     ^
VierGewinnt.java:401: warning: unmappable character for encoding UTF8
        Methode, die �berpr�ft, ob ein Spielbrett voll ist, d.h. die oberste Reihe komplett besetzt ist
                           ^
VierGewinnt.java:421: warning: unmappable character for encoding UTF8
        Methode, die die notwendigen �nderungen eines Spielzuges durchf�hrt (Eintragen in das Feld,
                                     ^
VierGewinnt.java:421: warning: unmappable character for encoding UTF8
        Methode, die die notwendigen �nderungen eines Spielzuges durchf�hrt (Eintragen in das Feld,
                                                                       ^
VierGewinnt.java:422: warning: unmappable character for encoding UTF8
        �ndern des aktiven Spielers, Aufruf der Methoden voll() und gewinn())
        ^
25 warnings
```


----------



## Neolity (28. Jun 2006)

Schon mal zu den Warnungen. Er scheint einfach nur davor zu warnen, dass da Umlaute im Text zu finden sind. Ich hab die ä, ö und ü nicht in ae, oe und ue aufgelöst! 
Das kann sein, dass es da unter Umständen Probleme mit gibt. Bei mir gibt es die Warnungen aber nicht...
Scheint ja auch nicht Spielrelevant zu sein, aber kann ich auch mal jetzt irgendwann editieren...


----------



## foobar (28. Jun 2006)

Um solche Probleme zu vermeiden empfiehlt es sich nur englische Bezeichner zu verwenden.


----------



## Neolity (28. Jun 2006)

Die Variablen hatten schon aufgelöste Umlaute. Die Fehlermeldungen traten nur in Kommentaren und Beschriftungen auf!  Da hab ich wohl etwas zu sorglos drauflos getippt.

- Umlaute aus Kommentaren etc. entfernt

- Die Buttons erstelle, benenne und füge ich jetzt nicht mehr einzeln hinzu, sondern erledige das mit einem JButton Array und einer Schleife. "Problem" dabei ist, dass das Feld mit 0 beginnt und die Buttons nun von 0 aufsteigend benannt werden.  Bestimmt leicht zu korrigieren, aber ich komme nicht drauf. Ich will ja auch nicht in der Variablen der Schleife rumfummeln, zumal wohl auch nichts bringen wird.

- Jetzt zu meinem größten Problem. Wie ihr angemerkt habt und mir selber ja auch klar ist, muss der Code auf mehr als eine Klasse verteilt werden. Dabei ist allerdings das Problem, dass in der einen Klasse auf Variablen zugegriffen wird, die ich nur in der anderen Klasse definiert habe. Wahrscheinlich ist das ein elementarer Fehler, der wohl auf meiner Unkenntnis bzw. Unerfahrenheit beruht.  :roll:  
Um zu verdeutlichen was ich meine, habe ich das Programm mit den oben beschriebenen Verbesserungen hochgeladen.
Einmal in einer lauffähigen Version, ohne Fehlermeldungen, allerdings auch mit dem ganzen Code in einer Klasse und einmal mit dem Code verteilt auf 2 Klassen VierGewinnt und VierGewinntGrafik, der allerdings nicht lauffähig ist. So hab ich mir das Verteilen in etwa vorgestellt, aber was läuft da jetzt falsch?
Selbst wenn ich die Variablen neu deklariere, dann findet der Compiler die Methode Spielzug nicht. 
Den Link von Bruni hab ich mir zwar angesehen, aber das Problem ist, dass ich da nicht ganz durchsteige und mir auch nicht sicher bin, ob das mein Problem beschreibt. 

Würde mich freuen, wenn jemand den ganzen Kram liest und mir helfen kann! 

Hier aber erstmal der Code:
Aufgeteilt auf 2 Klassen:
	http://rapidshare.de/files/24393546/VierGewinnt.java.html
und
http://rapidshare.de/files/24393641/VierGewinntGrafik.java.html

1 Klasse:
	http://rapidshare.de/files/24393729/VierGewinnt.java.html


----------



## foobar (28. Jun 2006)

> Bestimmt leicht zu korrigieren, aber ich komme nicht drauf. Ich will ja auch nicht in der Variablen der Schleife rumfummeln, zumal wohl auch nichts bringen wird.


ist doch ganz einfach du mußt einfach bei den Bezeichnern immer 1 dazu zählen.

```
for (int i=0; i < AMOUNT_BUTTONS; i++)
{
   lstButtons = new JButton("Spalte "+i+1);
  ....
}
```


----------



## Neolity (28. Jun 2006)

Nein, ist leider nicht so einfach, dann schreibt der hinter den Wert von i zusätzlich noch eine 1 bei jedem Button, also dann "Knopf 01", "Knopf 11", "Knopf 21" usw. 
Der addiert die 1 nicht zum i dazu, sondern fügt sie an den String an.


----------



## Beni (28. Jun 2006)

Füg noch ein paar Klammern ein... (+ werden von links nach rechts aufgelöst, und bei dir sollte zuerst das rechte + berechnet werden).


----------



## Neolity (28. Jun 2006)

Vielen Dank, jetzt funktioniert es! 

Wie ist das denn mit der Verteilung auf mehrere Klassen?  ???:L


----------



## Neolity (29. Jun 2006)

So, fast 3 Stunden und einige Versuche später, bin ich jetzt so weit, dass ich zumindest beim kompilieren keine Fehlermeldungen mehr habe, aber dafür läuft das Spiel auch noch nicht so wie es soll!  Die Buttons haben keine Funktion mehr und Chips werden auch nicht mehr gezeichnet... 
Außerdem hab ich mir hier das von Beni gepostete Tutorial nochmal angesehen und mir jeden Schritt selber erläutert. 
Aber seht selber was bei rumgekommen ist. Vielleicht kann man jetzt aus der neuen Version in Kombination mit der alten eher sehen was ich für einen Mist mache...

VierGewinnt.java:
http://rapidshare.de/files/24418382/VierGewinnt.java.html]	rapidshare.de/files/24418382/VierGewinnt.java.html[/url]

VierGewinntGrafik.java:
rapidshare.de/files/24418424/VierGewinntGrafik.java.html


----------



## foobar (29. Jun 2006)

@Neolity Warum stehen deine Klassen in einer Is-A-Beziehung? Ich würde das durch Aggregation lösen.

- Du brauchst eine Hauptklasse die deine Anwendung startet und alle anderen Klassen zusammen hält.

-  Dann brauchst du eine Klasse die das Spielfeld darstellt, diese Klasse übergibst du eine Liste von Beans, die den aktuellen Spielstand darstellen. Alternativ kannst du auch ein Array verwenden.

- Die Logik arbeitet auch auf der Liste von Beans und informiert die Gui-Klasse, darüber ob ein Spieler gewonnen hat etc.

Hier ist ein grober Entwurf:


```
public class Starter extends JFrame
{
    private PlayGround playGround;
    pirvate State[][] state;
    public Starter()
   {
      this.state = new State[8][8];
      // State initialisieren, in diesem Array wird der Spielstand gespeichert
      this.playGround = new PlayGround();
     // Playground ist die grafische Darstellung des Spielstandes
     
... Frame inistaliiseren
   }

    public static void main(String[] args)
    {
      new Starter();
    }
}
```

PlayGround.java

```
public class Playground extends JComponent
{
   public PlayGroud(State[][] state)
   {
      this.state = state; 
   }

   public void paintComponent(Graphics g)
  {
      // ueber das State-Array iterieren und anhand der Werte das Spielfeld zeichnen
  
  }
}
```

State.java

```
public class State
{
   
   
   public State()
  {
     // State ist eine dumme Klasse, die den Zustand eines der Felder im Spielfeld darstellt,
// also nicht besetzt, von Player1 besetzt und von Player2 besetzt. Das kann in Java1.5 durch ein Enum 
//gelöst werden oder in Java1.4 durch das Typesafe-Enum-Pattern oder ganz altmodisch durch int-Konstanten.    
   }
 
}
```

HTH

Viele Grüße
foobar


----------



## Neolity (28. Jul 2006)

So, lange ist das letzte Update her, aber nach einigen Problemen, die zum Glück im andern Thread nun endlich gelöst wurden (Vielen Dank nochmal!  ), gibt es hier mal eine neue Version:

- Verteilen der einen Klasse auf mehrere Unterklassen (Das hat Nerven ohne Ende gekostet und hätte ohne die Hilfe einiger Leute nie geklappt!!!  Dafür hab ich es jetzt aber auch verstanden!)

- Tooltips hinzugefügt:
Lässt man den Mauszeiger kurz über einem Button, so erhält man eine kurze Meldung, was ein Druck auf diesen Button bewirkt. In der Art "Hier klicken, um Chip in dieser Reihe zu setzen" etc.

- Shortcuts eingefügt:
Es ist nun möglich durch alt + entsprechende Zahl einen Chip in der jeweiligen Spalte zu setzen und durch alt + n wird das Spiel neu gestartet.

- Kurze Spielerklärung am linken Rand eingefügt.

- Zuordnung welcher Spieler welche Farbe hat, ist nun am linken Rand abzulesen.

- Bisher war es möglich, dass ein Spieler auf einen Button drücken konnte, obwohl die darunter liegende Spalte bereits komplett mit Chips gefüllt war. Dabei wurde dem Spieler der Spielzug beendet, d.h. nach dem Fehldrücken, das keinen Effekt hatte, war der andere Spieler dran. Ist eine Spalte voll, so wird der entsprechende Button nun mit setEnabled "ausgeschaltet".

Obwohl doch jetzt alles sehr rund läuft, hab ich noch einige Fragen:  

- Zu den Tooltips:
Wenn ich den Mauszeiger einen kurzen Moment auf einem Button lasse, dann erscheint ganz normal der Tooltip. Allerdings habe ich nach dem wegbewegen den Umriss des Tooltips im Fenster, der einen (zugegebenermaßen) rel. kleinen Teil meines Spielbrettes "übermalt". Nach dem Drücken eines Buttons, sprich einem repaint verschwindet der Umriß wieder. Das ist jetzt nicht wirklich dramatisch, aber mich würde interessieren, ob es eine Möglichkeit gibt das zu vermeiden. (ist ein bißchen schwierig das zu beschreiben, aber wenn man es ausprobiert, dann wird jeder verstehen, was ich meine).

- Zu den Shortcuts:
Bisher ist es mir nur möglich durch alt + zahl einen Button anzusprechen. Mich würde interessieren, ob man nicht vielleicht irgendwie direkt durch drücken von einer zahl den entsprechenden Button ansprechen kann?

- Textfelder:
Ich wollte jetzt noch Textfelder einbauen, so dass die Spieler ihre Namen eingeben können. Die Namen sollen dann auch anstelle des neutralen Spieler 1 oder 2 beim gewinnen auftauchen. Mein Problem liegt jedoch viel früher. Mein Fenster hat ein BorderLayout und ich wollte die Textfenster zum Neustart-Button nach BorderLayout.West setzen. Dabei ist jedoch das Problem, dass nur entweder der Neustart Button oder mein Textfenster sichtbar ist. 
Es ist immer die Komponente sichtbar, die zuletzt dem BorderLayout.West zugeordnet wird. 

So, ein langer Text geht zu Ende. Hier also noch die Datein, wie immer bei Rapidshare hochgeladen. Durch Starten der VierGewinntStarten.java wird das gesamte Vier Gewinnt gestartet. Die beiden Dateien, die die Funktionalitäten enthalten, sind im Unterordner viergewinnt zu finden.

Link:
rapidshare.de/files/27265388/Neu_WinRAR-Archiv.rar.html

In der nächsten Zeit wollte ich mich mal, außer mit den 3 ausstehenden Fragen, noch etwas mit einer kleinen Ki beschäftigen. Mal schauen, ob das was wird!


----------



## Leroy42 (28. Jul 2006)

_- Textfelder_

Du kannst beliebig komplexe Bildschirmmasken(layouts) durch 
ineinanderschachteln der Grundlayouts (Border, Flow, Grid, ...)
erstellen.

Probier einfach mal ein bischen herum.


----------



## Neolity (28. Jul 2006)

Jo, das weiß ich. Problem ist nur, dass im BorderLayout.West nur eine einzige Komponente angezeigt wird. Egal wieviele und wie komplexe ich hinzugefügt habe.  :cry:


----------



## Leroy42 (28. Jul 2006)

Ich glaube du hast nicht ganz verstanden was ich meine.


```
JPanel west = new JPanel(new BoderLayout());

JPanel westN = new FlowLayout(FlowLayout.LEFT);
westN.add(new JButton("1"));
westN.add(new JButton("2"));
westN.add(new JButton("3"));

west.add(westN, BorderLayout.NORTH);

JPanel westE = new GridLayout(0, 1);
westE.add(new JButton("A"));
westE.add(new JButton("B"));
westE.add(new JButton("C"));

west.add(westE, BorderLayout.EAST);

add(west, BorderLayout.WEST);
```


----------



## Neolity (29. Jul 2006)

Gibt es keinen LayoutManager, mit dem ich 3 Elemente untereinander anordnen kann, ohne, dass diese ihre Größe verändern. Ich habe schon ein GridLayout(3,1) probiert, dabei werden die 3 Elemente jedoch auf die volle Höhe des BorderLayout.West gestreckt. Kann man das nicht irgendwie umgehen?


----------



## foobar (29. Jul 2006)

> Gibt es keinen LayoutManager, mit dem ich 3 Elemente untereinander anordnen kann, ohne, dass diese ihre Größe verändern. Ich habe schon ein GridLayout(3,1) probiert, dabei werden die 3 Elemente jedoch auf die volle Höhe des BorderLayout.West gestreckt. Kann man das nicht irgendwie umgehen?


Boxlayout, TableLayout etc. oder auch ein Gridbaglayout beim dem sich die Komponenten nicht ausbreiten und dann über setSize() die Größe festgesetzt wird.


----------



## Leroy42 (29. Jul 2006)

Neolity hat gesagt.:
			
		

> Gibt es keinen LayoutManager, mit dem ich 3 Elemente untereinander anordnen kann, ohne, dass diese ihre Größe verändern. Ich habe schon ein GridLayout(3,1) probiert, dabei werden die 3 Elemente jedoch auf die volle Höhe des BorderLayout.West gestreckt. Kann man das nicht irgendwie umgehen?



Sicher! 

Wenn du dein GridLayout(3,1) direkt in den West(Ost) Bereiche eines Borderlayouts packst,
wächst/schrumpft dieser vertikal und verteilt seine Gesamtgröße auf alle 3 Komponenten.

Wenn du es allerdings zuvor in ein FlowLayout _zwischenpackst_ und dieses FlowLayout
dann in den West/Ost-Bereich ist hier nichts mehr am wachsen/schrumpfen. Das liegt daran,
daß ein FlowLayout seine Elemente einfach nur _der Reihe nach_ in der von Ihnen gewünschten
Größe anordnet; zusätzlicher Raum wird *nicht* auf die Elemente verteilt.

Zugegeben: Richtiges Layout-Management ist beinahe eine Wissenschaft für sich
und nicht von heute auf morgen zu meistern; nicht umsonst gab es immer wieder
neue LayoutManager wie Box-, Table, Spring-, ... Layout

Hier mal ein kleines Programm um den Unterschied zu zeigen:


```
import java.awt.*;
import javax.swing.*;

public class Statisch extends JFrame {
	public Statisch(boolean statisch) {
		add(new JLabel("North"), BorderLayout.NORTH);
		add(new JLabel("South"), BorderLayout.SOUTH);
		add(new JLabel("West"), BorderLayout.WEST);

		JPanel east1 = new JPanel();		// Default-Layout == FlowLayout
		JPanel east2 = new JPanel(new GridLayout(0, 1)); // 1 Spalte, bel. viele Zeilen
		east2.add(new JButton("eins"));
		east2.add(new JButton("zwei"));
		east2.add(new JButton("drei"));
		east2.add(new JButton("vier"));
		if (statisch) {
			east1.add(east2);
			add(east1, BorderLayout.EAST);
		} else {
			add(east2, BorderLayout.EAST);
		}
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		pack();
		setLocation(statisch?200:400, 200);
		setVisible(true);
	}
	public static void main(String[] args) {
		Toolkit.getDefaultToolkit().setDynamicLayout(true);
		new Statisch(true);
		new Statisch(false);
	}
}
```


----------



## Neolity (29. Jul 2006)

Hier mal die Code Sequenz, wie ich das im Augenblick mache:


```
private JPanel west = new JPanel();
	private JTextField spieler1 = new JTextField("Spieler 1");
	private JTextField spieler2 = new JTextField("Spieler 2");
	private JButton start = new JButton("NEUSTART");

	public VierGewinntGrafik(final VierGewinnt spiel)
	{
		super("Vier Gewinnt Fenster");
		this.spiel = spiel;
		setSize(1024,768);
		setLayout(new BorderLayout());
		WindowListener listener = new WindowAdapter()
		{
			public void WindowClosing(WindowEvent we)
			{
				System.exit(0);
			}
		};
                ImageIcon icon = new ImageIcon("Pfeil.png");

		west.setLayout(new BoxLayout(west, BoxLayout.Y_AXIS));

		start.setToolTipText("Zum Neustarten des Spiels klicken sie hier");
		start.setMnemonic(KeyEvent.VK_N);
		west.add(start);
		spieler1.setPreferredSize(new Dimension(50, 15));
		spieler2.setPreferredSize(new Dimension(50, 15));
		west.add(spieler1);
		west.add(spieler2);
		add(west, BorderLayout.WEST);
		start.addActionListener(this);
```

(Der Konstruktor geht noch weiter, deshalb keine } am Ende.)

Problem ist, dass der start Button zwar in der korrekten Größe angezeigt wird, aber die beiden Textfelder extrem vergrößert...


----------



## Leroy42 (29. Jul 2006)

Warum definierst du dir einen WindowListener dessen neue Methoden
von niemandem jemals benutzt werden können?  :shock: 



> WindowListener listener = new WindowAdapter()
> {
> public void *W*indowClosing(WindowEvent we)
> {
> ...


 :bae: 


Mit dem BoxLayout hab' ich's bisher noch nie getrieben.

==> keine Ahnung wie du deinen Code umbasteln kannst


----------



## Neolity (1. Aug 2006)

Um das Problem nochmal zu präzisieren, weil ich gerade wieder daran sitze:

Gibt es einen LayoutManager, der Elemente untereinander anordnet, aber die Größe der Komponenten nicht verändert?


----------



## Leroy42 (1. Aug 2006)

Neolity hat gesagt.:
			
		

> Gibt es einen LayoutManager, der Elemente untereinander anordnet, aber die Größe der Komponenten nicht verändert?



Nimm ein GridLayout(0, 1) und packe es in ein FlowLayout.

Was ist denn daran so schwer? Beispielcode hab' ich bereits gepostet.


----------



## moormaster (1. Aug 2006)

Wurde in Java 1.5 irgendwas verändert, dass man im JFrame setLayout() anstatt getContentPane().setLayout() verwenden darf?

Weil ich benutze 1.4 und mein jre hat sich über die Verwendung von setLayout() in VierGewinntGrafik beschwert sowie die Verwendung von getContentPane().setLayout() empfohlen.


----------



## Illuvatar (1. Aug 2006)

moormaster hat gesagt.:
			
		

> Wurde in Java 1.5 irgendwas verändert, dass man im JFrame setLayout() anstatt getContentPane().setLayout() verwenden darf?



Kurz gesagt: Ja


----------

