Swing Im JPanel wird nur TextArea gelöscht

thobren

Mitglied
Mein Status Anfänger!
In meinem Code erzeuge ich mindesten zwei JPanel mit einem TextArea, JLabel und einer Checkbox.
Per Button kann ich dann weitere JPanels hinzufügen, die dann unterhalb angezeigt werden.
Klappt soweit.
Wenn ich aber dann das letzte neu erzeugte JPanel löschen will, dann wird nur das TextArea gelöscht.
Alles andere bleibt.
Ich finde einfach den Fehler nicht.
Hier der Code:
Java:
public class EingabeAntworten {

	Integer counter = 0;

	public static void main(String[] args) {

		EingabeAntworten ea = new EingabeAntworten();
		ea.aufruf();
	}

	public void aufruf() {

		int x = 0, y = 0;
		final int width = 600, height = 500;

		Toolkit t = Toolkit.getDefaultToolkit();
		Dimension d = t.getScreenSize();
		x = (int) ((d.getWidth() - width) / 2);
		y = (int) ((d.getHeight() - height) / 2);

		final JFrame mainFenster = new JFrame("Antworten eingeben");
		mainFenster.setBounds(x, y, width, height);
		mainFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final Panel panelAntworten = new Panel();

		panelAntworten
				.setLayout(new BoxLayout(panelAntworten, BoxLayout.Y_AXIS));

		panelAntworten.add(zeileAntwortPanel());
		panelAntworten.add(zeileAntwortPanel());

		JButton btAnwortZufuegen = new JButton("Antwort hinzufügen");
		JButton btAnwortLoeschen = new JButton("Antwort löschen");

		JPanel panelButton = new JPanel();
		panelButton.setLayout(new FlowLayout());

		panelButton.add(btAnwortZufuegen);
		panelButton.add(btAnwortLoeschen);

		final JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());

		mainPanel.add(panelAntworten, BorderLayout.CENTER);

		mainPanel.add(panelButton, BorderLayout.SOUTH);

		mainFenster.add(mainPanel);
		mainFenster.setVisible(true);

		btAnwortLoeschen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(final ActionEvent e) {

				if (counter > 2) {

					panelAntworten.remove(panelAntworten
							.getComponent(panelAntworten.getComponentCount() - 1));

					
					// panelAntworten.remove(panelAntworten.getComponent(2));

					counter--;
					mainFenster.validate();
					
					
				}
			}
		});

		btAnwortZufuegen.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(final ActionEvent e) {
				panelAntworten.add(zeileAntwortPanel());
				mainFenster.validate();
			}
		});

	}

	
	public JPanel zeileAntwortPanel() {

		counter++;

		JLabel zaehlerLabel = new JLabel(counter + ".)");

		TextArea antwort = new TextArea();
		antwort.setPreferredSize(new Dimension(500, 36));
		antwort.setMaximumSize(new Dimension(500, 36));

		JCheckBox checkBoxAntwort = new JCheckBox();

		JPanel antwortZeilePanel = new JPanel();
		antwortZeilePanel.add(zaehlerLabel);
		antwortZeilePanel.add(antwort);
		antwortZeilePanel.add(checkBoxAntwort);

		antwortZeilePanel
				.setBorder(BorderFactory.createLineBorder(Color.black));

		antwortZeilePanel.setPreferredSize(new Dimension(595, 50));
		antwortZeilePanel.setMaximumSize(new Dimension(595, 50));

		return antwortZeilePanel;


	}

}
Ich brauche eure Hilfe! Danke!
 
Zuletzt bearbeitet von einem Moderator:
Bitte Java-tags verwenden
Java:

wenn du drei componenten hinzufügst musst du auch 3 componenten wieder entfernen nicht nur eine^^
 
Beim nächsten Mal den Code mit [TAGS] .Versprochen!

Danke für Die Antwort, aber ich komme damit noch nicht so klar.
Wie komme ich hier an die anderen componenten zum Löschen ran?
Ich dachte wenn ich ein JPanel lösche , das mehrere componenten enthält, auch diese componenten mit gelöscht werden.
 
die objecte sind noch da, weil du nur referenzen an das panel übergeben hast.

du löscht in
panelAntworten.remove(panelAntworten
.getComponent(panelAntworten.getComponentCount() - 1));
nur eine componente von dem Panel.

mittels einer for-schleife kannst du sagen
int components =panelAntworten.getComponentCount()
for( int i =components; i >=0; i--){
panelAntworten.remove( panelAntworten.getComponent( i));
}
 
Hallo Strußi

Das wirft eine Exception.
mit "int components =panelAntworten.getComponentCount()-1" kommt zwar keine Exception, aber das Ziel ist nicht erreicht.
Es löscht alle TextAreas, der Rest bleibt.

Ich will das letzte komplette durch den Button hinzugefügte Panel "antwortZeilePanel" löschen.
 
also, ich hab deine buttons modifiziert, jetzt werden die neuen Panels entfernt, aber leider stimmt die zählung nicht mehr

Java:
public class EingabeAntworten {
    Integer counter = 0;
    ArrayList<JPanel> antwortPanels =new ArrayList<>();
...
       btAnwortLoeschen.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed( final ActionEvent e) {
                if ( counter > 2) {
    System.out.println( antwortPanels.get(antwortPanels.size()-1).hashCode());
    panelAntworten.remove(antwortPanels.size()-1);
    antwortPanels.remove( antwortPanels.size()-1);
//                    
                    
//                    panelAntworten.remove(panelAntworten
//                    .getComponent(panelAntworten.getComponentCount() - 1));
                // panelAntworten.remove(panelAntworten.getComponent(2));
                counter--;
                mainFenster.validate();
                }
            }
        });

        btAnwortZufuegen.addActionListener( new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent e){
JPanel neueZeile =zeileAntwortPanel();
System.out.println( neueZeile.hashCode());
antwortPanels.add( neueZeile);
panelAntworten.add( neueZeile);
                mainFenster.validate();
            }
        });
    }
 
Hallo Strußi

Das sieht schon gut aus.

Etwas ähnliches hab ich auch schon gehabt.
Das Problem ist, dass dann immer der erste Eintrag der Antworten gelöscht wird
und nicht der letzte.

Ich habe schon so viel ausprobiert und komme nicht dahinter.
Es muß doch möglich sein das letzte hinzugefügte JPanel in einem JPanel zu identifizieren und diesen zu löschen.
 
Hallo Strußi

Irgendwie funktioniert das nicht. Ich habe zwei Antorten hinzugefügt und somit 4 Antworten insgesamt.
Jetzt schreibe ich in die erste Antwort "aaa", in die zweite "bbb", in die dritt "ccc" und in die vierte "ddd".
Dann klicke ich auf den Button löschen und es wird die zweite Anwort mit "bbb "gelöscht und nicht die letzte,
auch wenn der HashCode was anderes anzeigt.

Anhang anzeigen 7834

Vielleicht hast Du noch eine Idee
 
So funktioniert es, aber ich bekomme es nicht hin, dass die Antworten direkt untereinander liegen.

Java:
public class EingabeAntworten {

	Integer counter = 0;
	List<JPanel> listJPanel = new ArrayList<>();

	
	public static void main(String[] args) {

		EingabeAntworten ea = new EingabeAntworten();
		ea.aufruf();
	}

	public void aufruf() {

		int x = 0, y = 0;
		final int width = 600, height = 500;

		Toolkit t = Toolkit.getDefaultToolkit();
		Dimension d = t.getScreenSize();
		x = (int) ((d.getWidth() - width) / 2);
		y = (int) ((d.getHeight() - height) / 2);

		final JFrame mainFenster = new JFrame("Antworten eingeben");
		mainFenster.setBounds(x, y, width, height);
		mainFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final Panel panelAntworten = new Panel();

		panelAntworten
		.setLayout(new BoxLayout(panelAntworten, BoxLayout.Y_AXIS));

//		panelAntworten.setLayout(new GridBagLayout());
		
	//	panelAntworten.setLayout(new FlowLayout(FlowLayout.LEADING));
		
		
		panelAntworten.add(zeileAntwortPanel());
		panelAntworten.add(zeileAntwortPanel());
		
		JButton btAnwortZufuegen = new JButton("Antwort hinzufügen");
		JButton btAnwortLoeschen = new JButton("Antwort löschen");

		JPanel panelButton = new JPanel();
		panelButton.setLayout(new FlowLayout());

		panelButton.add(btAnwortZufuegen);
		panelButton.add(btAnwortLoeschen);

		final JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());

		mainPanel.add(panelAntworten, BorderLayout.CENTER);

		mainPanel.add(panelButton, BorderLayout.SOUTH);

		mainFenster.add(mainPanel);
		mainFenster.setVisible(true);

		btAnwortLoeschen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(final ActionEvent e) {

				if (counter > 2) {
					
					
					panelAntworten.remove(panelAntworten
							.getComponent(panelAntworten.getComponentCount()-1));

//					panelAntworten.remove(panelAntworten.getComponent(2));
					
					counter--;

					mainFenster.validate();
				}
			}
		});

		btAnwortZufuegen.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(final ActionEvent e) {
				panelAntworten.add(zeileAntwortPanel());
				mainFenster.validate();
			}
		});

	}

	public JPanel zeileAntwortPanel() {

		counter++;

		JLabel zaehlerLabel = new JLabel(counter + ".)");

		TextArea antwort = new TextArea();
		antwort.setPreferredSize(new Dimension(500, 36));
		antwort.setMaximumSize(new Dimension(500, 36));

		JCheckBox checkBoxAntwort = new JCheckBox();

		JPanel antwortZeilePanel = new JPanel();
		antwortZeilePanel.setLayout(new FlowLayout());
		antwortZeilePanel.add(zaehlerLabel);
		antwortZeilePanel.add(antwort);
		antwortZeilePanel.add(checkBoxAntwort);

		antwortZeilePanel
				.setBorder(BorderFactory.createLineBorder(Color.black));

		antwortZeilePanel.setPreferredSize(new Dimension(595, 50));
		antwortZeilePanel.setMaximumSize(new Dimension(595, 50));
		
		JPanel a = new JPanel();
		a.setAlignmentY(Component.TOP_ALIGNMENT);
		a.add(antwortZeilePanel);
	
		
//		return antwortZeilePanel;
		return a;

	}

}
 
Sobald ich statt dem BoxLayout das FlowLayout nehme funktionierte es nicht mehr.

Vieleicht hat jemand noch eine Idee, die weiter helfen würde.
 
Ich glaub ich habe jetzt die Lösung gefunden:


Java:
public class EingabeAntworten {

	Integer counter = 0;
	List<JPanel> listJPanel = new ArrayList<>();

	public static void main(String[] args) {

		EingabeAntworten ea = new EingabeAntworten();
		ea.aufruf();
	}

	public void aufruf() {

		int x = 0, y = 0;
		final int width = 600, height = 500;

		Toolkit t = Toolkit.getDefaultToolkit();
		Dimension d = t.getScreenSize();
		x = (int) ((d.getWidth() - width) / 2);
		y = (int) ((d.getHeight() - height) / 2);

		final JFrame mainFenster = new JFrame("Antworten eingeben");
		mainFenster.setBounds(x, y, width, height);
		mainFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final Panel panelAntworten = new Panel();
		Panel panelAlleAntworten = new Panel();

		panelAntworten
				.setLayout(new BoxLayout(panelAntworten, BoxLayout.Y_AXIS));

		panelAlleAntworten.setLayout(new FlowLayout(FlowLayout.LEADING));
		panelAlleAntworten.add(panelAntworten);

		panelAntworten.add(zeileAntwortPanel());
		panelAntworten.add(zeileAntwortPanel());

		JButton btAnwortZufuegen = new JButton("Antwort hinzufügen");
		JButton btAnwortLoeschen = new JButton("Antwort löschen");

		JPanel panelButton = new JPanel();
		panelButton.setLayout(new FlowLayout());

		panelButton.add(btAnwortZufuegen);
		panelButton.add(btAnwortLoeschen);

		final JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());

		mainPanel.add(panelAlleAntworten, BorderLayout.CENTER);

		mainPanel.add(panelButton, BorderLayout.SOUTH);

		mainFenster.add(mainPanel);
		mainFenster.setVisible(true);

		btAnwortLoeschen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(final ActionEvent e) {

				if (counter > 2) {

					panelAntworten.remove(panelAntworten
							.getComponent(panelAntworten.getComponentCount() - 1));

					counter--;

					mainFenster.validate();
				}
			}
		});

		btAnwortZufuegen.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(final ActionEvent e) {
				if (counter < 7) {
					panelAntworten.add(zeileAntwortPanel());
					mainFenster.validate();
				}
			}
		});

	}

	public JPanel zeileAntwortPanel() {

		counter++;

		JLabel zaehlerLabel = new JLabel(counter + ".)");

		TextArea antwort = new TextArea();
		antwort.setPreferredSize(new Dimension(500, 36));
		antwort.setMaximumSize(new Dimension(500, 36));

		JCheckBox checkBoxAntwort = new JCheckBox();

		JPanel antwortZeilePanel = new JPanel();
		antwortZeilePanel.setLayout(new FlowLayout());
		antwortZeilePanel.add(zaehlerLabel);
		antwortZeilePanel.add(antwort);
		antwortZeilePanel.add(checkBoxAntwort);

		antwortZeilePanel
				.setBorder(BorderFactory.createLineBorder(Color.black));

		antwortZeilePanel.setPreferredSize(new Dimension(595, 50));
		antwortZeilePanel.setMaximumSize(new Dimension(595, 50));

		JPanel a = new JPanel();
		a.setAlignmentY(Component.TOP_ALIGNMENT);
		a.add(antwortZeilePanel);

		return a;

	}

}
 
@thobren habs mal ausprobiert, wenn ich drei weitere Felder hinzufüge, und wieder entferne steht bei mir nacher 4.) 5.) als nummerierung da :-(

es entfernt zwar die richtigen panels aber zerstört die nummerierung
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben