Component von JPanel mit Null Layout auf JPanel mit FlowLayout verschieben

TobyNick

Grünschnabel
Hallo,
ich habe ein Problem. Und zwar habe ich einen JButton in einem JPanel (panel1) mit NullLayout eingebunden. Jetzt geschieht etwas in dem Programm und dann soll der Button dort gelöscht werden (panel1.remove()) und in ein anderes JPanel (panel2) mit FlowLayout eingebunden werden (panel2.add()). Komischerweise wird der Button in panel2 an genau den gleichen Koordinaten eingebunden wie beim NullLayout und das FlowLayout wird irgendwie nicht benutzt. Woran kann das liegen? Wenn ich nach dem adden revalidate() oder doLayout() ausführe verschwindet der Button einfach ganz.

Danke schon mal!
 
Das liegt daran das du für das NullLayout die Methode JComponent.setBounds() aufgerufen hast. Du musst erst die Bounds löschen bevor das FlowLayout greifen kann.
 
Ok stimmt, ich habe den Button mit setSize() und setLocation() verändert. Aber wie lösche ich die Bounds jetzt zurück? setBounds(0,0,0,0) funktioniert nicht.
 
1) Doppel-Posts , im Sinne von : gleicher Inhalt , sind hier unerwünscht.
2) Warum machst du es dir so umständlich und fügst erst eine Component auf ein NullLayout hinzu wo du auf setBounds() angewiesen bist und willst diese dann später auf ein Panel verschieben welches ein LayoutManager besitzt und dir da die Bounds in die Query kommen. Einfacher wäre es doch wenn du das ganze entweder komplett auf einem Panel machen würdest *hier natürlich vorzugsweise das mit dem LayoutManager* oder du nimmst eine zweite Component.

Wie man über setBounds() gemachte absolute Positions- und Größenangaben wieder "löscht" weis ich nicht ... ich bin nur davon ausgegangen das es möglich sein müsste.
 
Nun ja. Ich habe in dem Programm Würfel als Buttons (damit man sie anklicken kann) auf dem ersten Panel zufällig angeordnet. Jetzt kann man Würfel auswählen. Wenn man sie auswählt, sollen sie in dem einen Panel gelöscht werden und in ein anderes Panel eingefügt werden, allerdings sollen die in dem Panel geordnet sein.
So als ob die Würfel in so einem Bereich gewürfelt worden sind (durcheinander / zufällige Anordnung) und man sich dann die Würfel rauspickt und sie vor sich legt, aber das macht man ja ordentlich / in einer Reihe...deswegen FlowLayout.
 
Hi,
warum machst du es dann nicht so, da ein Würfel ein Objekt ist, dass du dieses Objekt einfach von dem einen Panel löst und in ein anderes setzt? Diese Würfel-Objekte werden dann (wie du es auch schon gemacht hast) über ein JPanel angezeigt. Und wenn du auf einen Würfel geklickt hast, dann wird das JPanel von dem Würfel-Objekt gelöscht und du zeigst das Würfel-Objekt auf der anderen Seite in einem neuen JPanel an.

Gruß

Fabio
 
Ich weiß nicht ob ich dich richtig verstehe, aber so mache ich das doch eigentlich. Ich lösche den Würfel von dem einen Panel mit NullLayout: panel1.remove(wuerfel); und füge es ins andere Panel mit FlowLayout ein: panel2.add(wuerfel);
Oder wie meinst du das? Entschuldige, falls ich dich falsch verstanden habe.
 
Normalerweise sollte wenn du eine Component in einen Container mit LayoutManager addest von diesem die setBounds() Methode aufgerufen werden welche die von dir vorher gemacht Bounds überschreibt. Ich habe es zwar noch nicht getestet ... aber laut dem OOP-Konzept von Java und den Zusammenhängen in GUI-Strukturen sollte es eigentlich so sein. Aus irgend einem Grund wird jetzt aber genau das bei dir nicht getan.
Es wäre interessant zu sehen WIE du den "Würfel" von Panel1 auf Panel2 überträgst *bitte den kompletten relevanten Code*. Vielleicht findet man darin ja einen Fehler. So ohne Source fällt mir jetzt auch keine Lösung mehr ein.
 
Ok dann poste ich mal den Code ;-)

Code:
//Im ActionListener der Würfel-Buttons

//...

public void actionPerformed(ActionEvent e) {
		Wuerfel ausgewaehlt = (Wuerfel) e.getSource();
		
		panel1.entferneWuerfel(ausgewaehlt); //panel1 ist ein Objekt einer Klasse die von JPanel erbt, dass heißt es ist auch direkt das Panel, aus dem entfernt werden soll
		player.addWuerfel(ausgewaehlt); // player ist Spieler-Objekt
	}


//Die Klasse von panel1, wo die Wuerfel anfangs drin sind (mit NullLayout)

public class Wuerfelpott extends JPanel {

ArrayList<Wuerfel> wuerfel;

//...

public void entferneWuerfel(Wuerfel w) {
		wuerfel.remove(w);
		this.remove(w);
		this.repaint();
	}

}

public class Spieler {

ArrayList<Wuerfel> wuerfel;
Ablage ablage; // Ablage erbt von JPanel und hat das FlowLayout, ablage ist halt das 2. Panel

public void addWuerfel(Wuerfel w) {
		wuerfel.add(w);		
		ablage.add(w);
	}
}

Also alles nichts besonderes
 
Ja ... nicht besonderst gut vor allem. Mir fallen da selbst in diesem Stück Code einige Fehler auf.

1) Nach dem der Würfel vom Würfelpott entfernt wurde reicht ein einfaches
Java:
this.repaint();
nicht. Ersetze es mal durch
Java:
this.validate();
this.update(this.getGraphics());

2) Analog gilt es natürlich auch für das Hinzufügen einer Component in ein Layout. Wenn du ein Layout veränderst MUSS IMMER validate() aufgerufen werden. also müsste die ganze Methode so aussehen
Java:
public void addWuerfel(Wuerfel w)
{
	wuefel.add(w);
	ablage.add(w);
	ablage.validate();
	ablage.update(ablage.getGraphics());
}

Ich hoffe das hilft dir bei deinem Problem.

Der Grund : Component.setBounds() wird erst durch das validate() aufgerufen , aber ein simples add() reicht nicht.
 
Zurück