# Elemente aus JPanel bzw. GridBag löschen und ersetzen



## wu_fung (15. Mai 2007)

Hi

Ich hab folgendes Problem:
Ich möchte gerne aus meinem JPanel - GridBag Elemente wieder löschen und diese durch andere Elemente ersetzen. 



```
private JPanel createPlField()
	{
		JPanel wind = new JPanel();
		wind.setForeground(Color.black); //funktioniert leider auch nicht...
		GridBagLayout gbl = new GridBagLayout();
		wind.setLayout(gbl);
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(0, 0, 0, 0);
		img = new BitmapComponent("ar1.png");
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.fill = GridBagConstraints.NORTHEAST;
		wind.add(img, gbc);
		int zeilen = 1;
		for (int k = 1; k < 6; k++)
		{
			img = new BitmapComponent("images\\elements\\none.jpg");
			gbc.gridx = k;
			gbc.gridy = 0;
			gbc.anchor = GridBagConstraints.NORTHEAST;
			wind.add(img, gbc);
		}
		for (int i = 1; i < 8; i++) //Zeile(n) -> 7
		{
			for (int j = 0; j < 6; j++) //Spalte(n)
			{
				
				img = new BitmapComponent("images\\feld\\player1\\feld1_"+zeilen+".jpg");
				gbc.gridx = j;
				gbc.gridy = i;
				gbc.anchor = GridBagConstraints.NORTHEAST;
				list.add(gbc);
				arr.add(img);
				GridBagConstraints temp = new GridBagConstraints();
				temp = (GridBagConstraints) list.get(zeilen-1);
				wind.add(img, temp);
				zeilen++;
}}}
```
Danke im Voraus!


----------



## Quaxli (16. Mai 2007)

Und wo ist das Problem. Alles was man mit add(..) in einen Container reinpackt, kann man mit remove(..) entfernen.

Wo ist Dein konkretes Problem?


----------



## André Uhres (16. Mai 2007)

Naja, sein Problem ist wahrscheinlich das GBL. So ungefähr müsste es gehen:

```
...
                arr.remove(13);
                BitmapComponent img = new BitmapComponent(..);
                arr.add(13,img);
                panel.remove(13);
                panel.add(img, list.get(13));
                panel.revalidate();
...
    private JPanel createPlField() {
...
        for (int k = 1; k < 6; k++) {
            img = new BitmapComponent(..);
            gbc = new GridBagConstraints();//<----------------HINZUFÜGEN !
...
        }
        for (int i = 1; i < 8; i++) //Zeile(n) -> 7
        {
            for (int j = 0; j < 6; j++) //Spalte(n)
            {
                img = new BitmapComponent(..);
                gbc = new GridBagConstraints();//<---------------HINZUFÜGEN !
...
            }
        }
        return wind;
    }
```


----------



## wu_fung (16. Mai 2007)

HI

Danke für eure Antworten.

Es ist so das ich ein GridBayLayout verwende, und in jeder Zelle ein Image habe. Ich möchte aber ein bestimmtes Image aus dem Grid wieder raus löschen.


----------



## André Uhres (16. Mai 2007)

wu_fung hat gesagt.:
			
		

> HI
> 
> Danke für eure Antworten.
> 
> Es ist so das ich ein GridBayLayout verwende, und in jeder Zelle ein Image habe. Ich möchte aber ein bestimmtes Image aus dem Grid wieder raus löschen.


Das Löschen ist ja kein Problem. Z.B. das Bild 13 löschen:

```
panel.remove(13);
```
Für das Einfügen eines neuen Bildes brauchst du aber die richtigen Constraints aus der list.
Dazu ist es notwendig, für jedes Bild ein neues Constraintsobjekt zu erzeugen
(siehe dazu auch meinen Code oben).


----------



## wu_fung (16. Mai 2007)

André Uhres hat gesagt.:
			
		

> wu_fung hat gesagt.:
> 
> 
> 
> ...



Dazu muss ich aber ein Array für meine Constraints erstellen oder??


----------



## André Uhres (16. Mai 2007)

wu_fung hat gesagt.:
			
		

> ..Dazu muss ich aber ein Array für meine Constraints erstellen oder??


Die Constraints hast du doch schon in einer List  ???:L 

```
list.add(gbc);
```


----------



## wu_fung (16. Mai 2007)

André Uhres hat gesagt.:
			
		

> wu_fung hat gesagt.:
> 
> 
> 
> ...



Ja stimmt, eine Liste, besser gesagt eine ArrayList. 
Das Problem ist nur, dass ich eine NullPointerException bekomme wenn ich ein Element einfügen will:


```
private List<GridBagConstraints> list; 


public grafsys(){
//...
list = new ArrayList<GridBagConstraints>();
}
private JPanel createPlField()
{
//...
       gbc = new GridBagConstraints();
	img = new BitmapComponent("images\\feld\\none\\feld0_"+zeilen+".jpg");
	gbc.gridx = j;
	gbc.gridy = i;
	gbc.anchor = GridBagConstraints.NORTHEAST;
	list.add(gbc);
	wind.add(img, list.get(zeilen-1));
//...
```


----------



## André Uhres (16. Mai 2007)

Dann haste vielleicht List *zweimal* definiert, einmal wie oben und nochmal lokal  in createPlfield ?


----------



## wu_fung (16. Mai 2007)

Ja stimmt, das war das Problem. 
Ich hab jetzt nur ein anderes Problem und zwar möchte diese Remove Funktion Ereignisgesteuert haben, also dies wäre nur die ausführende Methode:

```
private void setField(int x, int y )/*Parameter sind jetzt noch egal*/
	{
		
		wind.remove(17); 
		wind.revalidate();
		
	}
```
bzw.

```
private JPanel setField(int x, int y )
{
JPanel newfield = wind;
		newfield.remove(17);
		newfield.revalidate();
return newfield;
	}
```


----------



## André Uhres (16. Mai 2007)

JButton -> ActionListener -> actionPerformed -> setField


----------



## wu_fung (16. Mai 2007)

Ja, danke das ist mir eh klar. Kann man eigentlich auch 2 Listener verwenden, also ActionListener und KeyListener?
Ich wollte sie mit einem Beistrich trennen, was aber einen Compiler Error brachte.

Ich hab jetzt die Methode als void verwendet. Das Element bleibt aber trotzdem stehen, also wird nicht gelöscht.


----------



## André Uhres (16. Mai 2007)

Man kann soviele Listener verwenden wie man braucht. 
Bei mir funktioniert das Löschen.


----------



## wu_fung (19. Mai 2007)

Hallo

Bei mir funktioniert das Löschen auch, nun habe ich aber ein anderes Problem, wenn ich 2 Bilder austauschen möchte, habe ich das Problem das der Index von meinem JPanel nicht mehr stimmt, z.b ich lösche Element 0 und 1, füge dann bei Element 0 und 1 etwas ein, so entfernt die Methode das Element 0 und das Element 2. 

Ich hab schon einiges probiert um es zu lösen, weder mit einer Schleife noch einer Rekursion löst das Problem.


----------



## André Uhres (20. Mai 2007)

wu_fung hat gesagt.:
			
		

> ..z.b ich lösche Element 0 und 1..


Element 0 und 1 sind doch nicht in der list  ???:L
Mach doch bitte mal ein KSKB ( siehe dazu "Lies mich" hier links nebendran).


----------



## wu_fung (20. Mai 2007)

Hallo

Ich hab die Elemente von JPanel über den Index zugegriffen, siehe dazu unten moveArrow


```
public class grafsys extends JFrame implements ActionListener, KeyListener 
//...
ArrayList mImg = new ArrayList(42); //Array für Images
ArrayList mGBC = new ArrayList(42); //Array für die GBC'
JPanel wind = new JPanel();

//..
//pl1 steht für Player1
//plstatus ob Player 1 oder 2 aktiv ist
public void keyPressed(KeyEvent event)
{

                if (event.getKeyCode() == KeyEvent.VK_LEFT)
		{
			if (plstatus == 1) { pl1--; } else { pl2--; };
			if ((pl1 >= 0) && (pl2 >= 0))
			{
				moveArrow(+1); //+1 um das Nachbarelement zu "füllen"
			}
			else if (plstatus == 1) { pl1++; } else { pl2++; };
		}
		else if (event.getKeyCode() == KeyEvent.VK_RIGHT)
		{
			if (plstatus == 1) { pl1++; } else { pl2++;}
			if ((pl1 <= 5) && (pl2 <= 5))
			{
				moveArrow(-1);
			}
			else if (plstatus == 1) { pl1--; } else { pl2--; }
		}
	}
//old -> Nachbarelement
private void moveArrow(int old)
	{
		img = new BitmapComponent("images/elements/ar1.jpg"); //neues Bild
		tmp = new BitmapComponent("images/elements/none.jpg"); //nur temporär um altes Bild anzuzeigen


			wind.remove(pl1 + old); 
			wind.add(tmp, mGBC.get((pl1 + old)));
			wind.revalidate();
			wind.repaint();
			win.repaint();
			wind.remove(pl1); 
			wind.add(img, mGBC.get((pl1)));
			wind.revalidate();
			wind.repaint();
			win.repaint();
	}
```
Zusätzlich habe ich noch ein Problem mit meiner Arraylist. JPanel erwartet (beim Übergeben mit der Funktion add) sich ein AWT Component und ein java.lang Objekt. 
Ich übergebe jedoch laut Compiler nur java.lang Objekte...
Compilerausgabe:

```
.\grafsys.java:239: cannot find symbol
symbol  : method add(java.lang.Object,java.lang.Object)
location: class javax.swing.JPanel
                wind.add(mImg.get(0), mGBC.get(0));

//Zeile 234 - 239
img = new BitmapComponent("images/elements/ar1.jpg");
		gbc = createGBC(0, 0);
		mImg.add(img);
		mGBC.add(gbc);
		wind.repaint();
		wind.add(mImg.get(0), mGBC.get(0));
```


----------



## SWING4U (22. Mai 2007)

Schau dir doch lieber Tablelalyout oder Formlayout an... ;-)


----------



## André Uhres (23. Mai 2007)

SWING4U hat gesagt.:
			
		

> Schau dir doch lieber Tablelalyout oder Formlayout an... ;-)


Das ist eigentlich kein Problem vom Layoutmanager. 
Man muss einfach die richtigen Constraints und den richtigen Index angeben.
Im vorliegenden Fall ist zu berücksichtigen, daß der Index im Panel nicht mit dem
Index der Constraints übereinstimmt:

```
wind.remove(7+pl1 + old);
        wind.add(tmp, (GridBagConstraints)mGBC.get((pl1 + old)), 7+pl1 + old);
        wind.revalidate();
        wind.remove(7+pl1);
        wind.add(img, mGBC.get((pl1)), 7+pl1);
        wind.revalidate();
```


----------



## wu_fung (23. Mai 2007)

Hallo

Danke für die Antwort. Mir ist im Zusammenhang mit dem Index, noch etwas eingefallen, da bei mir die erste Zeile so und so eigentlich nur ein Element benötigt (die anderen Elemente sind ja eigentlich nur Deko), verschiebe ich das Element 0 (also meinen Pfeil) immer nach dem gewünschten GridBagConstraint.


```
wind.remove((Component)mImg.get(0));
			mImg.set(0, img);
			wind.add((Component)mImg.get(0), mGBC.get(pl1));
			wind.revalidate();
			win.repaint();
```


----------

