JPanel über anderem JPanel

bennoberga

Mitglied
Hallo!

Ich muss irgendwie ein JPanel über ein anderes legen, also zum Verständnis jetzt: so sieht mein Spielchen, ein Tower Defense Minigame, aus:



Die einzelnen Felder sind JPanels, bestehend aus einem zweidimensionalem Array das wiederum auf einem JPanel liegt.

Jetzt müsste ich die Mobs über diese JPanel laufen lassen, ich dacht mir, mit setLocation(); einfach ständig verändern... Wenn ich aber ein weiteres JPanel auf das JFrame gebe wird das immer nur hinten angehängt, also so:



Welchen Layout Manager könnte man hier verwenden, oder auch andere Lösungsvorschläge, alles gerne erwünscht!

Vielen Dank im Voraus, hier noch der Source Code:

Java:
public class Gamewindow extends Thread implements MouseListener{
	static JFrame fenster;
	static Paintpanel parr[][];
	Towerwindow tw;
	Mobwindow mw;
	static String mob="kein";
	Vector <Mob> mobvec;
	JPanel ground;
	public Gamewindow(){
		ground=new JPanel();
		ground.setLayout(new GridLayout(6,8));
		mobvec=new Vector <Mob>();
		parr=new Paintpanel[8][6];
		fenster=new JFrame();
		fenster.addMouseListener(this);
		fenster.setLocation(300, 100);
		fenster.setTitle("Tower Defense Minigame");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setLayout(null);
		for(int i=0;i<6;i++){
			for(int j=0;j<8;j++){
				parr[j][i]=new Paintpanel();
				parr[j][i].addMouseListener(this);
				parr[j][i].pos="["+String.valueOf(j)+"] "+"[ "+String.valueOf(i)+"]";
				ground.add(parr[j][i]);
			}
		}
		ground.setBounds(0,0,800,600);
		fenster.setContentPane(ground);
		karteninit();
		fenster.setSize(800,600);
		fenster.setResizable(false);
		Mob m=new Mob("default");
		fenster.setVisible(true);
		tw=new Towerwindow();
		tw.run();
		mw=new Mobwindow();
		mw.run();
	}

Paintpanel:

Java:
public class Paintpanel extends JPanel{
	int towerterrain=0;
	String tower="kein";
	String pos="";
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(towerterrain==0){
	        Color c=new Color(245, 222, 179);
	        g.setColor(c);
        	g.fillRect(0, 0, 100,100);
        }
        else{
	        Color c=new Color(139,69,19);
	        g.setColor(c);
        	g.fillRect(0, 0, 100,100);
            g.setColor(Color.BLACK);
            g.drawLine(0,0,0,100);
            g.drawLine(0,0,100,0);
        }
        g.setColor(Color.RED);
        g.drawString(pos, 20, 20);
        if(tower.equals("round"))
        	g.drawString("Round",20,40);
        if(tower.equals("canon"))
        	g.drawString("Canon",20,40);
        if(tower.equals("slow"))
        	g.drawString("Slow",20,40);
        if(tower.equals("sniper"))
        	g.drawString("Sniper",20,40);
        if(tower.equals("default"))
        	g.drawString("Default",20,40);
        if(tower.equals("toxic")){
        	Image pic=Toolkit.getDefaultToolkit().getImage( "toxic.jpg" );
        	g.drawImage(pic, 8, 5, 80, 80, this);
        }
    }
	public void roundTower() {
		tower="round";
	}
	public void canonTower() {
		tower="canon";
	}
	public void slowTower() {
		tower="slow";
	}
	public void sniperTower() {
		tower="sniper";
	}
	public void toxicTower() {
		tower="toxic";
	}
	public void defaultTower() {
		tower="default";
	}
}
 
Da es sich um ein Spiel handelt wohl das null-Layout. Du willst sie ja sicher auch nach belieben positionieren können. Alternativ einen eigenen LayoutManager schreiben, der kann dir ein paar Dinge, wie z. B. das Setzen der Größe abnehmen.

btw.
Java:
public class Gamewindow extends Thread
Gamewindow ist ein Thread? Kann ich irgendwie nicht glauben. :noe:

Java:
if(tower.equals("canon"))
     g.drawString("Canon",20,40);
if(tower.equals("slow"))
     g.drawString("Slow",20,40);
if(tower.equals("sniper"))
     g.drawString("Sniper",20,40);
if(tower.equals("default"))
     g.drawString("Default",20,40);

Besser mehr OOP, sonst blickst du irgendwann durch den kilometer langen Source nicht mehr durch und Erweiterungen werden Horror.
 
Danke für die Antworten!

@Volvagia: Gamewindow ist "extends Thread" weil mir die run Methode sehr gelegen kommt..
bzgl. OOP, werd ich später noch machen, dies ist nur eine schnell schnell Testversion...
Ich hab ja Null Layout, aber irgendwie wird das einfach hinten angehängt... das "ground" JPanel hab ich mit GridLayout damit die Einteilung der Kästchen schön stimmt...

@Marco13: Ich habe es mit JPanels gemacht damit man verschiedene Maps automatisch generieren lassen kann, da ich so leichter definieren kann welches Kästchen nun Towergrund und welches Kästchen die Laufbahn für die Mobs darstellt... Mit zeichnen müsste ich die Map ja als fixen Hintergrund nehmen...
 
Zuletzt bearbeitet:
also wenn du EINS AUFS ANDERE jetzt als EBENEN meinst ... dann ist JLayeredPane das beste ...
das obere Panel überschreibst du dann so das du die Sprite dann daruf zeichnest und des panel an sich Opaque machst ... nachteil : extrem hoher overhead da für jede map-position 3 components gebraucht werden ... das JLayeredPane ... das untere zur map gehörenden panel und das obere auf das die Sprite gezeichnet wird ...
 
@Marco13: Ich habe es mit JPanels gemacht damit man verschiedene Maps automatisch generieren lassen kann, da ich so leichter definieren kann welches Kästchen nun Towergrund und welches Kästchen die Laufbahn für die Mobs darstellt... Mit zeichnen müsste ich die Map ja als fixen Hintergrund nehmen...

Die Map an sich liegt ja (im Idealfall? Oder hoffentlich?!) ohnehin als etwas vor, was etwa so aussieht wie
Java:
interface GameMap
{
    FieldType getFieldType(int x, int y);
}
- jedenfalls nichts was mit Swing zu tun hat. Das zeichnen ist ja eine ganz andere Sache.
 

Zurück
Oben