Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar??

Onliner

Mitglied
Hallo zusammen,

ich habe lange gesucht im Internet und nichts passendes gefunden. Das Problem löst auch kein Problem / fehler aus. Und wenn ich die Maus in Ruhe lasse funktioniert auch alles wie ich es will.

ich will eine Art Menuführung machen in dem ich auf der linken seite Buttons habe und wenn ich diese anklicke auf der Rechten Seite (mittelBereich) kommen dann weitere Buttons. Wenn ich auf die linken Buttons drücke kommen auch die richtigen Buttons. Beim 1. Mal alles ok. Wenn ich nun das 2. mal den anderen linken Button drücke kommen auch die dafür vorgesehene Buttons nur wenn ich mit der Maus in über die rechten Buttons gehe erscheinen auch die vorherigen Buttons.

Ich habe revalidate() kombiniert mit repaint(). ich hatte auch schon invalidate und validate getrennt. Ich komme seit 6 Stunden einfach nicht weiter.

Ich vermute ist ein typische Anfängerfehler aber ich komme nicht darauf!

Ich hoffe ihr HILFT mir. ;(

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class spielerei 
extends JFrame
implements ActionListener
{
	private static final long serialVersionUID = 1L;
	Container cp;
	JPanel part1, part2, part3;
	JButton reihe1, reihe2, reihe3, reihe4, reihe5, reihe6, reihe7;
	
	public spielerei()
	{
		super("spielen");
		addWindowListener(new WindowsClosingAdapter(true));
		setLocation(100,100);
		setSize(1000,800);
		
		this.cp = getContentPane();
		this.cp.setLayout(new BorderLayout());
		
		this.part1 = new JPanel();
		this.reihe1 = new JButton("Lokale Spiele");
		this.reihe1.addActionListener(this);
		this.reihe2 = new JButton("Online Spiele");
		this.reihe2.addActionListener(this);
		this.part1.add(this.reihe1);
		this.part1.add(this.reihe2);
		
		cp.add(part1, BorderLayout.WEST);	
	}
	
	public void actionPerformed(ActionEvent event)
	{
		String cmd = event.getActionCommand();
		if (cmd.equals("Lokale Spiele")){
			this.part2 = new JPanel();
			this.reihe3 = new JButton("Spiel 501");
			this.reihe4 = new JButton("Spiel 701");
			this.part2.add(this.reihe3);
			this.part2.add(this.reihe4);
			this.cp.add(this.part2, BorderLayout.CENTER);
			this.part2.revalidate();
			this.part2.repaint();
		}
		if (cmd.equals("Online Spiele")){
			this.part3 = new JPanel();
			this.reihe5 = new JButton("Online 501");
			this.reihe6 = new JButton("Online 701");
			this.reihe7 = new JButton("Online 901");
			this.part3.add(this.reihe5);
			this.part3.add(this.reihe6);
			this.part3.add(this.reihe7);
			this.cp.add(this.part3, BorderLayout.CENTER);
			this.part3.revalidate();
			this.part3.repaint();
		}
		
	}
	public static void main(String[] args) {
		spielerei neu = new spielerei();
		neu.setVisible(true);
	}
}

Vielen Dank schon mal im Voraus
 
Vielleicht solltest du die Button auch wieder löschen, bevor du neue anzeigst...

removeAll();
oder
remove(....);

Oder die Panels nur mit setVisible nur ein- und ausblenden..
 
also wenn ich nun nach dem validate() eine remoteAll(); einsetze sind die Button wirklich verschwunden das repaint() ist unötig gewesen.

Aber nun habe ich das Problem das wenn ich das remoteAll() einsetze und es aber nichts zu entfernen gibt er eine Ausnahme aus.

Wie kann ich nun prüfen ob überhaupt was in dem JPanel (in meinen Beispiel = panel2 oder panel3) integriert ist.
so nach dem Motto nur wenn vorhanden dann entfernen?
 
Zuletzt bearbeitet:
Hallo

ich habe das Problem selbst gelöst und hier der funktionierende code

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class spielerei 
extends JFrame
implements ActionListener
{
	private static final long serialVersionUID = 1L;
	Container cp;
	JPanel part1;
	JPanel part2 = new JPanel();
	JButton reihe1, reihe2, reihe3, reihe4, reihe5, reihe6, reihe7;
	
	public spielerei()
	{
		super("spielen");
		addWindowListener(new WindowsClosingAdapter(true));
		setLocation(100,100);
		setSize(1000,800);
		
		this.cp = getContentPane();
		this.cp.setLayout(new BorderLayout());
		
		this.part1 = new JPanel();
		this.reihe1 = new JButton("Lokale Spiele");
		this.reihe1.addActionListener(this);
		this.reihe2 = new JButton("Online Spiele");
		this.reihe2.addActionListener(this);
		this.part1.add(this.reihe1);
		this.part1.add(this.reihe2);
		
		cp.add(part1, BorderLayout.WEST);	
	}
	
	public void actionPerformed(ActionEvent event)
	{
		String cmd = event.getActionCommand();
		this.part2.removeAll();
		
		if (cmd.equals("Lokale Spiele")){
			
			this.reihe3 = new JButton("Spiel 501");
			this.reihe4 = new JButton("Spiel 701");
			this.part2.add(this.reihe3);
			this.part2.add(this.reihe4);
			this.cp.add(this.part2, BorderLayout.CENTER);
			this.part2.revalidate();
			this.part2.repaint();
			
		}
		if (cmd.equals("Online Spiele")){
			
			this.reihe5 = new JButton("Online 501");
			this.reihe6 = new JButton("Online 701");
			this.reihe7 = new JButton("Online 901");
			this.part2.add(this.reihe5);
			this.part2.add(this.reihe6);
			this.part2.add(this.reihe7);
			this.cp.add(this.part2, BorderLayout.CENTER);
			this.part2.revalidate();
			this.part2.repaint();
		}
		
	}
	public static void main(String[] args) {
		spielerei neu = new spielerei();
		neu.setVisible(true);
	}
}

Ich habe die JPanel part2 im ausserhalb deklariert und bei einer Aktion wird der part2 mit removeAll geleert und anschließend nach der jeweiligen Aktion wieder gefüllt und mit revalidate() den Neuaufbau mittgeteilt und repaint() alle vorherigen Spuren verwischt.

Danke dir A0027301.

grüße aus dem Schwarzwald
 
Das ist totaler Mumpitz. Benutz z.B. das CardLayout um zwischen den Ebenen hin und her zu wechseln.

Bei jeder Aktion die alten Komponenten löschen und die Neuen wieder aufbauen ist ineffizient und alles andere als ressourcensparend.
 

Neue Themen


Zurück
Oben