"Graphik" JPanels übereinander legen

LukLuk

Aktives Mitglied
Heho Zusammen,
Mein Problem ist, dass wenn ich auf ein JPanel (das eine Graphik besitzt) ein weiteres JPanel mit add hinzufüge, das zweite JPanel nicht zu sehen ist. Ich wollte mal fragen ob das überhaupt möglich ist.

Hier noch mein Code

Java:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Layout extends Panels {
	private Panels[] felder;
	public JTextField texteingabe;
	public JButton nextRound;
	public JPanel north;
	public Panels zeiger,gras,auto;
	private int i;
	private boolean set;
	private BufferedImage ganzesBild;
	private BufferedImage bild;

	public Layout() {// Default-Konsturktor-Beginn

		Tasteneingebae tEingabe = new Tasteneingebae();// Erstellung des
														// KeyListeners
		setLayout(new GridLayout(10, 10));// Layout wird festgelegt
		felder = new Panels[100];// Felder werden erzeugt
		for (i = 0; i < felder.length; i++) {
			felder[i] = new Panels();	
			add(felder[i]);
		}

		for (i = 0; i < felder.length; i++) {
			if (felder[i] == null) {
				System.out.println("null-Fehler " + i);
			}
		}
//---Panels für die Graphiken-----
		zeiger=new Panels();//initalisierung
		gras=new Panels();
		auto=new Panels();
		
		zeiger.setLayout(new GridLayout(0,1));//LayoutManager festlegen
		gras.setLayout(new GridLayout(0,1));
		auto.setLayout(new GridLayout(0,1));
		
//--Panels für Graphiken ende----
		
		nextRound=new JButton("Runde Beenden");
		
		texteingabe = new JTextField();// Erstellung der Steuerung
		texteingabe.setBorder(null);
		texteingabe.setFocusable(true);
		texteingabe.addKeyListener(tEingabe);
		felder[99].add(texteingabe);
		
		nextRound = new JButton("Runde Beenden");	//Runde Beenden Button
		
		north=new JPanel();
		north.setLayout(new GridLayout(0,1));
		north.add(nextRound);
		
//		gras.setLayout(new GridLayout(0,1));


		try {// Gras-Bild wird geladen
			BufferedImage ganzesBild = ImageIO.read(new File("grasTest.png"));
			for (i = 0; i < felder.length; i++) {
				felder[i].setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
				gras.setHintergrund(ganzesBild);
				bild=ganzesBild;
			}
			gras.setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
		} catch (IOException e) {
			System.err.println("Fehler beim Laden von grasTest.png");
		}
		
		try {// Zeiger-Bild wird geladen
			BufferedImage ganzesBild = ImageIO.read(new File("Zeiger.png"));
			zeiger.setHintergrund(ganzesBild);
		} catch (IOException e) {
			System.err.println("Fehler beim Laden von Zeiger.png");
		}
		
		try{
			BufferedImage ganzesBild=ImageIO.read(new File("Auto.png"));
			auto.setHintergrund(ganzesBild.getSubimage(0, 0, 100, 100));
		}catch(IOException e){
			System.err.println("Fehler beim Laden von Auto.png");
		}
		
	}

	// --------------Defautlt-Konsturktor Ende------------------------------
	// --------------------------------------------------------------------------

	public void farbwechsel(int feld) { // Bestimmt das Feld wo der Zeiger ist
		felder[feld].setMakiertes_feld(true);
		felder[feld].setLayout(new GridLayout(0,1));
		felder[feld].setHintergrund(bild);
		felder[feld].add(zeiger);
		
		
	}

	public int feldbestimmung() { // Bestimmt wo der zeiger gerade ist
		for (int i = 0; i < 100; i++) {
			if (felder[i].isMakiertes_feld() == true) {
				return i;
			}
		}
		return -1;
	}

	public void aktualisierung() { // Aktualisiert das Fenster
		for (i = 0; i < felder.length; i++) {
			
			if (felder[i].isMakiertes_feld() == true) {	//ist der Zeiger auf dem Feld(ja)
				felder[i].add(zeiger);
			}else{
				felder[i].remove(zeiger);
			}
		
			
			if (felder[i].isAuto() == true) {	//ist ein Auto auf dem Feld
				if (felder[i].isAuto() == true  //ist Auto und Zeiger auf dem Feld
						&& felder[i].isMakiertes_feld() == true) {
					felder[i].add(auto);
					auto.add(zeiger);
				} else {
					felder[i].add(auto);//Nur das Auto ist auf dem Feld
				}
			} else {
				felder[i].remove(auto);	
			}
		}
	}

	public void moveLinks(int posi) { // Feld nach Links bewegen
		if ((posi - 1) != -1 && (posi - 1) % 10 != 9) {
			felder[posi].setMakiertes_feld(false);
			felder[posi - 1].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void moveRechts(int posi) { // Feld nach Rechts bewegen
		if ((posi + 1) % 10 != 0) {
			felder[posi].setMakiertes_feld(false);
			felder[posi + 1].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void moveUnten(int posi) { // Feld nach Unten bewegen
		if ((posi + 10) < 100) {
			felder[posi].setMakiertes_feld(false);
			felder[posi + 10].setMakiertes_feld(true);
		}
		aktualisierung();
	}

	public void moveOben(int posi) { // Feld nach oben bewegen
		if ((posi - 10) > -1) {
			felder[posi].setMakiertes_feld(false);
			felder[posi - 10].setMakiertes_feld(true);
		}
		aktualisierung();
	}
	public void setAuto(int posi){	// Auf das Feld wird ein Auto gestellt
		felder[posi].setAuto(true);
	}
	public void resetAuto(int posi){// Auto wird vom Feld entfernt
		felder[posi].setAuto(false);
	}


	public class Tasteneingebae implements KeyListener { // Abfangen der
															// Tasteneingaben
		private int feldposition = 0;
		

		@Override
		public void keyPressed(KeyEvent e) {// Wird ausgeführt, wenn eine Taste
											// gedrückt wurde.
			
			System.out.println("test");
			
			feldposition = feldbestimmung(); // Blaues-Feld wird bestimmt
			texteingabe.setText("");

			if (e.getKeyChar() == 'a') { // Blaues-Feld wird nach Links bewegt
				moveLinks(feldposition);
			}
			if (e.getKeyChar() == 'd') { // Blaues-Feld wird nach Rechts bewegt
				moveRechts(feldposition);
			}
			if (e.getKeyChar() == 'w') { // Blaues-Feld wird nach Oben bewegt
				moveOben(feldposition);
			}
			if (e.getKeyChar() == 's') { // Blaues-Feld wird nach Unten bewegt
				moveUnten(feldposition);
			}
			if(e.getKeyChar()=='c'){
				setAuto(feldposition);
			}
			if(e.getKeyChar()=='r'){
				setAuto(feldposition);
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {// Wird ausgeführt, wenn eine Taste
												// losgelassen wurde.
			// TODO Auto-generated method stub

		}

		@Override
		public void keyTyped(KeyEvent e) {// Wird ausgeführt, wenn eine Taste
											// gedrückt und wieder losgelassen
											// wurde.
			// TODO Auto-generated method stub

		}

	}
}

Die Klasse Panels ist eine erweiterte Form von JPanels.

Hier die Klasse Panels
Java:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;


public class Panels extends JPanel{
	private boolean green;				//ist das Feld grün angemalt?
	private boolean makiertes_feld;		//ist das Feld gerade ausgewählt?
	private boolean auto;				//ist auf dem Feld ein Auto		
	private Image hintergrundbild;		//Hintergrundsbild für Panels
	private BufferedImage bild,hintergrund;
	
	public boolean isMakiertes_feld() {	
		return makiertes_feld;
	}

	public void setMakiertes_feld(boolean makiertes_feld) {
		this.makiertes_feld = makiertes_feld;
	}

	public boolean isGreen() {
		return green;
	}

	public void setGreen(boolean green) {
		this.green = green;
	}
	
	public boolean isAuto() {
		return auto;
	}

	public void setAuto(boolean auto) {
		this.auto = auto;
	}

	public Panels(){
		 
	 }
	
	public void setHintergrund(BufferedImage hintergrund){
		this.hintergrund=hintergrund;
		repaint();
	}
	
	 public void setImage(BufferedImage bild){				//Konstruktor fürs HintergrundPanel
		this.bild=bild;
		repaint();
	}
	 public void paintComponent(Graphics g) {		//Nur nutzen wenn Bilder verwendet werden
		 g.drawImage(hintergrund, 0, 0,getWidth(),getHeight(), null); 
     }
}

und noch meine Haupt-Klasse falls irgendwer sie sehen möchte
Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;

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



public class Haupt {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame mainWindow=new JFrame();
		JPanel center=new JPanel();
		Container contentPain = mainWindow.getContentPane();
		mainWindow.setSize(500, 500);
		mainWindow.setDefaultCloseOperation(mainWindow.EXIT_ON_CLOSE);
		mainWindow.setResizable(false);
		
		Layout layout=new Layout();
//		contentPain.add(layout.north,BorderLayout.NORTH);
		contentPain.add(layout,BorderLayout.CENTER);
		layout.farbwechsel(44);
		mainWindow.setVisible(true);
		

		
		
	}
	
	

}
 

Marco13

Top Contributor
Viel Code, nicht gelesen, ist wahrscheinlich eine Layout-Sache, ggf. mal
hinzugefügtesPanel.setPreferredSize(new Dimension(300,300));
machen und schauen ob man dann was sieht...
 

LukLuk

Aktives Mitglied
Ich habe es hinzugefügt aber es passiert nix und wegen dem Code könnte der Fehler (meiner Meinung nach) in der Methode "aktualisieren()" da diese Methode für die Graphik zuständig ist.
 

Marco13

Top Contributor
Immernoch viel code, jetzt zumindest überflogen:
Java:
     public void paintComponent(Graphics g) { 
         g.drawImage(hintergrund, 0, 0,getWidth(),getHeight(), null); 
         super.paintComponent(g); // Fehlt - zeichnet die Panels, die zu DIESEM hinzugefügt wurden
     }
bin gerade nicht sicher, ob das so passt, ggf. muss man da für das Hintergrundbild dann ausnahmsweise (!) "paint" überschreiben, und ggf. muss man das panel noch mit einem
setOpaque(false);
im Konstruktor durchsichtig machen, aber ... zumindest muss super.paintComponent irgendwo vorkommen :D
 

LukLuk

Aktives Mitglied
bin gerade nicht sicher, ob das so passt, ggf. muss man da für das Hintergrundbild dann ausnahmsweise (!) "paint" überschreiben

Wenn ich stat paintCoponet paint überschreibe kommt Garnichts

ggf. muss man das panel noch mit einem setOpaque(false); im Konstruktor durchsichtig machen

Ich hab das auch gemacht aber es gab trotzdem keine änderung

zumindest muss super.paintComponent irgendwo vorkommen

Was meinste mit Irgendwo denn ich hab keine Ahnung wo hin das gehört, außerdem braucht das immer eine graphik Parameter und den hab ich auch ned.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird meine Graphik zwei Mal gezeichnet ? Java Basics - Anfänger-Themen 12
B Nochmal ich/ Graphik wird nicht angezeigt ? Java Basics - Anfänger-Themen 12
E JPanels auf gleicher Höhe (Y-Achse) in einem FlowLayout platzieren Java Basics - Anfänger-Themen 7
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
V Alle Komponenten eines JPanels Java Basics - Anfänger-Themen 14
L Threads Laufbild Erzeugen Problem mit Aktualisieren des JPanels Java Basics - Anfänger-Themen 2
W 2 JPanels in 2Klasse in einem JFrame zusammenfügen Java Basics - Anfänger-Themen 12
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
N Probleme beim entfernen eines JPanels Java Basics - Anfänger-Themen 4
M JPanels verschachteln Java Basics - Anfänger-Themen 23
J Cannot find Symbol Variable mit JPanels Java Basics - Anfänger-Themen 2
M dynamische JPanels/Component Java Basics - Anfänger-Themen 3
M Überschreiben von JPanels funktioniert nicht! Java Basics - Anfänger-Themen 9
U Neuzeichnen eines JPanels Java Basics - Anfänger-Themen 17
A Mehere JPanels und JLabels - Warum Fehler? Java Basics - Anfänger-Themen 5
G Gesamten clickCount mehrerer JPanels herausfinden Java Basics - Anfänger-Themen 5
M JPanels vergleichen Java Basics - Anfänger-Themen 3
A Matisse oder Java Problem: JPanels werden riesig ? Java Basics - Anfänger-Themen 3
B LayoutManager Anorden von verschiedenen JPanels Java Basics - Anfänger-Themen 5
Q ActionListener event bei JPanels Java Basics - Anfänger-Themen 5
P Schriftgröße eines JPanels ändern Java Basics - Anfänger-Themen 2
T JPanels austauschen? Java Basics - Anfänger-Themen 4
T Fehlermeldung beim Klonen eines JPanels Java Basics - Anfänger-Themen 8
W JPanels löschen und neu konstruieren Java Basics - Anfänger-Themen 4
J Methoden Mehrdimensionale Arrays übereinander legen Java Basics - Anfänger-Themen 5
S Buttons übereinander legen - Reihenfolge Java Basics - Anfänger-Themen 2
N Zwei Grafiken / Objekte übereinander abbilden Java Basics - Anfänger-Themen 5
G Zwei Panels übereinander Java Basics - Anfänger-Themen 14
T 2 Bilder übereinander zeichnen? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben