# JTextField über ein Game



## dark_black_side (22. Aug 2012)

Hey, ich habe mal ein Tutorial "nach" gebaut, allerdings habe ich jetzt auch noch einen Chat (mit Server) eingebaut. Der User kann den Chat schon über die Konsole ansteuern, allerdings sollte er ja Nachrichten aus dem Game raus senden können.
Ich habe hier ein JPanel, in diesen möchte ich, am liebsten über das eigentliche Game, ein JTextField legen.

JPanel: nopaste.info - free nopaste script and service
Bild (vorher): http://www.m-i-u.de/images-i37884bn9ijw.jpg
Bild (gewünscht): http://www.m-i-u.de/images-i37883be3c7y.jpg

Ich bedanke mich schonmal bei allen, die sich das Problem etwas genauer anschauen, solltet ihr genauere Infos benötigen, bekommt ihr sie auch.


----------



## vanny (22. Aug 2012)

Naja, scheint AWT zu sein ... bin ich nich wirklich fit mit aber vielleicht solltest du deinem Panel mal ein TextField adden :autsch:
Schonmal den leichten Weg versucht?

[EDIT]och nö alles murks ... is ja doch ein JPanel :shock: dann solltest du besser die paintComponent(); überschreiben! nicht die paint(); .. der Ratschlag mit dem add(JTextField); bleibt aber bestehen. gn8[/EDIT]


----------



## bERt0r (23. Aug 2012)

Ich würde das ganze in ein JLayeredPane schmeißen und dann auf einem Layer das Game, und auf einem Layer darüber das Textfeld.
PS: Lass das g.dispose(); weg, das musst du nur machen wenn du dir selber ein Graphics Objekt mit create() erstellst.


----------



## dark_black_side (23. Aug 2012)

Also ich habe das ganze in der Hauptklasse dann so gemacht:

```
JLayeredPane pane1 = new JLayeredPane();
add(pane1);
pane1.add(new Renderer(this));
```
Dabei bleibt der Bildschirm allerdings grau/weiß.


----------



## bERt0r (23. Aug 2012)

Bevor du Komponenten benutzt empfiehlt es sich immer zuerst mal anzuschaun wie man die auch benutzt:  How to Use Layered Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Der Sinn eines LayeredPanes ist ja dass man mehrere Ebenen hat. Deshalb sollte man beim add auch noch eine Ebene angeben.


----------



## dark_black_side (23. Aug 2012)

Ich habe das ganze jetzt mit den Angaben versucht, es will aber immernoch nicht so wie ich. Ich muss sagen, dass ich mit Swing noch nicht so viel Erfahrung habe, was mache ich falsch?

```
layeredPane = new JLayeredPane();
		
add(layeredPane);
layeredPane.add(new Renderer(this), new Integer(1));
layeredPane.add(new JTextField(), new Integer(2);
```
Selbst wenn ich das hinzufügen des Textfeldes weglasse, bleibt der Bildschirm grau. Ich habe auch noch versucht, dass add(layeredPane); wegzulassen oder ans Ende zu schreiben.


----------



## dark_black_side (23. Aug 2012)

So, für alle die wissen wollen, wie ich es gelöst habe:

```
layeredPane = new JLayeredPane();
		layeredPane.setPreferredSize(new Dimension(zStartWidth, zStartHeight));
		
		zRenderer = new Renderer(this);
		zRenderer.setBounds(0, 0, zStartWidth, zStartHeight);
		
		zChatfield = new JTextField();
		zChatfield.setBounds(0, zStartHeight-20, 200, 20);
		zChatfield.setEnabled(false);

		layeredPane.add(zRenderer, new Integer(0));
		layeredPane.add(zChatfield, new Integer(1));
		
		add(layeredPane);
```
Danke an bERt0r!


----------



## vanny (23. Aug 2012)

Schade eigentlich, dass du auf meinen Vorschlag nicht eingegangen bist, denn:


```
public class RenderPanel extends JPanel{

	private static final long serialVersionUID = 1L;
	
	public RenderPanel(){
		this.setPreferredSize(new Dimension(120, 50));
		this.add(new JTextField(20));
		
	}

	@Override
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.fillRect(10, 10, 100, 30);
	}
	
	public static void main(String[] args) {
		JFrame fr = new JFrame();
		fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fr.add(new RenderPanel());
		fr.pack();
		fr.setLocationRelativeTo(null);
		
		fr.setVisible(true);
	}
	
}
```

tut´s für deine Zwecke auch.

Gruß Vanny


----------



## dark_black_side (24. Aug 2012)

Ich habe deinen Vorschlag erst nicht verstanden, es wird mir zwar jetzt ersichtlich was du meintest, allerdings finde ich die andere Lösung eleganter, ich glaube auch nicht, dass es einen großen Unterschied macht.
Was meintest du mit der paintComponent()-Methode? Wenn ich das versuche bekomme ich nen Error.


----------



## vanny (24. Aug 2012)

in deinem ersten Post (erster Link) wird in dem Code die paint(); - Methode des JPanels (Swing) überschrieben. An dieser Stellesolltest du lieber die paintComponent(); - Methode überschreiben, weil man das bei Swingkomponenten nunmal so handhaben sollte, siehe mein kleines Beispiel.

Gruß Vanny

PS: Ob die LayeredPane eleganter ist, sei mal dahingestellt. Wenn es heisst, ich will irgendeine Dynamische, skallierbare, verschiebbare, superkrasse Chatkomponente integrieren, dann ist die LayeredPane schon die richtige wahl. Wenn du nur zusätzlich zum Gezeichne auf nem JPanel ein Textfield einfügen willst imho etwas dolle und eben nicht zwingend eleganter... naja auf jeden Fall haste was dazugelent


----------



## dark_black_side (24. Aug 2012)

Jap, die Chatkomponente sollte verschiebbar, skalierbar und dynamisch sein, deshalb denke ich schon, dass das so passt.
Aber ich will doch ein Spiel zeichnen, und nicht nur die Komponenten reinbringen, deshalb funktioniert die paintComponent-Methode doch nicht, oder liege ich da falsch?


----------



## vanny (24. Aug 2012)

Ja, da liegst du falsch.
Wenn du auf einer Swingkomponente zeichnen willst, dann macht man das indem man die paintComponent(); überschreibt. Deine Klasse erbt von JPanel und das ist Swing. Ergo nicht die paint(); sondern die paintComponent(); überschreiben .... steht aber auch schon millionen mal hier im Forum.

Gruß Vanny

[EDIT]





dark_black_side hat gesagt.:


> Jap, die Chatkomponente sollte verschiebbar, skalierbar und dynamisch sein, ...


Stand bisher nirgens im Thread ^^
[/EDIT]


----------

