# JPanel komponente Löschen



## guguli (24. Apr 2015)

Hallo zusammen,

Ich möchte gerne mit einem Buttonklick überprüfen ob auf einem bestimmten Panel irgendwelche komponente vorhanden sind, und falls das der fall sein sollte, dann sollen diese Komponente von diesem Panel gelöscht werden.

Kann mir einer nen Tipp diesbezüglich geben??

THX


----------



## Flown (24. Apr 2015)

Jap da gibt es mehrere Möglichkeiten. Du kannst entweder mit getComponents alle Componenten holen und durchiterieren. Oder du gehst über die Indices (mit getComponentCount und getComponent(int)).

Hier mal ein kleines Beispiel wies gemacht werden könnte:



Spoiler: KSKB





```
import javax.swing.*;
import java.awt.*;
import java.util.Iterator;
import java.util.Stack;

public class Test {
  public static void main(String... args) {
    SwingUtilities.invokeLater(Test::new);
  }

  public Test() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationByPlatform(true);

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

    Box bottom = Box.createVerticalBox();

    JButton addButton = new JButton("Add");
    addButton.addActionListener(e -> {
        if (bottom.getComponentCount() == 0) {
          bottom.add(new JLabel("Component"));
          frame.pack();
        }
      }
    );
    JButton removeButton = new JButton("Remove");
    removeButton.addActionListener(e -> {
      for(Component c : bottom.getComponents()) {
        if(c instanceof JLabel) {
          bottom.remove(c);
          bottom.revalidate();
        }
      }
    });

    Box box = Box.createHorizontalBox();
    box.add(addButton);
    box.add(removeButton);

    mainPanel.add(box);
    mainPanel.add(bottom);

    frame.add(mainPanel);

    frame.pack();
    frame.setVisible(true);
  }
}
```


----------



## guguli (24. Apr 2015)

Hi,

hab das jetzt so gemacht:

```
@Override
	public void actionPerformed(ActionEvent actionEvent) {
		if (actionEvent.getSource() == enter) {
			for(Component c : panel3.getComponents()){
				panel3.remove(c);
				panel3.revalidate();
			}
               }
            }
```
und so add ich aber checkbox in panel:

```
protected void addXColumn(ArrayList<String> xSpaceConvertedValue2) {
		xCheckBox = null;
		
		if (xCheckBox == null) {
			xCheckBox = new JCheckBox[xSpaceConvertedValue.size()];
		}

		for (int i = 0; i < xSpaceConvertedValue.size(); i++) {
			xCheckBox[i] = new JCheckBox(xSpaceConvertedValue.get(i));
			gbc.gridx = 0;
			gbc.gridy = 1 + i;
			panel3.add(xCheckBox[i], gbc);
               xCheckBox[i].addActionListener(actionListener);
}}
```

irgend wie tut das trotzdem nicht,


----------



## Tom299 (24. Apr 2015)

Wozu fragst du auf null ab und machst nicht gleich nur die Anweisung in der If-Bedingung? Oder hast du Code dazwischen auskommentiert?

```
xCheckBox = null;
 
		if (xCheckBox == null) {
			xCheckBox = new JCheckBox[xSpaceConvertedValue.size()];
		}
```

Und später im Code arbeitest du mit dem xCheckBox-Array und benutzt die x-ChechBox gar nicht mehr ... und nach dem add fehlt auch noch eine }

Beim entfernen der Componenten würde ich erst mal alle entfernen und erst nach der Schleife dann die GUI aktualisieren lassen.


----------



## guguli (24. Apr 2015)

Das was ich gepostet habe ist ein kleiner Teil von dem Programm. So wie es da steht ist alles richtig nur remove(c) funktioniert nicht. 
Hab die Funktion addXColumn aus dem Grund gepostet, dass ihr wisst wie icht die Komponente in diesen Panel adde. 

Also ich adde ständig neue xCheckBoxes und jedesmal wenn ich den button enter klicke dann sollen diese gelöscht werden. Aber wenn ich das tue dann verdoppeln sich die Komponente....

Gruß


----------



## guguli (24. Apr 2015)

Tom299 hat gesagt.:


> Und später im Code arbeitest du mit dem xCheckBox-Array und benutzt die x-ChechBox gar nicht mehr ... und nach dem add fehlt auch noch eine }
> 
> Beim entfernen der Componenten würde ich erst mal alle entfernen und erst nach der Schleife dann die GUI aktualisieren lassen.




Hab das auch so probiert, kein Unterschied...


----------



## Tom299 (24. Apr 2015)

Naja der Unterschied ist, daß du jedes mal das Layout neu zeichnen läßt, was unnötig ist, da 1 mal reicht.

Versuchs mal mit Remove und dann ein index, z.B. 0 oder 1, je nachdem, welche es bei dir gibt, ob dann was gelöscht wird. Hab schon länger kein Swing mehr programmiert, aber es gibt ja noch die Methoden invalidate() und updateUI() oder sowas? Vielleicht funktioniert das revalidate nicht.


----------



## guguli (24. Apr 2015)

Ich hab den Fehler gefunden...

Also das problem ist xCheckbox, wenn ich einmal den button enter klicke dann setze ich die länge von xCeckbox fest, und beim zweiten klicken dann verändert sich die länge des arrays xCheckbox, da die länge von xSpaceConvertedValue.size() sich ändert. 

Also ich muss versuchen die länge von xCheckbox wieder zurück setzte.  Wisst du vllt eine Lösung ???


Gruß


----------

