Hallo,
ich hab ein Problem, ich bin zur Zeit dabei ein kleines Spiel zu programmieren.
Um das ganze etwas übersichtlicher zu gestalten wollte ich das Spiel in mehrere Klassen zerlegen.
Nun zum Problem:
Der Spieler soll zwischen zwei Spieler arten wählen können per CheckBox. Ist es möglich auch die CheckBox in eine Nebenklasse zu schreiben und sie dann im Hauptprogramm darzustellen sprich:
Code:
public class Client extends JPanel
{
// Inhalt wäre ja denke ich überflüssig.
}
ist mein "Hauptprogramm"
Code:
public class Spielerwahl extends JPanel
{
JCheckBox cb2, cb3;
boolean Spieler1,Spieler2;
public void chose()
{
cb2 = new JCheckBox( "", false );
add(cb2);
cb2.setBounds(10,200,100,20);
ItemListener cb2listener = new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
Spieler1 =! Spieler1;
}
};
cb2.addItemListener( cb3listener );
}
}
Dies ist meine Nebenklasse.
Ist es nun möglich diese Checkboxen im Hauptprogramm darzustellen?
Ich hab es schon mit
Spielerwahl Spieler = new Spielerwahl
Spieler.chose();
oder
Spieler.add(cb2); & Spieler.cb2.setBounds(); probiert aber nichts hat geklappt .
Ohne jetzt gross auf die korrekte Code-Struktur einzugehen:
Du fügst dem JPanel "Spielerwahl" die JComboBox hinzu. Soweit so gut.
Aber meiner Meinung nach, müsstest du jetzt den kompletten JPanel "Spielerwahl" dem "übergeordneten" JPanel "Client" hinzufügen.
Code:
public class Client extends JPanel
{
// ...
Spielerwahl wahl = new Spielerwahl();
add(wahl);
// ...
}
Das war jetzt einfach mal nen "Schuss ins Blaue". Post doch sonst mal deinen kompletten Code, dann kann man sehen, wie und wieso du die Aufteilung machen möchtest...
Also, durch den Befehl
add(wahl);
werden die Checkboxen leider immer noch nicht dargestellt.
Wenn ich dann in meinem Hauptprogramm eingebe,
Code:
public class Client extends JPanel
{
final Spielerwahl Spieler = new Spielerwahl();
Spieler.cb2 = new JCheckBox( "", false );
add(Spieler.cb2);
Spieler.cb2.setBounds(10,200,100,20);
}
werden die Checkboxen natürlich dargestellt, aber so verkürzt sich ja nichts und ich mein Hauptprogramm wird wieder ähnlich voll.
Meine Vorstellung war einfach, dass ich einfach in mein Hauptprogramm später schreibe: "Spieler.chose();"
damit alles im Hauptprogramm gemacht wird, was in der Methode chose() steht.
Code:
//---- Nebenklasse
public class Spielerwahl extends JPanel
{
JCheckBox cb2, cb3;
boolean Spieler1,Spieler2;
public void chose()
{
cb2 = new JCheckBox( "", false );
add(cb2);
cb2.setBounds(10,200,100,20);
ItemListener cb2listener = new ItemListener() {
public void itemStateChanged( ItemEvent e )
{
Spieler1 =! Spieler1;
}
};
cb2.addItemListener( cb3listener );
}
}
Spieler.chose();
damit alles im Hauptprogramm gemacht wird, was in der Methode chose() steht.
Habe das Beispiel jetzt mal nachgebaut und daraus eine ausführbare Version gemacht.
Bei mir ist jetzt halt der Client als "JFrame" definiert, damit ich ein Fenster angezeigt krieg.
Code:
public class Client extends JFrame {
// hier würde man besser mit einem "Getter" arbeiten
// der Einfachheit halber habe ich darauf verzichtet
final Spielerwahl spieler = new Spielerwahl();
Client() {
setSize(200, 200);
initClient();
}
public void initClient() {
// Fügt den JPanel "spieler" dem Fenster (Client) hinzu
add(spieler);
// führt die Methode "choose" des JPanels "spieler" aus
spieler.choose();
}
public static void main(String[] args) {
Client c = new Client();
c.setVisible(true);
}
}
Die Klasse "Spielerwahl" kannst du mit einer Ausnahme so belassen.
Bei mir ist die Methode "choose" mit 2 "o" geschrieben
Hoffe, mein Code hilft dir weiter.
/edit: es spielt übrigens keine Rolle, ob du zuerst den JPanel "spieler" addest oder zuerst die Methode "choose" ausführst...