# Poker - grundlegende frage zu paint()



## sockeqwe (8. Apr 2007)

Hi, ich will so ein Texas Holdem Poker über netzwerk realisieren ...
Ich habe alles als Grafiken (jpg, gif), also den Tisch, karten, spieler usw. 

Ich habe aber so ein grundlegendes problem, das ich nicht ganz verstehe, wie ich das mit der public void paint funktion von JFrame realisieren soll ...

Ich Zeichne sachen bzw. Bilder mit Graphics, aber die werden dann eben nur auch auf das JFrame gezeichnet, wenn die paint funktion ausgeführt wird ...

Und da eben weiß ich nicht wie das ganze "Zeichen-Problem" anzugehen ...

Kann mir jemand erklären wie ich das so ganz grundsätzlich angehen bzw. mein Programm struckturieren sollte?

Danke jetzt schon mal!


----------



## Marco13 (8. Apr 2007)

Erstmal ist es meistens sinnvoll, das Zeichnen in einer eigenen Klasse zu machen, die JPanel abgeleitet ist ("der Frame hat beim Zeichnen schon genug zu tun"). Ansonsten findet sich dazu ein Tutorial hier:
http://www.java-forum.org/de/viewtopic.php?t=46550&highlight=

Bitte beachten: Der *Richtige Ansatz* fängt irgendwo in der Mitte des Tutorials an.

Wenn noch konkretere Fragen sind, sag bescheid.


----------



## Wildcard (8. Apr 2007)

Marco13 hat gesagt.:
			
		

> Ansonsten findet sich dazu ein Tutorial hier:
> http://www.java-forum.org/de/viewtopic.php?t=46550&highlight=
> 
> Bitte beachten: Der *Richtige Ansatz* fängt irgendwo in der Mitte des Tutorials an.


hmm, das sollte ich mal langsam ferig machen


----------



## sockeqwe (8. Apr 2007)

Also hab ich das ganze total falsch angefangen: 

```
import java.awt.*;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Fenster extends JFrame {

	public int w,h;
	public Image img_tisch;
	public JPanel video, controll;
	public JButton b_neuertisch, b_connect;
	
	
	public Fenster() {
	super("Net Poker");
	w=800;
	h=664;
	this.setSize(w,h);
	this.setVisible(true);
	
	Dimension d=this.getToolkit().getScreenSize();
	
	this.setLocation((d.width-w)/2,(d.height-h)/2);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	this.setLayout(new BorderLayout());
	
	Image ico=this.getToolkit().getImage("graphics/chips/5.jpg");
	this.setIconImage(ico);
	
	// Panels
	video=new JPanel();
	controll=new JPanel();
	
	controll.setLayout(new GridLayout(1,2));
	
	
	// Bilder laden
	img_tisch=this.getToolkit().getImage("tisch.jpg");
	
	// Buttons
	b_neuertisch=new JButton("Neuer Tisch");
	b_neuertisch.setBounds(200, 500, 100, 30);
	b_neuertisch.setVisible(true);
	
	b_connect = new JButton ("zu Tisch verbinden");
	b_neuertisch.setBounds(400, 500, 100, 30);
	b_neuertisch.setVisible(true);
	
	controll.add(b_neuertisch);
	controll.add(b_connect);
	
	
	
	this.add(video, BorderLayout.CENTER);
	this.add(controll, BorderLayout.SOUTH);
	
	
	
	}
	
	public void drawtisch()
	{
		//this.getGraphics().drawRect(10,50,100,100);
		video.getGraphics().drawImage(img_tisch, 0,0, video);
		
	}
	public void drawcontroll()
	{
	
	}
	
	public void realrepaint()
	{
		this.setSize(w-1, h-1);
		this.setSize(w, h);
		this.repaint();
		
		
		
	}
	public void paint(Graphics g)
	{
		drawtisch();
		
	}

	
}
```


Ich hab aber das Tutorial von WildCard nicht ganz verstanden ...
Wo sollte ich den da das Image laden, bzw. hab ich das Problem das unterschiedlich 1-10 Spieler am Tisch sitzen, also auch 1-10 Images geladen werden müssen und angezeigt werden sollen ...


----------



## Wildcard (8. Apr 2007)

Am einfachsten in dem man JLabels verwendet:

```
JLabel label = new JLabel(new ImageIcon("pfad/zum/Bild.png");
```
Von getGraphics musst du unbedingt weg kommen, das ist der falsche Weg.


----------



## sockeqwe (8. Apr 2007)

ok, jetzt hab ichs mal so gemacht:

```
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JComponent;


public class Video extends JComponent  {
	
	public Image img_tisch, img_spieler1, img_spieler2, img_spieler3, img_spieler4, img_spieler5, img_spieler6, img_spieler7, img_spieler8, img_spieler9, img_spieler10;
	public boolean player1, player2,player3,player4,player5,player6,player7,player8,player9,player10;
	
	public Video(Image tisch, Image p1,Image p2,Image p3,Image p4,Image p5,Image p6,Image p7,Image p8,Image p9,Image p10)
	{
		img_tisch=tisch;
		img_spieler1=p1;
		img_spieler2=p2;
		img_spieler3=p3;
		img_spieler4=p4;
		img_spieler5=p5;
		img_spieler6=p6;
		img_spieler7=p7;
		img_spieler8=p8;
		img_spieler9=p9;
		img_spieler10=p10;
		
		player1=false;
		player2=false;
		player3=false;
		player4=false;
		player5=false;
		player6=false;
		player7=false;
		player8=false;
		player9=false;
		player10=false;
		
		this.setSize(800, 443);
	}
	
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.drawImage(img_tisch,0,0,this);
		
		if (player1) g.drawImage(img_spieler1,0,50,this);
		if (player2) g.drawImage(img_spieler2,146,0,this);
		if (player3) g.drawImage(img_spieler3,330,0,this);
		if (player4) g.drawImage(img_spieler4,480,0,this);
		if (player5) g.drawImage(img_spieler5,650,35,this);
		if (player6) g.drawImage(img_spieler6,630,223,this);
		if (player7) g.drawImage(img_spieler7,450,330,this);
		if (player8) g.drawImage(img_spieler8,300,328,this);
		if (player9) g.drawImage(img_spieler9,150,324,this);
		if (player10) g.drawImage(img_spieler10,13,230,this);
		}
	


}
```
eine eigene Classe wo es meinen Tisch und die Spieler zeichnet,
einziges problem: es Braucht ziemlich lange, bis es alle gezeichnet hat, d.h. es sieht nicht so schön aus ...
erster, zeichnets die Spielerbilder, dann erst den Tisch ... sieht halt nicht so schön aus, kann man da was machen?

Was sagt ihr zu den Lösungsansatz? Gut so?


----------



## sockeqwe (8. Apr 2007)

Was ich jetzt aber auch nicht verstehe, ist folgendes:


```
import java.awt.*;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Fenster extends JFrame {

	public int w,h;
	public Image img_tisch;
	public JPanel controll, controllbuttons, controllchat;
	public Video video;
	public JButton b_neuertisch, b_connect, b_setzen,b_checken,b_mitgehen, b_passen, b_beenden;
	
	
	public Fenster() {
	super("Net Poker");
	w=800;
	h=664;
	this.setSize(w,h);
	this.setVisible(true);
	
	Dimension d=this.getToolkit().getScreenSize();
	
	this.setLocation((d.width-w)/2,(d.height-h)/2);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	this.setLayout(new BorderLayout());
	
	Image ico=this.getToolkit().getImage("graphics/chips/5.jpg");
	this.setIconImage(ico);
	
	// Panel
	//video=new JPanel();
	controll=new JPanel();
	controll.setLayout(new BorderLayout());
	
	controllbuttons=new JPanel();
	controllbuttons.setLayout(new GridLayout(2,1));
	controllchat=new JPanel();
	
	
	
	// Bilder laden
	Image img1,img2,img3,img4,img5,img6,img7,img8,img9,img10;
	img_tisch=this.getToolkit().getImage("tisch.jpg");
	img1=this.getToolkit().getImage("graphics/players/player1.gif");
	img2=this.getToolkit().getImage("graphics/players/player2.gif");
	img3=this.getToolkit().getImage("graphics/players/player3.gif");
	img4=this.getToolkit().getImage("graphics/players/player4.gif");
	img5=this.getToolkit().getImage("graphics/players/player5.gif");
	img6=this.getToolkit().getImage("graphics/players/player6.gif");
	img7=this.getToolkit().getImage("graphics/players/player7.gif");
	img8=this.getToolkit().getImage("graphics/players/player8.gif");
	img9=this.getToolkit().getImage("graphics/players/player9.gif");
	img10=this.getToolkit().getImage("graphics/players/player10.gif");
	
	// Video 
	video=new Video(img_tisch,img1,img2,img3,img4,img5,img6,img7,img8,img9,img10);
	
	
	
	// Buttons
	b_neuertisch=new JButton("Neuer Tisch");
	b_neuertisch.setBounds(200, 500, 100, 30);
	b_neuertisch.setVisible(true);
	
	b_connect = new JButton ("zu Tisch verbinden");
	b_neuertisch.setBounds(400, 500, 100, 30);
	b_neuertisch.setVisible(true);
	
	controllbuttons.add(b_neuertisch);
	controllbuttons.add(b_connect);
	
	controll.add(controllbuttons, BorderLayout.CENTER);
	controll.add(controllchat, BorderLayout.EAST);
	
	
	controllbuttons.setVisible(true);
	controllchat.setVisible(true);
	controll.setVisible(true);
	
	this.add(video, BorderLayout.CENTER);
	this.add(controll, BorderLayout.SOUTH);
	
	
	
	}
	
	public void drawtisch()
	{
		//this.getGraphics().drawRect(10,50,100,100);
	//	video.getGraphics().drawImage(img_tisch, 0,0, video);
		
	}
	public void drawcontroll()
	{
	
	}
	
	public void realrepaint()
	{
		this.setSize(w-1, h-1);
		this.setSize(w, h);
		this.repaint();
		
		
		
	}
		
}
```

Es zeigt mir beim starten, die Grafiken also "video" an, jedoch aber nicht die Buttons, die auf dem JPanel "controll" liegen, die werden erst beim nächsten repaint (wenn ich die fenstergröße ändere) dargestellt. Warum das? Was kann ich dagegen tun?


----------



## Marco13 (9. Apr 2007)

Die Zeile 
this.setVisible(true);
sollte die LETZTE Zeile im Konstruktor sein. (Eigentlich mus das in einem Thread erstellt werden, aber das ist i.a. nicht sooo wichtig). 

Das realrepaint ist ein netter Versuch, aber sollte jetzt raus.

Die Video-Klasse ist ... nicht schön. Statt der Variablen player1, player2, ... player3412 solltest du lieber Arrays verwenden. 

```
private static final int NUM_PLAYERS = 10;

Image images[] = new Image[NUM_PLAYERS];
for (int i=0; i<NUM_PLAYERS; i++)
{
   image[i] = this.getToolkit().getImage("graphics/players/player"+(i+1)+".gif");
}
```

Warum du die Bilder im Konstruktor übergibst, und nicht einfach innerhalb der Video-Klasse lädst, weiß ich grad auch nicht.


----------



## Wildcard (9. Apr 2007)

Ausserdem solltest du wenn du über das Toolkit Bilder lädst auch einen MediaTracker verwenden oder auf das Toolkit verzichten und ImageIO oder ImageIcons nehmen.


----------



## sockeqwe (9. Apr 2007)

Danke erstmal für eure hilfe, ja das mit this.setvisible() am ende hats tatsächlich ausgemacht, muss ich mir merken! Danke.

Ja werd ich auf Array umstellen die Video Klasse.

Ich habe aber noch eine Frage zu meiner Video Klasse,
zurzeit sind ja meine Grafiken keine Objekte sondern einfach mit Graphics gezeichnet, also kann ich nicht jedes Bild einzeln mit setVisible ansprechen. Das könnte ich wenn ich JLabels (new ImagIcon()) verwende oder? Dann muss ich meine Video Klasse aber von JPanel ableiten? oder funktioniert das auch mit JComponent, also ist JComponent auch ein Kontainer?


----------



## Marco13 (9. Apr 2007)

Dass JComponent auch ein Container ist, kannst du in der API nachlesen. Ansonsten kannst du die einzelnen bilder ja mit den boolschen Variablen player1, player2... bzw. mit einem Array 
boolean playerImageVisible[] 
ein- und ausschalten. Allerdings solltest du bei Gelegenheit mal planen, wie dein Programm aussehen soll, wenn es fertig ist....


----------

