Elemente aus JPanel bzw. GridBag löschen und ersetzen

Status
Nicht offen für weitere Antworten.

wu_fung

Mitglied
Hi

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


Code:
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

Top Contributor
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

Top Contributor
Naja, sein Problem ist wahrscheinlich das GBL. So ungefähr müsste es gehen:
Code:
...
                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

Mitglied
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

Top Contributor
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:
Code:
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

Mitglied
André Uhres hat gesagt.:
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:
Code:
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).

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

wu_fung

Mitglied
André Uhres hat gesagt.:
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
Code:
list.add(gbc);

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

Code:
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));
//...
 

wu_fung

Mitglied
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:
Code:
private void setField(int x, int y )/*Parameter sind jetzt noch egal*/
	{
		
		wind.remove(17); 
		wind.revalidate();
		
	}
bzw.
Code:
private JPanel setField(int x, int y )
{
JPanel newfield = wind;
		newfield.remove(17);
		newfield.revalidate();
return newfield;
	}
 

wu_fung

Mitglied
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.
 

wu_fung

Mitglied
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.
 

wu_fung

Mitglied
Hallo

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

Code:
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:
Code:
.\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));
 

André Uhres

Top Contributor
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:
Code:
       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

Mitglied
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.

Code:
                        wind.remove((Component)mImg.get(0));
			mImg.set(0, img);
			wind.add((Component)mImg.get(0), mGBC.get(pl1));
			wind.revalidate();
			win.repaint();
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Titel für eingebundene Elemente wie JPanel AWT, Swing, JavaFX & SWT 3
G Alle Elemente eines JPanel herausfinden? AWT, Swing, JavaFX & SWT 3
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
M Swing JList - Elemente umbenennen? AWT, Swing, JavaFX & SWT 4
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
H [gelöst] Swing Elemente verdecken AWT, Swing, JavaFX & SWT 14
B In externer Eventhandlerklasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
K BoxLayout skaliert die "falschen" Elemente AWT, Swing, JavaFX & SWT 5
A SWT - Elemente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
S Andere Elemente in JComboBox anzeigen AWT, Swing, JavaFX & SWT 2
T Elemente werden nicht direkt angezeigt AWT, Swing, JavaFX & SWT 3
S Nachträglich Swing-Elemente in JFrame erzeugen AWT, Swing, JavaFX & SWT 18
F Dynamische Swing Elemente AWT, Swing, JavaFX & SWT 10
B Grafische Anordnung der Elemente AWT, Swing, JavaFX & SWT 2
S JComboBox zeigt beim 1. öffnen nur 2 Elemente ? AWT, Swing, JavaFX & SWT 9
J LayoutManager der Elemente untereinander anordnet. AWT, Swing, JavaFX & SWT 11
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
S List Elemente AWT, Swing, JavaFX & SWT 4
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
E GUI-Elemente aus txt- oder xml-File erstellen? AWT, Swing, JavaFX & SWT 5
J FAQ programmieren, welche Swing-Elemente AWT, Swing, JavaFX & SWT 7
M Elemente hängen dicht aufeinander AWT, Swing, JavaFX & SWT 2
S Falsche Position, Elemente erscheinen nicht, Flackern AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben