# Elemente zur LaufZeit hinzufügen und löschen



## dotlens (19. Okt 2004)

hallo

wenn ich bei meinem Frame wärend der LaufZeit Elemente hinzufüge und lösche muss ich das ja irgendwie aktualisieren, also das löschen klappt prima, aber das neue zeiget er mir nicht an
dacht, ich könne einfach mit repaint() neu zeichnen lassen, jedoch werden die neuen Elemente nicht gezeichnet

hab herausgefunden:
wenn man die grösse verändert zeichnet er den neuen Komponenten

also hab ich nach dem hinzufügen manuell resize(), reshape() und remove() aufgerufen ohne den gewünschten erfolg.

nach langem proben hab ich heraugefunden dass nach pack() neu gezeichnet wird. jedoch wird so die grösse auch verändert und das möcht ich nicht. weiss jemand was pack() macht, damit das ganze neu gezeichnet wird?

oder wie kann ich mein Problem sonst lösen?

danke und gruss


----------



## Schweizer Schalentier (19. Okt 2004)

versuchs mal mit validate()


----------



## dotlens (19. Okt 2004)

damit zeichnet er mir das alte neu. und löscht das alte, jedoch kommt das neue wieder erst nach dem verstellen der Grösse zum vorschein.


----------



## Schweizer Schalentier (19. Okt 2004)

Leg mal den Quelltext rein, damit ich sehen kann wie du das gui generierst.


----------



## dotlens (19. Okt 2004)

hab extra ein einfaches 


```
public class AddRemove extends JFrame{

	JPanel contentPanel;
	
	JLabel label, label2;
	JFrame frame;
	
	public static void main(String[] args) {
		AddRemove addRemove = new AddRemove();
		addRemove.setVisible(true);
	}
	
	AddRemove(){
		super();
		initialisize();
		frame = this;
		
		label = new JLabel("Test");
		label2 = new JLabel("Test2");
		JButton btnAddRemove = new JButton("Add-Remove");
		btnAddRemove.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				contentPanel.remove(label);
				contentPanel.add(label2);
				//frame.reshape(100,300,300,100);
				//frame.remove(frame);
				//frame.resize(200, 100);
				//frame.repaint();
				//frame.pack(); //funzzzzzzzzzt!
				frame.validate();
			}
		});
		contentPanel.add(btnAddRemove);
		contentPanel.add(label);
		
		this.pack();
	}
	
	private void initialisize(){
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		contentPanel = new JPanel();
		this.setContentPane(contentPanel);
	}
}
```


----------



## dotlens (19. Okt 2004)

hab gerade nachgeschaut was pack() macht. und das ruft auch wiederum validate() auf!!! aber validate() aleine klappt nicht!!!

hier der code von pack() fals es jemanden interessiert:

```
public void pack() {
		Container parent = this.parent;
		if(parent != null && parent.getPeer() == null) {
			parent.addNotify();
		}
		if(peer == null) {
			addNotify();
		}
		setSize(getPreferredSize());

		if(beforeFirstShow) {
			isPacked = true;
		}

		validate();
	}
```


----------



## bygones (19. Okt 2004)

also so klappts schonmal:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame{

	   JPanel contentPanel;
	   
	   JLabel label, label2, currentLabel;
	   JFrame frame;
	   
	   public static void main(String[] args) {
	      Test addRemove = new Test();
	      addRemove.setVisible(true);
	   }
	   
	   Test(){
	      super();
	      initialisize();
	      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      label = new JLabel("Test");
	      currentLabel = label;
	      label2 = new JLabel("Test2");
	      JButton btnAddRemove = new JButton("Add-Remove");
	      btnAddRemove.addActionListener(new ActionListener(){
	         public void actionPerformed(ActionEvent e){
	            contentPanel.remove(currentLabel);
	            currentLabel = currentLabel == label ? label2 : label;
	            contentPanel.add(currentLabel);
	            pack();
	         }
	      });
	      contentPanel.add(btnAddRemove);
	      contentPanel.add(label);
	      
	      this.pack();
	   }
	   
	   private void initialisize(){
	      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      contentPanel = new JPanel();
	      this.setContentPane(contentPanel);
	   }
	}
```
er hüpft nun zwischen den beiden labels hin und her...
wenns dir aber nur um den Text geht und die labels sich sonst nicht unterscheiden ist setText() besser...

pack ruft natürlich wieder validate auf, da die dafür zuständig ist allen Components zu sagen: zeichne euch neu. pack macht nur vorher ein paar sachen um Bescheid zu geben: Es wird gezeichnet und dann mit Mindestgröße angezeigt


----------



## Schweizer Schalentier (19. Okt 2004)

hm, ich weis vielleicht nicht genau, was du erreichen möchtest, aber wenn du die Zeile mit 
      this.pack();
durch
      this.setSize(180, 70);
ersetzt, oder auch nur ergänzt, dann funktionierts.


----------



## L-ectron-X (19. Okt 2004)

Noch eine Variante. :wink:

```
import javax.swing.*;
import java.awt.event.*;

public class AddRemove extends JFrame {

   private JPanel contentPanel;
   private JButton btnAddRemove;
   private JLabel label, label2;

   public AddRemove(String title) {
      super(title);
      initialisize();

      btnAddRemove.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            label2 = new JLabel("Test2");
            contentPanel.remove(label);
            contentPanel.add(label2);
            //reshape(100,300,300,100);
            //remove(frame);
            //resize(200, 100);
            //repaint();
            pack(); //funzzzzzzzzzt!
         }
      });


   }

   private void initialisize(){
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      label = new JLabel("Test");
      btnAddRemove = new JButton("Add-Remove");
      contentPanel = new JPanel();
      contentPanel.add(btnAddRemove);
      contentPanel.add(label);
      setContentPane(contentPanel);
      pack();
   }
   
   public static void main(String[] args) {
      new AddRemove("AddRemove").setVisible(true);
   }
}
```


----------



## bygones (19. Okt 2004)

*versuchungWiederStehenMehrMöglichkeitenZuPosten*


----------



## dotlens (20. Okt 2004)

danke dür die vielen antworten! 

also s geht scho darum komponenten zu löschen und andere hinzuzufügen, genauer gesagt den inhalt eines scrollpanes. oder wäre es besser ein neues scrollpane hhinzuzufügen und das alte zu löschen? werds ausprobieren 

das mit pack() hab ich auch rausgefunden, aber mit validate() funktioniert es nicht, also macht pack() noch irgendwas was ich nicht verstehe 

die einzige Problem mit pack() ist, dass dann die grösse wieder angepasst wird, was ich nicht möchte, da der Benuzter diese selbst einstellen kann....

Jetzt kommt das ausprobieren 

danke leute...


----------



## bygones (20. Okt 2004)

dotlens hat gesagt.:
			
		

> also s geht scho darum komponenten zu löschen und andere hinzuzufügen, genauer gesagt den inhalt eines scrollpanes. oder wäre es besser ein neues scrollpane hhinzuzufügen und das alte zu löschen? werds ausprobieren


Normalerweise ist das recht angenehm, da du einfach nur den Viewport der ScrollPane ändern musst !


----------



## dotlens (20. Okt 2004)

:S
wenn ich diese methode gekannt hätte, hätte ich 1 tag arbeit gespart 

danke!


----------



## L-ectron-X (20. Okt 2004)

dotlens hat gesagt.:
			
		

> :S
> wenn ich diese methode gekannt hätte, hätte ich 1 tag arbeit gespart
> 
> danke!


Aber auch, wenn Du von vorn herein die Frage so gestellt hättest, dass für Dich am Ende ein Maximum an Informationen heraus kommt. :roll:


----------



## dotlens (20. Okt 2004)

hab eigentlich mal noch die gesamtsituation erklärt, kann es jedoch jetzt nicht mehr finden! ist wohl irgendwie etwas schiefgegangen....


----------

