Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public class GameBoard extends JPanel{
private String face = "img/card1.gif";
private String back = "img/back.gif";
private Card card = new Card(face, back);
private GridLayout grid = new GridLayout(3,1);;
private Player player1 = new Player(1, "Hans");
private Player player2 = new Player(2, "Fritz");
public GameBoard(){
setLayout(grid);
add(player1);
add(card);
add(player2);
}
}
public class Player extends JPanel{
private String face = "img/card1.gif";
private String back = "img/back.gif";
private Card card = new Card(face, back);
public Player(int player_no, String player_name){
add(card);
}
Problem ist, dass die Graphik "card" nur im GameBoard-Panel angezeigt wird, im Player-Panel ist nichts zu sehen.
Kann ich die Panels überhaupt so verschachteln?
Werden im Gameboard beliebig viele Card's gezeichnet, oder nur eine?
Wenn nur eine, würde ich sagen das du das Image in der Card Klasse falsch verwendest.
Was könnte denn passieren, dass es in dem einen Fall angezeigt wird und im anderen nicht? Ich habe die Card zwar für meine eigenen Zwecke angepasst, aber grundsätzlich ist es aus einem Buch. Hier die Klasse (auf das notwendige gekürzt - ich hoffe, die Listener und Zustandvariablen haben nichts damit zu tun...):
Code:
public class Card extends JComponent{
private Image face;
private Image back;
private String faceFile;
private String backFile;
public Card(String faceFile, String backFile){
this.faceFile = faceFile;
this.backFile = backFile;
face = getToolkit().getImage(faceFile);
back = getToolkit().getImage(backFile);
}
public synchronized void paint(Graphics g){
// super.paint(g);
if(turned)
{
g.drawImage(face, 0, 0, this);
System.out.println("Karte ist aufgedeckt !");
}
else{
g.drawImage(back, 0, 0, this);
System.out.println("Karte ist zugedeckt");
}
}
Ich hab das so ausgebessert, geht aber immer noch nicht. Die Karte lässt sich auf dem "GameBoard" nur 1x zeichnen und vom "Player" aus gar nicht, auch wenn ich es insgesamt auf nur eine Ausgabe beschränke..
Da geisterte noch einiges rum aber ich habe nun alles kommentiert, nur noch die Karte da... aber immer noch nichts...
Bei folgendem Minimalversuch klappt es auch nur, wenn die Zeile "setLayout" auskommentiert ist, was mich schon verwundert, das muss doch auch ohne LayoutManager gehen, oder? Das JLabel erscheint so oder so.
Code:
public class GameBoard extends JPanel{
private GridLayout grid;
private String face = "img/card1.gif";
private String back = "img/back.gif";
private Card card = new Card(face, back);
public GameBoard(){
this.setBackground(Color.white);
grid = new GridLayout(2,1,10,10);
//setLayout(grid);
add(new JLabel("HUHU"));
add(card);
}
}
Überschreib mal bei deinen Cards die getPreferredSize() Methode und gib eine feste Größe zurück.
Wenn das dann klappt Gib die Bildgröße zurück. Wenn gar kein Layout verwendest (auch kein Default)
musst du vermutlich die Größe "von Hand setzen"
Wie genau meinst Du das, mit get/setPrefferedSize bin ich noch gar nicht vertraut? Muss ich nur diese leere Methode in Cards aufrufen? Und dann mit set eine Größe setzten?
Mit Panels in denen keine anderen Components enthalten sind, also nur gezeichnet wird, ist die Größe
etwas problematisch. layoutmanager bestimmen die Größe der Components über deren
getPreferredSize() methode. In deinem Fall liefert die (0,0) zurück.
Wenn du sie überschreibst und beispielsweise
Code:
new Dimension(100,100)
zurücklieferst, bekommt die Component diese Größe vom LayoutManager zugewiesen.
Wenn du gar keinen verwendest(ihn also explizit auf null setzt)
musst du glaub ich aber mit setSize() arbeiten. Versuch besser mal beides.
vor das "add" gesetzt, nun kann ich sie sooft zeichnen wie ich will ! Warums nun auf dem GameBoard ohne das funktioniert, wird mir wohl ein Rätsel bleiben, aber auf jeden Fall danke ich euch ganz ganz herzlich, wart eine große Hilfe und endlich kanns weitergehen