Komponenten zur Laufzeit entfernen

Askadi

Mitglied
Hallo....

habe ein Problem und zwar hatte ich mal wieder zu viel Zeit und bin auf die Idee gekommen einen Ansatz eines Spiels zu programmieren.
Einfach eine Figur die schiessen kann (mehr nicht eigentlich sinnlos)

Also mein erster Gedankengang war es das die Figur einfach mit JLabels schiessen wird 🙂 und so kahm mir die Frage ob es überhaupt möglich ist ein JLabel mit dem gleichen Namen mehrfach zu erzeugen das geht schonmal nur ist dann ein Problem entstanden worum es eben auch geht-.- :

Wenn ein Label seine Aufgabe erfüllt hat (z.B. eine Kolission mit einer Wand) könnte man es einfach .setVisible(false) machen oder disablen würd auch gehn aber nach einer Zeit würde das sicher arbeitsspeicher fressen ohne ende darum hab ich gegoogelt und bin auf unzählige remove() Methoden gestossen die jedoch nicht wirklich funktionieren wie ich das will

Hier ein kleiner Code dazu:
beim Klick auf einen Button soll einfach das Panel gelöscht werden zum testen

Java:
package mehrfachVerwendung;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class mehrfach_V1 {


	static JPanel pan = new JPanel();
	static Container cont;
	
	public static void main(String[] args) 
	{
		// TODO Auto- generated method stub

		JFrame window = new JFrame();
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.setBounds(40,40,800,600);
		
		cont = window.getContentPane();
		cont.setLayout(null);
		

		pan.setBounds(40, 40, 500, 150);
		pan.setBackground(Color.red);
		cont.add(pan);

		
		
		
		window.setVisible(true);
		
		
		
		// paar buttons erstellen (kein Sinn atm)
		int anzahl = 5;
		for(int i = 0; i < anzahl;i++)
		{
			mehrfachLabel();
		}
		
		
	}
	
	
	
	public static void mehrfachLabel()
	{
		final JButton kaue = new JButton("X");
		kaue.addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent arg0) 
			{
				// TODO Auto-generated method stub
				
				cont.remove(pan);
				System.out.println("TEST TEST");
				
			}
			
		});
		
		
		pan.add(kaue);
	}
	

}


es scheint irgendwie auch zu funktionieren aber es sieht auch als würde nur einer der buttons auf hide() gesetzt werden und die anderen Dinge sind noch normal haben aber keine funktion mehr.
 
setVisible(true);
besser erst am Ende ausführen, sonst kann es zu Grafikfehlern kommen,

so wie du einen beim remove hast, dort entfernst du das gesammte Panel mit allen Buttons,
führst aber kein repaint() aus, wenn das nächste mal neu gezeichnet wird (z.B. Maximieren), ist das ganze rote Panel weg,

du solltest eher nur einen der Buttons entfernen, und immer repaint() auf das Panel drumherum oder am besten das ganze JFrame aufrufen,
wenn ein richtiges Layout statt null-Layout involviert ist, dann vor dem repaint() auch validate()
 
Ich glaub ich habs verstanden, aber trotzdem nochmal seh ich das richtig das ich alles removed hab:
also JPanel und die Jbuttons wo drauf sind, nur hätt ich dann z.b. den container neu zeichnen müssen ?
 

Zurück
Oben